diff options
author | Yann Ylavic <ylavic@apache.org> | 2020-11-27 20:46:43 +0000 |
---|---|---|
committer | Yann Ylavic <ylavic@apache.org> | 2020-11-27 20:46:43 +0000 |
commit | 1c4931097d53c5056e4010ec4e5d0f3bf34d06e5 (patch) | |
tree | ccc90715080cf78112cdbc193ff8b86eea9279b9 | |
parent | 31cf18582df6c467e12d59bf3850427a7f6a5a30 (diff) | |
download | apr-1c4931097d53c5056e4010ec4e5d0f3bf34d06e5.tar.gz |
Merge r1883870 from trunk:
apr_decode_base{64,32,16}: stop reading before (not including) NUL byte.
git-svn-id: https://svn.apache.org/repos/asf/apr/apr/branches/1.7.x@1883880 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r-- | encoding/apr_encode.c | 60 | ||||
-rw-r--r-- | test/testencode.c | 24 |
2 files changed, 59 insertions, 25 deletions
diff --git a/encoding/apr_encode.c b/encoding/apr_encode.c index b3278c7fd..bc2dc5437 100644 --- a/encoding/apr_encode.c +++ b/encoding/apr_encode.c @@ -394,11 +394,15 @@ APR_DECLARE(apr_status_t) apr_decode_base64(char *dest, const char *src, apr_status_t status; bufin = (const unsigned char *)src; - while (pr2six[*(bufin++)] < 64 && count) + while (count && pr2six[*bufin] < 64) { count--; - nprbytes = (bufin - (const unsigned char *)src) - 1; - while (pr2six[*(bufin++)] > 64 && count) + bufin++; + } + nprbytes = bufin - (const unsigned char *)src; + while (count && pr2six[*bufin] > 64) { count--; + bufin++; + } status = flags & APR_ENCODE_RELAXED ? APR_SUCCESS : count ? APR_BADCH : APR_SUCCESS; @@ -469,11 +473,15 @@ APR_DECLARE(apr_status_t) apr_decode_base64_binary(unsigned char *dest, apr_status_t status; bufin = (const unsigned char *)src; - while (pr2six[*(bufin++)] < 64 && count) + while (count && pr2six[*bufin] < 64) { count--; - nprbytes = (bufin - (const unsigned char *)src) - 1; - while (pr2six[*(bufin++)] > 64 && count) + bufin++; + } + nprbytes = bufin - (const unsigned char *)src; + while (count && pr2six[*bufin] > 64) { count--; + bufin++; + } status = flags & APR_ENCODE_RELAXED ? APR_SUCCESS : count ? APR_BADCH : APR_SUCCESS; @@ -842,11 +850,15 @@ APR_DECLARE(apr_status_t) apr_decode_base32(char *dest, const char *src, } bufin = (const unsigned char *)src; - while (pr2[*(bufin++)] < 32 && count) + while (count && pr2[*bufin] < 32) { count--; - nprbytes = (bufin - (const unsigned char *)src) - 1; - while (pr2[*(bufin++)] > 32 && count) + bufin++; + } + nprbytes = bufin - (const unsigned char *)src; + while (count && pr2[*bufin] > 32) { count--; + bufin++; + } status = flags & APR_ENCODE_RELAXED ? APR_SUCCESS : count ? APR_BADCH : APR_SUCCESS; @@ -945,11 +957,15 @@ APR_DECLARE(apr_status_t) apr_decode_base32_binary(unsigned char *dest, } bufin = (const unsigned char *)src; - while (pr2[*(bufin++)] < 32 && count) + while (count && pr2[*bufin] < 32) { count--; - nprbytes = (bufin - (const unsigned char *)src) - 1; - while (pr2[*(bufin++)] > 32 && count) + bufin++; + } + nprbytes = bufin - (const unsigned char *)src; + while (count && pr2[*bufin] > 32) { count--; + bufin++; + } status = flags & APR_ENCODE_RELAXED ? APR_SUCCESS : count ? APR_BADCH : APR_SUCCESS; @@ -1220,11 +1236,15 @@ APR_DECLARE(apr_status_t) apr_decode_base16(char *dest, count = slen; bufin = (const unsigned char *)src; - while (pr2two[*(bufin++)] != 16 && count) + while (count && pr2two[*bufin] != 16) { count--; - nprbytes = (bufin - (const unsigned char *)src) - 1; - while (pr2two[*(bufin++)] > 16 && count) + bufin++; + } + nprbytes = bufin - (const unsigned char *)src; + while (count && pr2two[*bufin] > 16) { count--; + bufin++; + } status = flags & APR_ENCODE_RELAXED ? APR_SUCCESS : count ? APR_BADCH : APR_SUCCESS; @@ -1310,11 +1330,15 @@ APR_DECLARE(apr_status_t) apr_decode_base16_binary(unsigned char *dest, count = slen; bufin = (const unsigned char *)src; - while (pr2two[*(bufin++)] != 16 && count) + while (count && pr2two[*bufin] != 16) { count--; - nprbytes = (bufin - (const unsigned char *)src) - 1; - while (pr2two[*(bufin++)] > 16 && count) + bufin++; + } + nprbytes = bufin - (const unsigned char *)src; + while (count && pr2two[*bufin] > 16) { count--; + bufin++; + } status = flags & APR_ENCODE_RELAXED ? APR_SUCCESS : count ? APR_BADCH : APR_SUCCESS; diff --git a/test/testencode.c b/test/testencode.c index 3680fa380..ba23aaf28 100644 --- a/test/testencode.c +++ b/test/testencode.c @@ -134,37 +134,42 @@ static void test_decode_base64(abts_case * tc, void *data) src = ""; target = ""; dest = apr_pdecode_base64(pool, src, APR_ENCODE_STRING, APR_ENCODE_NONE, &len); - ABTS_STR_EQUAL(tc, dest, target); + ABTS_STR_EQUAL(tc, target, dest); src = "Zg=="; target = "f"; dest = apr_pdecode_base64(pool, src, APR_ENCODE_STRING, APR_ENCODE_NONE, &len); - ABTS_STR_EQUAL(tc, dest, target); + ABTS_STR_EQUAL(tc, target, dest); + + src = "Zg="; + target = "f"; + dest = apr_pdecode_base64(pool, src, APR_ENCODE_STRING, APR_ENCODE_NONE, &len); + ABTS_STR_EQUAL(tc, target, dest); src = "Zg"; target = "f"; dest = apr_pdecode_base64(pool, src, APR_ENCODE_STRING, APR_ENCODE_NONE, &len); - ABTS_STR_EQUAL(tc, dest, target); + ABTS_STR_EQUAL(tc, target, dest); src = "Zm8="; target = "fo"; dest = apr_pdecode_base64(pool, src, APR_ENCODE_STRING, APR_ENCODE_NONE, &len); - ABTS_STR_EQUAL(tc, dest, target); + ABTS_STR_EQUAL(tc, target, dest); src = "Zm8"; target = "fo"; dest = apr_pdecode_base64(pool, src, APR_ENCODE_STRING, APR_ENCODE_NONE, &len); - ABTS_STR_EQUAL(tc, dest, target); + ABTS_STR_EQUAL(tc, target, dest); src = "Zm9v"; target = "foo"; dest = apr_pdecode_base64(pool, src, APR_ENCODE_STRING, APR_ENCODE_NONE, &len); - ABTS_STR_EQUAL(tc, dest, target); + ABTS_STR_EQUAL(tc, target, dest); src = "Zm9v"; target = "foo"; dest = apr_pdecode_base64(pool, src, APR_ENCODE_STRING, APR_ENCODE_NONE, &len); - ABTS_STR_EQUAL(tc, dest, target); + ABTS_STR_EQUAL(tc, target, dest); apr_pool_destroy(pool); } @@ -191,6 +196,11 @@ static void test_decode_base64_binary(abts_case * tc, void *data) ABTS_ASSERT(tc, "apr_pdecode_base64_binary target!=dest", memcmp(ufoobar, udest, 1) == 0); ABTS_INT_EQUAL(tc, len, 1); + src = "Zg="; + udest = apr_pdecode_base64_binary(pool, src, APR_ENCODE_STRING, APR_ENCODE_NONE, &len); + ABTS_ASSERT(tc, "apr_pdecode_base64_binary target!=dest", memcmp(ufoobar, udest, 1) == 0); + ABTS_INT_EQUAL(tc, len, 1); + src = "Zg"; udest = apr_pdecode_base64_binary(pool, src, APR_ENCODE_STRING, APR_ENCODE_NONE, &len); ABTS_ASSERT(tc, "apr_pdecode_base64_binary target!=dest", memcmp(ufoobar, udest, 1) == 0); |