* src/sum.c (bsd_sum_stream): Detect overflow when updating length. (sysv_sum_stream): Likewise. --- src/sum.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+)
diff --git a/src/sum.c b/src/sum.c index 1633c86c5..4e1efe9e1 100644 --- a/src/sum.c +++ b/src/sum.c @@ -73,6 +73,11 @@ bsd_sum_stream (FILE *stream, void *resstream, uintmax_t *length) checksum += buffer[i]; checksum &= 0xffff; /* Keep it within bounds. */ } + if (total_bytes + sum < total_bytes) + { + errno = EOVERFLOW; + goto cleanup_buffer; + } total_bytes += sum; } @@ -84,6 +89,11 @@ final_process:; checksum += buffer[i]; checksum &= 0xffff; /* Keep it within bounds. */ } + if (total_bytes + sum < total_bytes) + { + errno = EOVERFLOW; + goto cleanup_buffer; + } total_bytes += sum; memcpy (resstream, &checksum, sizeof checksum); @@ -139,6 +149,11 @@ sysv_sum_stream (FILE *stream, void *resstream, uintmax_t *length) for (size_t i = 0; i < sum; i++) s += buffer[i]; + if (total_bytes + sum < total_bytes) + { + errno = EOVERFLOW; + goto cleanup_buffer; + } total_bytes += sum; } @@ -146,6 +161,11 @@ final_process:; for (size_t i = 0; i < sum; i++) s += buffer[i]; + if (total_bytes + sum < total_bytes) + { + errno = EOVERFLOW; + goto cleanup_buffer; + } total_bytes += sum; int r = (s & 0xffff) + ((s & 0xffffffff) >> 16); -- 2.26.2