From: Jim Meyering Date: Thu, 22 Feb 2007 15:32:45 +0000 (+0100) Subject: Adjust preceding change not to perform an unaligned access. X-Git-Tag: COREUTILS-6_8~18 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c450b625b4351aa5ab87a4334f95b6a24f3a0022;p=thirdparty%2Fcoreutils.git Adjust preceding change not to perform an unaligned access. * src/copy.c (copy_reg): Undo previous change. Instead, make it clearer that we're using a single-byte sentinel, and [lint]: Initialize uintptr_t-1 bytes after the sentinel. Reported by Andreas Schwab. --- diff --git a/ChangeLog b/ChangeLog index ec598a0119..fabf1a33fa 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,11 @@ 2007-02-22 Jim Meyering + Adjust preceding change not to perform an unaligned access. + * src/copy.c (copy_reg): Undo previous change. Instead, make + it clearer that we're using a single-byte sentinel, and + [lint]: Initialize uintptr_t-1 bytes after the sentinel. + Reported by Andreas Schwab. + Placate valgrind, wrt ./cp --sparse=always * src/copy.c (copy_reg): Place the sentinel by setting a full word's worth of bits, not just a single byte's worth. diff --git a/src/copy.c b/src/copy.c index f0c6539b7f..99e2ca40c4 100644 --- a/src/copy.c +++ b/src/copy.c @@ -430,8 +430,17 @@ copy_reg (char const *src_name, char const *dst_name, { char *cp; - wp = (word *) (buf + n_read); - *wp = 1; /* Sentinel to stop loop. */ + /* Sentinel to stop loop. */ + buf[n_read] = '\1'; +#ifdef lint + /* Usually, buf[n_read] is not the byte just before a "word" + (aka uintptr_t) boundary. In that case, the word-oriented + test below (*wp++ == 0) would read some uninitialized bytes + after the sentinel. To avoid false-positive reports about + this condition (e.g., from a tool like valgrind), set the + remaining bytes -- to any value. */ + memset (buf + n_read + 1, 0, sizeof (word) - 1); +#endif /* Find first nonzero *word*, or the word with the sentinel. */