Explorar o código

Use fdio functions instead of raw read()/write() calls

This makes the call sites safe against interrupted I/O.
Guillem Jover %!s(int64=15) %!d(string=hai) anos
pai
achega
00fa8d0e6f
Modificáronse 4 ficheiros con 17 adicións e 14 borrados
  1. 2 2
      dpkg-deb/build.c
  2. 4 3
      dpkg-deb/extract.c
  3. 6 5
      lib/dpkg/ar.c
  4. 5 4
      lib/dpkg/compress.c

+ 2 - 2
dpkg-deb/build.c

@@ -550,7 +550,7 @@ void do_build(const char *const *argv) {
     if (S_ISLNK(fi->st.st_mode))
       file_info_list_append(&symlist, &symlist_end, fi);
     else {
-      if (write(p1[1], fi->fn, strlen(fi->fn)+1) ==- 1)
+      if (fd_write(p1[1], fi->fn, strlen(fi->fn) + 1) < 0)
         ohshite(_("failed to write filename to tar pipe (%s)"),
                 _("data member"));
       file_info_free(fi);
@@ -559,7 +559,7 @@ void do_build(const char *const *argv) {
   subproc_wait_check(c3, "find", 0);
 
   for (fi= symlist;fi;fi= fi->next)
-    if (write(p1[1], fi->fn, strlen(fi->fn)+1) == -1)
+    if (fd_write(p1[1], fi->fn, strlen(fi->fn) + 1) < 0)
       ohshite(_("failed to write filename to tar pipe (%s)"), _("data member"));
   /* All done, clean up wait for tar and gzip to finish their job. */
   close(p1[1]);

+ 4 - 3
dpkg-deb/extract.c

@@ -40,6 +40,7 @@
 
 #include <dpkg/i18n.h>
 #include <dpkg/dpkg.h>
+#include <dpkg/fdio.h>
 #include <dpkg/buffer.h>
 #include <dpkg/subproc.h>
 #include <dpkg/command.h>
@@ -80,7 +81,7 @@ read_line(int fd, char *buf, size_t min_size, size_t max_size)
     ssize_t r;
     char *nl;
 
-    r = read(fd, buf + line_size, n);
+    r = fd_read(fd, buf + line_size, n);
     if (r <= 0)
       return r;
 
@@ -135,7 +136,7 @@ extracthalf(const char *debar, const char *dir, const char *taroption,
     for (;;) {
       struct ar_hdr arh;
 
-      r = read(arfd, &arh, sizeof(arh));
+      r = fd_read(arfd, &arh, sizeof(arh));
       if (r != sizeof(arh))
         read_fail(r, debar, _("archive member header"));
 
@@ -151,7 +152,7 @@ extracthalf(const char *debar, const char *dir, const char *taroption,
         if (strncmp(arh.ar_name, DEBMAGIC, sizeof(arh.ar_name)) != 0)
           ohshit(_("file `%.250s' is not a debian binary archive (try dpkg-split?)"),debar);
         infobuf= m_malloc(memberlen+1);
-        r = read(arfd, infobuf, memberlen + (memberlen & 1));
+        r = fd_read(arfd, infobuf, memberlen + (memberlen & 1));
         if ((size_t)r != (memberlen + (memberlen & 1)))
           read_fail(r, debar, _("archive information header member"));
         infobuf[memberlen] = '\0';

+ 6 - 5
lib/dpkg/ar.c

@@ -29,6 +29,7 @@
 
 #include <dpkg/i18n.h>
 #include <dpkg/dpkg.h>
+#include <dpkg/fdio.h>
 #include <dpkg/buffer.h>
 #include <dpkg/ar.h>
 
@@ -75,7 +76,7 @@ dpkg_ar_member_get_size(const char *ar_name, struct ar_hdr *arh)
 void
 dpkg_ar_put_magic(const char *ar_name, int ar_fd)
 {
-	if (write(ar_fd, DPKG_AR_MAGIC, strlen(DPKG_AR_MAGIC)) < 0)
+	if (fd_write(ar_fd, DPKG_AR_MAGIC, strlen(DPKG_AR_MAGIC)) < 0)
 		ohshite(_("unable to write file '%s'"), ar_name);
 }
 
@@ -91,7 +92,7 @@ dpkg_ar_member_put_header(const char *ar_name, int ar_fd,
 	if (n != sizeof(struct ar_hdr))
 		ohshit(_("generated corrupt ar header for '%s'"), ar_name);
 
-	if (write(ar_fd, header, n) < 0)
+	if (fd_write(ar_fd, header, n) < 0)
 		ohshite(_("unable to write file '%s'"), ar_name);
 }
 
@@ -102,11 +103,11 @@ dpkg_ar_member_put_mem(const char *ar_name, int ar_fd,
 	dpkg_ar_member_put_header(ar_name, ar_fd, name, size);
 
 	/* Copy data contents. */
-	if (write(ar_fd, data, size) < 0)
+	if (fd_write(ar_fd, data, size) < 0)
 		ohshite(_("unable to write file '%s'"), ar_name);
 
 	if (size & 1)
-		if (write(ar_fd, "\n", 1) < 0)
+		if (fd_write(ar_fd, "\n", 1) < 0)
 			ohshite(_("unable to write file '%s'"), ar_name);
 }
 
@@ -128,6 +129,6 @@ dpkg_ar_member_put_file(const char *ar_name, int ar_fd,
 	fd_fd_copy(fd, ar_fd, size, _("ar member file (%s)"), name);
 
 	if (size & 1)
-		if (write(ar_fd, "\n", 1) < 0)
+		if (fd_write(ar_fd, "\n", 1) < 0)
 			ohshite(_("unable to write file '%s'"), ar_name);
 }

+ 5 - 4
lib/dpkg/compress.c

@@ -38,6 +38,7 @@
 #include <dpkg/i18n.h>
 #include <dpkg/dpkg.h>
 #include <dpkg/varbuf.h>
+#include <dpkg/fdio.h>
 #include <dpkg/buffer.h>
 #include <dpkg/command.h>
 #include <dpkg/compress.h>
@@ -122,7 +123,7 @@ decompress_gzip(int fd_in, int fd_out, const char *desc)
 		if (actualread == 0) /* EOF. */
 			break;
 
-		actualwrite = write(fd_out, buffer, actualread);
+		actualwrite = fd_write(fd_out, buffer, actualread);
 		if (actualwrite != actualread)
 			ohshite(_("%s: internal gzip write error"), desc);
 	}
@@ -149,7 +150,7 @@ compress_gzip(int fd_in, int fd_out, int compress_level, const char *desc)
 	for (;;) {
 		int actualread, actualwrite;
 
-		actualread = read(fd_in, buffer, sizeof(buffer));
+		actualread = fd_read(fd_in, buffer, sizeof(buffer));
 		if (actualread < 0)
 			ohshite(_("%s: internal gzip read error"), desc);
 		if (actualread == 0) /* EOF. */
@@ -234,7 +235,7 @@ decompress_bzip2(int fd_in, int fd_out, const char *desc)
 		if (actualread == 0) /* EOF. */
 			break;
 
-		actualwrite = write(fd_out, buffer, actualread);
+		actualwrite = fd_write(fd_out, buffer, actualread);
 		if (actualwrite != actualread)
 			ohshite(_("%s: internal bzip2 write error"), desc);
 	}
@@ -261,7 +262,7 @@ compress_bzip2(int fd_in, int fd_out, int compress_level, const char *desc)
 	for (;;) {
 		int actualread, actualwrite;
 
-		actualread = read(fd_in, buffer, sizeof(buffer));
+		actualread = fd_read(fd_in, buffer, sizeof(buffer));
 		if (actualread < 0)
 			ohshite(_("%s: internal bzip2 read error"), desc);
 		if (actualread == 0) /* EOF. */