Преглед изворни кода

libdpkg: Fix memory leaks in buffer_copy() on error conditions

Check for errors from subfunctions and break out of the loop to be able
to release resources. Check also for unexpected EOF only after freeing
resources, so that we don't end up leaking them.

Warned-by: coverity
Guillem Jover пре 12 година
родитељ
комит
ded3dfed77
2 измењених фајлова са 8 додато и 5 уклоњено
  1. 1 0
      debian/changelog
  2. 7 5
      lib/dpkg/buffer.c

+ 1 - 0
debian/changelog

@@ -7,6 +7,7 @@ dpkg (1.17.10) UNRELEASED; urgency=low
   * Fix word wrapping logic in dselect. Regression introduced in dpkg 1.17.3.
   * Fix possible out of bounds buffer read access in the error output on
     bogus ar member sizes.
+  * Fix memory leaks in buffer_copy() on error conditions.
 
   [ Updated manpages translations ]
   * German (Helge Kreutzmann).

+ 7 - 5
lib/dpkg/buffer.c

@@ -196,7 +196,7 @@ buffer_copy(struct buffer_data *read_data,
 	while (bufsize > 0) {
 		bytesread = buffer_read(read_data, buf, bufsize, err);
 		if (bytesread < 0)
-			return -1;
+			break;
 		if (bytesread == 0)
 			break;
 
@@ -212,20 +212,22 @@ buffer_copy(struct buffer_data *read_data,
 
 		byteswritten = buffer_write(write_data, buf, bytesread, err);
 		if (byteswritten < 0)
-			return -1;
+			break;
 		if (byteswritten == 0)
 			break;
 
 		totalwritten += byteswritten;
 	}
 
-	if (limit > 0)
-		return dpkg_put_error(err, _("unexpected end of file or stream"));
-
 	buffer_filter_done(filter);
 
 	free(buf);
 
+	if (limit > 0)
+		return dpkg_put_error(err, _("unexpected end of file or stream"));
+	if (bytesread < 0 || byteswritten < 0)
+		return -1;
+
 	return totalread;
 }