summaryrefslogtreecommitdiff
path: root/methods
diff options
context:
space:
mode:
authorDavid Kalnischkies <david@kalnischkies.de>2016-08-31 10:11:07 +0200
committerJulian Andres Klode <jak@debian.org>2016-10-05 21:53:38 +0200
commit3b4a7c7da916ad9584af34d535ebac37f3b338a0 (patch)
treea55f2ddbe5c2880bb50611c6d426db5b344f5c75 /methods
parent2ce2ada40aa93ca5d31fb9dd0ca8d78df5751227 (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 (cherry picked from commit 644478e8db56f305601c3628a74e53de048b28c8)
Diffstat (limited to 'methods')
-rw-r--r--methods/rred.cc9
1 files changed, 5 insertions, 4 deletions
diff --git a/methods/rred.cc b/methods/rred.cc
index 2002da743..e2124fd05 100644
--- a/methods/rred.cc
+++ b/methods/rred.cc
@@ -336,7 +336,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;
@@ -386,8 +386,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:
@@ -539,7 +539,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();