diff options
author | NIIBE Yutaka <[email protected]> | 2020-07-16 02:00:45 +0000 |
---|---|---|
committer | NIIBE Yutaka <[email protected]> | 2020-07-16 02:00:45 +0000 |
commit | 8abf065307ff4a7ea873fe59f76173bf17dac241 (patch) | |
tree | 3b6ac9d99ee56a36d56238051e52003dd909cc0f /common/iobuf.c | |
parent | regexp: Import change from JimTcl. (diff) | |
download | gnupg-8abf065307ff4a7ea873fe59f76173bf17dac241.tar.gz gnupg-8abf065307ff4a7ea873fe59f76173bf17dac241.zip |
common: Avoid undefined behavior of left shift operator.
* common/iobuf.c (block_filter): Handle an error earlier.
Make sure it's unsigned.
--
GnuPG-bug-id: 4975
Suggested-by: lutianxiong <[email protected]>
Signed-off-by: NIIBE Yutaka <[email protected]>
Diffstat (limited to 'common/iobuf.c')
-rw-r--r-- | common/iobuf.c | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/common/iobuf.c b/common/iobuf.c index 43f2e101c..a00ee0b37 100644 --- a/common/iobuf.c +++ b/common/iobuf.c @@ -909,16 +909,22 @@ block_filter (void *opaque, int control, iobuf_t chain, byte * buffer, } else if (c == 255) { - a->size = iobuf_get_noeof (chain) << 24; - a->size |= iobuf_get_noeof (chain) << 16; - a->size |= iobuf_get_noeof (chain) << 8; - if ((c = iobuf_get (chain)) == -1) + size_t len = 0; + int i; + + for (i = 0; i < 4; i++) + if ((c = iobuf_get (chain)) == -1) + break; + else + len = ((len << 8) | c); + + if (i < 4) { log_error ("block_filter: invalid 4 byte length\n"); rc = GPG_ERR_BAD_DATA; break; } - a->size |= c; + a->size = len; a->partial = 2; if (!a->size) { |