diff options
author | Tom Lane | 2007-08-23 16:16:27 +0000 |
---|---|---|
committer | Tom Lane | 2007-08-23 16:16:27 +0000 |
commit | 59ecd36f65eca6cb7c0be25bcbe21d3462c74ded (patch) | |
tree | f0f7d21a355763e9189038fdc76d54e3645dad71 | |
parent | dae3448c981a32849f8997b5d18597b860c9e134 (diff) |
Fix combo_decrypt() to throw an error for zero-length input when using a
padded encryption scheme. Formerly it would try to access res[(unsigned) -1],
which resulted in core dumps on 64-bit machines, and was certainly trouble
waiting to happen on 32-bit machines (though in at least the known case
it was harmless because that byte would be overwritten after return).
Per report from Ken Colson; fix by Marko Kreen.
-rw-r--r-- | contrib/pgcrypto/px.c | 13 | ||||
-rw-r--r-- | contrib/pgcrypto/px.h | 1 |
2 files changed, 14 insertions, 0 deletions
diff --git a/contrib/pgcrypto/px.c b/contrib/pgcrypto/px.c index e866959daa..a1930b10c4 100644 --- a/contrib/pgcrypto/px.c +++ b/contrib/pgcrypto/px.c @@ -58,6 +58,7 @@ static const struct error_desc px_err_list[] = { {PXE_BAD_SALT_ROUNDS, "Incorrect number of rounds"}, {PXE_MCRYPT_INTERNAL, "mcrypt internal error"}, {PXE_NO_RANDOM, "No strong random source"}, + {PXE_DECRYPT_FAILED, "Decryption failed"}, {PXE_PGP_CORRUPT_DATA, "Wrong key or corrupt data"}, {PXE_PGP_CORRUPT_ARMOR, "Corrupt ascii-armor"}, {PXE_PGP_UNSUPPORTED_COMPR, "Unsupported compression algorithm"}, @@ -279,6 +280,18 @@ combo_decrypt(PX_Combo * cx, const uint8 *data, unsigned dlen, PX_Cipher *c = cx->cipher; + /* decide whether zero-length input is allowed */ + if (dlen == 0) + { + /* with padding, empty ciphertext is not allowed */ + if (cx->padding) + return PXE_DECRYPT_FAILED; + + /* without padding, report empty result */ + *rlen = 0; + return 0; + } + bs = px_cipher_block_size(c); if (bs > 1 && (dlen % bs) != 0) goto block_error; diff --git a/contrib/pgcrypto/px.h b/contrib/pgcrypto/px.h index cf37408004..d07ac84dfe 100644 --- a/contrib/pgcrypto/px.h +++ b/contrib/pgcrypto/px.h @@ -78,6 +78,7 @@ void px_free(void *p); #define PXE_BAD_SALT_ROUNDS -15 #define PXE_MCRYPT_INTERNAL -16 #define PXE_NO_RANDOM -17 +#define PXE_DECRYPT_FAILED -18 #define PXE_MBUF_SHORT_READ -50 |