X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/d724dd186ed6a2d66fa13a9357ce91e459d39e8c..774d1c367bbde80c2d9ce8875048860c8c0b5272:/xattrs.c diff --git a/xattrs.c b/xattrs.c index 53363bde..552a63b3 100644 --- a/xattrs.c +++ b/xattrs.c @@ -178,8 +178,9 @@ 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 /* checks for overflow */ - || !(ptr = new_array(char, datum_len + extra_len))) + if (datum_len + extra_len < datum_len) + overflow_exit("get_xattr_data"); + if (!(ptr = new_array(char, datum_len + extra_len))) out_of_memory("get_xattr_data"); if (datum_len) { @@ -350,15 +351,14 @@ int send_xattr(stat_x *sxp, int f) int count = sxp->xattr->count; write_varint(f, count); for (rxa = sxp->xattr->items; count--; rxa++) { - int name_len = rxa->name_len; + size_t name_len = rxa->name_len; const char *name = rxa->name; /* Strip the rsync prefix from disguised namespaces. */ - if ( + if (name_len > RPRE_LEN #ifdef HAVE_LINUX_XATTRS - am_root < 0 + && am_root < 0 #endif - && name_len > RPRE_LEN && name[RPRE_LEN] != '%' - && HAS_PREFIX(name, RSYNC_PREFIX)) { + && name[RPRE_LEN] != '%' && HAS_PREFIX(name, RSYNC_PREFIX)) { name += RPRE_LEN; name_len -= RPRE_LEN; } @@ -558,7 +558,7 @@ int recv_xattr_request(struct file_struct *file, int f_in) rxa->datum_len = read_varint(f_in); if (rxa->name_len + rxa->datum_len < rxa->name_len) - out_of_memory("recv_xattr_request"); /* overflow */ + overflow_exit("recv_xattr_request"); rxa->datum = new_array(char, rxa->datum_len + rxa->name_len); if (!rxa->datum) out_of_memory("recv_xattr_request"); @@ -610,10 +610,9 @@ void receive_xattr(struct file_struct *file, int f) 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) - out_of_memory("receive_xattr"); /* overflow */ - if (dget_len + extra_len + name_len < dget_len) - out_of_memory("receive_xattr"); /* overflow */ + if ((dget_len + extra_len < dget_len) + || (dget_len + extra_len + name_len < dget_len)) + overflow_exit("receive_xattr"); ptr = new_array(char, dget_len + extra_len + name_len); if (!ptr) out_of_memory("receive_xattr"); @@ -699,7 +698,8 @@ static int rsync_xal_set(const char *fname, item_list *xalp, ssize_t list_len; size_t i, len; char *name, *ptr, sum[MAX_DIGEST_LEN]; - int name_len, ret = 0; + size_t name_len; + int ret = 0; /* This puts the current name list into the "namebuf" buffer. */ if ((list_len = get_xattr_names(fname)) < 0)