The following commit has been merged in the master branch:
commit 66c6a8b54f40cedbd754dd9865fd64a0275e7b72
Author: Guillem Jover <[email protected]>
Date: Tue Jul 6 08:30:13 2010 +0200
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.
diff --git a/dpkg-deb/extract.c b/dpkg-deb/extract.c
index e5e1f9c..e745191 100644
--- a/dpkg-deb/extract.c
+++ b/dpkg-deb/extract.c
@@ -118,9 +118,8 @@ void extracthalf(const char *debar, const char *directory,
size_t ctrllennum, memberlen= 0;
int dummy, l= 0;
pid_t c1=0,c2,c3;
- void *ctrlarea = NULL;
int p1[2], p2[2];
- FILE *ar, *pi;
+ FILE *ar;
struct stat stab;
char nlc;
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')
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) {
printf(_(" old debian package, version %s.\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));
m_output(stdout, _("<standard output>"));
}
-
- ctrlarea = m_malloc(ctrllennum);
-
- errno=0; if (fread(ctrlarea,1,ctrllennum,ar) != ctrllennum)
- readfail(ar, debar, _("control area"));
-
} else {
if (!strncmp(versionbuf,"!<arch>",7)) {
@@ -252,42 +252,18 @@ void extracthalf(const char *debar, const char *directory,
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);
c2 = subproc_fork();
--
dpkg's main repository
--
To UNSUBSCRIBE, email to [email protected]
with a subject of "unsubscribe". Trouble? Contact [email protected]