diff --git a/src/backend/utils/adt/encode.c b/src/backend/utils/adt/encode.c index 9ea3ddb49ec..b9d4f2811d7 100644 --- a/src/backend/utils/adt/encode.c +++ b/src/backend/utils/adt/encode.c @@ -583,12 +583,12 @@ pg_base64_decode_internal(const char *src, size_t len, char *dst, bool url) } } - if (pos == 2) + if (url && pos == 2) { buf <<= 12; *p++ = (buf >> 16) & 0xFF; } - else if (pos == 3) + else if (url && pos == 3) { buf <<= 6; *p++ = (buf >> 16) & 0xFF; diff --git a/src/test/regress/expected/strings.out b/src/test/regress/expected/strings.out index a49b75fa1f9..313c5039465 100644 --- a/src/test/regress/expected/strings.out +++ b/src/test/regress/expected/strings.out @@ -2810,6 +2810,10 @@ SELECT decode('AQ', 'base64url'); -- \x01 \x01 (1 row) +-- Make sure the same 1 byte input isn't accepted as base64 +SELECT decode('AQ', 'base64'); -- \x01 +ERROR: invalid base64 end sequence +HINT: Input data is missing padding, is truncated, or is otherwise corrupted. -- 2 byte input SELECT encode('\x0102'::bytea, 'base64url'); -- AQI encode diff --git a/src/test/regress/sql/strings.sql b/src/test/regress/sql/strings.sql index 5ae0e7da31a..38946e8954d 100644 --- a/src/test/regress/sql/strings.sql +++ b/src/test/regress/sql/strings.sql @@ -909,6 +909,9 @@ SELECT decode('', 'base64url'); -- '' SELECT encode('\x01', 'base64url'); -- AQ SELECT decode('AQ', 'base64url'); -- \x01 +-- Make sure the same 1 byte input isn't accepted as base64 +SELECT decode('AQ', 'base64'); -- \x01 + -- 2 byte input SELECT encode('\x0102'::bytea, 'base64url'); -- AQI SELECT decode('AQI', 'base64url'); -- \x0102