diff options
author | David Kalnischkies <david@kalnischkies.de> | 2016-08-31 10:11:07 +0200 |
---|---|---|
committer | David Kalnischkies <david@kalnischkies.de> | 2016-09-01 16:13:14 +0200 |
commit | 644478e8db56f305601c3628a74e53de048b28c8 (patch) | |
tree | edcd2bfc85f7fdcdef458b8c3b5ad729d4d6481a /methods/rred.cc | |
parent | 0343b48e06fb990ee15a020bc6716b1a5a984e14 (diff) |
try not to call memcpy with length 0 in hash calculations
memcpy is marked as nonnull for its input, but ignores the input anyhow
if the declared length is zero. Our SHA2 implementations do this as
well, it was "just" MD5 and SHA1 missing, so we add the length check
here as well as along the callstack as it is really pointless to do all
these method calls for "nothing".
Reported-By: gcc -fsanitize=undefined
Diffstat (limited to 'methods/rred.cc')
-rw-r--r-- | methods/rred.cc | 9 |
1 files changed, 5 insertions, 4 deletions
diff --git a/methods/rred.cc b/methods/rred.cc index 0c641ad82..958933a07 100644 --- a/methods/rred.cc +++ b/methods/rred.cc @@ -335,7 +335,7 @@ class Patch { FileChanges filechanges; MemBlock add_text; - static bool retry_fwrite(char *b, size_t l, FileFd &f, Hashes * const start_hash, Hashes * const end_hash = nullptr) + static bool retry_fwrite(char *b, size_t l, FileFd &f, Hashes * const start_hash, Hashes * const end_hash = nullptr) APT_NONNULL(1) { if (f.Write(b, l) == false) return false; @@ -385,8 +385,8 @@ class Patch { } } - static void dump_mem(FileFd &o, char *p, size_t s, Hashes *hash) { - retry_fwrite(p, s, o, hash); + static void dump_mem(FileFd &o, char *p, size_t s, Hashes *hash) APT_NONNULL(2) { + retry_fwrite(p, s, o, nullptr, hash); } public: @@ -538,7 +538,8 @@ class Patch { for (ch = filechanges.begin(); ch != filechanges.end(); ++ch) { dump_lines(out, in, ch->offset, start_hash, end_hash); skip_lines(in, ch->del_cnt, start_hash); - dump_mem(out, ch->add, ch->add_len, end_hash); + if (ch->add_len != 0) + dump_mem(out, ch->add, ch->add_len, end_hash); } dump_rest(out, in, start_hash, end_hash); out.Flush(); |