0024-rsync-Avoid-pointer-arithmetic-on-void.patch (5203B)
1 From 2dc242877741913abaf8685c616406812d507e17 Mon Sep 17 00:00:00 2001 2 From: Michael Forney <mforney@mforney.org> 3 Date: Sat, 15 Jun 2019 20:06:13 -0700 4 Subject: [PATCH] rsync: Avoid pointer arithmetic on `void *` 5 6 --- 7 usr.bin/rsync/blocks.c | 12 ++++++------ 8 usr.bin/rsync/downloader.c | 2 +- 9 usr.bin/rsync/io.c | 12 ++++++------ 10 usr.bin/rsync/sender.c | 5 +++-- 11 4 files changed, 16 insertions(+), 15 deletions(-) 12 13 diff --git a/usr.bin/rsync/blocks.c b/usr.bin/rsync/blocks.c 14 index d1d9b19c31e..9aca8c217a6 100644 15 --- a/usr.bin/rsync/blocks.c 16 +++ b/usr.bin/rsync/blocks.c 17 @@ -163,7 +163,7 @@ blk_find(struct sess *sess, struct blkstat *st, 18 if (!recomp) { 19 fhash = (st->s1 & 0xFFFF) | (st->s2 << 16); 20 } else { 21 - fhash = hash_fast(st->map + st->offs, (size_t)osz); 22 + fhash = hash_fast((char *)st->map + st->offs, (size_t)osz); 23 st->s1 = fhash & 0xFFFF; 24 st->s2 = fhash >> 16; 25 } 26 @@ -176,7 +176,7 @@ blk_find(struct sess *sess, struct blkstat *st, 27 if (st->hint < blks->blksz && 28 fhash == blks->blks[st->hint].chksum_short && 29 (size_t)osz == blks->blks[st->hint].len) { 30 - hash_slow(st->map + st->offs, (size_t)osz, md, sess); 31 + hash_slow((char *)st->map + st->offs, (size_t)osz, md, sess); 32 have_md = 1; 33 if (memcmp(md, blks->blks[st->hint].chksum_long, blks->csum) == 0) { 34 LOG4("%s: found matching hinted match: " 35 @@ -209,7 +209,7 @@ blk_find(struct sess *sess, struct blkstat *st, 36 (intmax_t)ent->blk->offs, ent->blk->len); 37 38 if (have_md == 0) { 39 - hash_slow(st->map + st->offs, (size_t)osz, md, sess); 40 + hash_slow((char *)st->map + st->offs, (size_t)osz, md, sess); 41 have_md = 1; 42 } 43 44 @@ -227,7 +227,7 @@ blk_find(struct sess *sess, struct blkstat *st, 45 * block in the sequence. 46 */ 47 48 - map = st->map + st->offs; 49 + map = (char *)st->map + st->offs; 50 st->s1 -= map[0]; 51 st->s2 -= osz * map[0]; 52 53 @@ -287,7 +287,7 @@ blk_match(struct sess *sess, const struct blkset *blks, 54 blk->len, blk->idx); 55 tok = -(blk->idx + 1); 56 57 - hash_file_buf(&st->ctx, st->map + last, sz + blk->len); 58 + hash_file_buf(&st->ctx, (char *)st->map + last, sz + blk->len); 59 60 /* 61 * Write the data we have, then follow it with 62 @@ -312,7 +312,7 @@ blk_match(struct sess *sess, const struct blkset *blks, 63 LOG4("%s: flushing %s %jd B", path, 64 last == 0 ? "whole" : "remaining", (intmax_t)sz); 65 66 - hash_file_buf(&st->ctx, st->map + last, sz); 67 + hash_file_buf(&st->ctx, (char *)st->map + last, sz); 68 69 st->total += sz; 70 st->dirty += sz; 71 diff --git a/usr.bin/rsync/downloader.c b/usr.bin/rsync/downloader.c 72 index cab6eb23f9f..07ec334f6b4 100644 73 --- a/usr.bin/rsync/downloader.c 74 +++ b/usr.bin/rsync/downloader.c 75 @@ -495,7 +495,7 @@ again: 76 sz = tok == p->blk.blksz - 1 ? p->blk.rem : p->blk.len; 77 assert(sz); 78 assert(p->map != MAP_FAILED); 79 - buf = p->map + (tok * p->blk.len); 80 + buf = (char *)p->map + (tok * p->blk.len); 81 82 /* 83 * Now we read from our block. 84 diff --git a/usr.bin/rsync/io.c b/usr.bin/rsync/io.c 85 index dc224ae8aed..fcf9e92dbaa 100644 86 --- a/usr.bin/rsync/io.c 87 +++ b/usr.bin/rsync/io.c 88 @@ -117,7 +117,7 @@ io_write_blocking(int fd, const void *buf, size_t sz) 89 ERRX("io_write_nonblocking: short write"); 90 return 0; 91 } 92 - buf += wsz; 93 + buf = (char *)buf + wsz; 94 sz -= wsz; 95 } 96 97 @@ -156,7 +156,7 @@ io_write_buf(struct sess *sess, int fd, const void *buf, size_t sz) 98 } 99 sess->total_write += wsz; 100 sz -= wsz; 101 - buf += wsz; 102 + buf = (char *)buf + wsz; 103 } 104 105 return 1; 106 @@ -250,7 +250,7 @@ io_read_blocking(int fd, void *buf, size_t sz) 107 ERRX("io_read_nonblocking: short read"); 108 return 0; 109 } 110 - buf += rsz; 111 + buf = (char *)buf + rsz; 112 sz -= rsz; 113 } 114 115 @@ -367,7 +367,7 @@ io_read_buf(struct sess *sess, int fd, void *buf, size_t sz) 116 } 117 sz -= rsz; 118 sess->mplex_read_remain -= rsz; 119 - buf += rsz; 120 + buf = (char *)buf + rsz; 121 sess->total_read += rsz; 122 continue; 123 } 124 @@ -463,7 +463,7 @@ io_buffer_buf(void *buf, size_t *bufpos, size_t buflen, const void *val, 125 { 126 127 assert(*bufpos + valsz <= buflen); 128 - memcpy(buf + *bufpos, val, valsz); 129 + memcpy((char *)buf + *bufpos, val, valsz); 130 *bufpos += valsz; 131 } 132 133 @@ -662,7 +662,7 @@ io_unbuffer_buf(const void *buf, size_t *bufpos, size_t bufsz, void *val, 134 { 135 136 assert(*bufpos + valsz <= bufsz); 137 - memcpy(val, buf + *bufpos, valsz); 138 + memcpy(val, (char *)buf + *bufpos, valsz); 139 *bufpos += valsz; 140 } 141 142 diff --git a/usr.bin/rsync/sender.c b/usr.bin/rsync/sender.c 143 index c54fbc2dae0..6469e7f27e5 100644 144 --- a/usr.bin/rsync/sender.c 145 +++ b/usr.bin/rsync/sender.c 146 @@ -128,7 +128,7 @@ send_up_fsm(struct sess *sess, size_t *phase, 147 return 0; 148 } 149 io_lowbuffer_buf(sess, *wb, &pos, *wbsz, 150 - up->stat.map + up->stat.curpos, sz); 151 + (char *)up->stat.map + up->stat.curpos, sz); 152 153 up->stat.curpos += sz; 154 if (up->stat.curpos == up->stat.curlen) 155 @@ -561,7 +561,8 @@ rsync_sender(struct sess *sess, int fdin, 156 if ((pfd[1].revents & POLLOUT) && wbufsz > 0) { 157 assert(pfd[2].fd == -1); 158 assert(wbufsz - wbufpos); 159 - ssz = write(fdout, wbuf + wbufpos, wbufsz - wbufpos); 160 + ssz = write(fdout, 161 + (char *)wbuf + wbufpos, wbufsz - wbufpos); 162 if (ssz == -1) { 163 ERR("write"); 164 goto out; 165 -- 166 2.49.0 167