Просмотр исходного кода

dpkg-deb: Do not special case old format control member

Initialize memberlen and skip the control member if the filesystem
member was requested, so that the same generic code that feeds the
member to the decompressor can be used for all cases.
Guillem Jover лет назад: 16
Родитель
Сommit
66c6a8b54f
1 измененных файлов с 19 добавлено и 43 удалено
  1. 19 43
      dpkg-deb/extract.c

+ 19 - 43
dpkg-deb/extract.c

@@ -118,9 +118,8 @@ void extracthalf(const char *debar, const char *directory,
   size_t ctrllennum, memberlen= 0;
   size_t ctrllennum, memberlen= 0;
   int dummy, l= 0;
   int dummy, l= 0;
   pid_t c1=0,c2,c3;
   pid_t c1=0,c2,c3;
-  void *ctrlarea = NULL;
   int p1[2], p2[2];
   int p1[2], p2[2];
-  FILE *ar, *pi;
+  FILE *ar;
   struct stat stab;
   struct stat stab;
   char nlc;
   char nlc;
   char *cur;
   char *cur;
@@ -225,6 +224,13 @@ void extracthalf(const char *debar, const char *directory,
     if (sscanf(ctrllenbuf,"%zi%c%d",&ctrllennum,&nlc,&dummy) !=2 || nlc != '\n')
     if (sscanf(ctrllenbuf,"%zi%c%d",&ctrllennum,&nlc,&dummy) !=2 || nlc != '\n')
       ohshit(_("archive has malformatted control length `%s'"), ctrllenbuf);
       ohshit(_("archive has malformatted control length `%s'"), ctrllenbuf);
 
 
+    if (admininfo) {
+      memberlen = ctrllennum;
+    } else {
+      memberlen = stab.st_size - ctrllennum - strlen(ctrllenbuf) - l;
+      stream_null_copy(ar, ctrllennum, _("skipped control area from %s"), debar);
+    }
+
     if (admininfo >= 2) {
     if (admininfo >= 2) {
       printf(_(" old debian package, version %s.\n"
       printf(_(" old debian package, version %s.\n"
                " size %ld bytes: control archive= %zi, main archive= %ld.\n"),
                " size %ld bytes: control archive= %zi, main archive= %ld.\n"),
@@ -232,12 +238,6 @@ void extracthalf(const char *debar, const char *directory,
              (long) (stab.st_size - ctrllennum - strlen(ctrllenbuf) - l));
              (long) (stab.st_size - ctrllennum - strlen(ctrllenbuf) - l));
       m_output(stdout, _("<standard output>"));
       m_output(stdout, _("<standard output>"));
     }
     }
-
-    ctrlarea = m_malloc(ctrllennum);
-
-    errno=0; if (fread(ctrlarea,1,ctrllennum,ar) != ctrllennum)
-      readfail(ar, debar, _("control area"));
-
   } else {
   } else {
     
     
     if (!strncmp(versionbuf,"!<arch>",7)) {
     if (!strncmp(versionbuf,"!<arch>",7)) {
@@ -252,42 +252,18 @@ void extracthalf(const char *debar, const char *directory,
 
 
   safe_fflush(ar);
   safe_fflush(ar);
 
 
-  if (oldformat) {
-    if (admininfo) {
-      m_pipe(p1);
-      c1 = subproc_fork();
-      if (!c1) {
-        close(p1[0]);
-	pi = fdopen(p1[1], "w");
-	if (!pi)
-	  ohshite(_("failed to open pipe descriptor `1' in paste"));
-        errno=0; if (fwrite(ctrlarea,1,ctrllennum,pi) != ctrllennum)
-          ohshit(_("failed to write to gzip -dc"));
-        if (fclose(pi)) ohshit(_("failed to close gzip -dc"));
-        exit(0);
-      }
-      close(p1[1]);
-      readfromfd= p1[0];
-    } else {
-      if (lseek(fileno(ar),l+strlen(ctrllenbuf)+ctrllennum,SEEK_SET) == -1)
-        ohshite(_("failed to syscall lseek to files archive portion"));
-      c1= -1;
-      readfromfd= fileno(ar);
-    }
-    free(ctrlarea);
-  } else {
-    m_pipe(p1);
-    c1 = subproc_fork();
-    if (!c1) {
-      close(p1[0]);
-      stream_fd_copy(ar, p1[1], memberlen, _("failed to write to pipe in copy"));
-      if (close(p1[1]) == EOF) ohshite(_("failed to close pipe in copy"));
-      exit(0);
-    }
-    close(p1[1]);
-    readfromfd= p1[0];
+  m_pipe(p1);
+  c1 = subproc_fork();
+  if (!c1) {
+    close(p1[0]);
+    stream_fd_copy(ar, p1[1], memberlen, _("failed to write to pipe in copy"));
+    if (close(p1[1]) == EOF)
+      ohshite(_("failed to close pipe in copy"));
+    exit(0);
   }
   }
-  
+  close(p1[1]);
+  readfromfd = p1[0];
+
   if (taroption) m_pipe(p2);
   if (taroption) m_pipe(p2);
   
   
   c2 = subproc_fork();
   c2 = subproc_fork();