diff options
author | Wayne Davison <wayne@opencoder.net> | 2020-07-12 21:51:51 -0700 |
---|---|---|
committer | Wayne Davison <wayne@opencoder.net> | 2020-07-12 22:45:01 -0700 |
commit | 91fff802b9513cf0ed616d3aea170d561f899fae (patch) | |
tree | a2ff6ab53afd4a6a3dee6fd28a4939e1a2cdcf04 /xattrs.c | |
parent | 3c8ac20d63937e73aa8084679344c39916a93813 (diff) | |
download | rsync-91fff802b9513cf0ed616d3aea170d561f899fae.tar.gz |
Check for overflow the right way.
Diffstat (limited to 'xattrs.c')
-rw-r--r-- | xattrs.c | 7 |
1 files changed, 3 insertions, 4 deletions
@@ -199,7 +199,7 @@ static char *get_xattr_data(const char *fname, const char *name, size_t *len_ptr if (!datum_len && !extra_len) extra_len = 1; /* request non-zero amount of memory */ - if (datum_len + extra_len < datum_len) + if (SIZE_MAX - datum_len < extra_len) overflow_exit("get_xattr_data"); ptr = new_array(char, datum_len + extra_len); @@ -748,7 +748,7 @@ int recv_xattr_request(struct file_struct *file, int f_in) old_datum = rxa->datum; rxa->datum_len = read_varint(f_in); - if (rxa->name_len + rxa->datum_len < rxa->name_len) + if (SIZE_MAX - rxa->name_len < rxa->datum_len) overflow_exit("recv_xattr_request"); rxa->datum = new_array(char, rxa->datum_len + rxa->name_len); name = rxa->datum + rxa->datum_len; @@ -799,8 +799,7 @@ void receive_xattr(int f, struct file_struct *file) size_t datum_len = read_varint(f); size_t dget_len = datum_len > MAX_FULL_DATUM ? 1 + MAX_DIGEST_LEN : datum_len; size_t extra_len = MIGHT_NEED_RPRE ? RPRE_LEN : 0; - if ((dget_len + extra_len < dget_len) - || (dget_len + extra_len + name_len < dget_len + extra_len)) + if (SIZE_MAX - dget_len < extra_len || SIZE_MAX - dget_len - extra_len < name_len) overflow_exit("receive_xattr"); ptr = new_array(char, dget_len + extra_len + name_len); name = ptr + dget_len + extra_len; |