Date: Mon, 12 Apr 2010 10:26:47 GMT From: Garrett Cooper <gcooper@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 176828 for review Message-ID: <201004121026.o3CAQliR018254@repoman.freebsd.org>
index | next in thread | raw e-mail
http://p4web.freebsd.org/@@176828?ac=10 Change 176828 by gcooper@gcooper-bayonetta on 2010/04/12 10:26:28 Convert fetch(3) call over to piped read via unpack and fix potential bug in interrupted or HUPed call during unpack where the file wasn't being deleted in the event of a failure. More signals need to be added to the signal handler. Affected files ... .. //depot/projects/soc2007/gcooper-pkg_install-enhancements-simplified/usr.sbin/pkg_install/lib/file.c#10 edit .. //depot/projects/soc2007/gcooper-pkg_install-enhancements-simplified/usr.sbin/pkg_install/lib/url.c#4 edit Differences ... ==== //depot/projects/soc2007/gcooper-pkg_install-enhancements-simplified/usr.sbin/pkg_install/lib/file.c#10 (text+ko) ==== @@ -363,7 +363,10 @@ __func__, file_expr); } - pkg_name_humanized = strcmp(pkg, "-") == 0 ? "(stdin)" : pkg; + if (pkg == NULL || strcmp(pkg, "-") == 0) + pkg_name_humanized = "(stdin)"; + else + pkg_name_humanized = pkg; archive = archive_read_new(); archive_read_support_compression_all(archive); ==== //depot/projects/soc2007/gcooper-pkg_install-enhancements-simplified/usr.sbin/pkg_install/lib/url.c#4 (text+ko) ==== @@ -22,11 +22,21 @@ __FBSDID("$FreeBSD: src/usr.sbin/pkg_install/lib/url.c,v 1.13 2010/04/01 14:27:29 flz Exp $"); #include "lib.h" +#include <sys/wait.h> #include <err.h> #include <fetch.h> #include <libgen.h> -#include <sys/wait.h> #include <stdio.h> +#include <unistd.h> + +static char pkg[FILENAME_MAX]; + +static void +fetch_cleanup(int sig) +{ + unlink(pkg); + cleanup(sig); +} /* * Try and fetch a file by URL, returning the directory name for where @@ -39,7 +49,6 @@ char *cp, *tmp; char fname[FILENAME_MAX]; char pen[FILENAME_MAX]; - char pkg[FILENAME_MAX]; char buf[8192]; FILE *ftp; pid_t tpid; @@ -128,31 +137,40 @@ cleanup(0); exit(2); } - if ((tpid = fork()) == -1) { - warn("pipe()"); + switch((tpid = fork())) { + case -1: + warn("fork() failed"); cleanup(0); - exit(2); - } - if (!tpid) { + exit(EXIT_FAILURE); + break; + case 0: + /* Let the parent deal with the signals. */ + signal(SIGHUP, SIG_DFL); + signal(SIGINT, SIG_DFL); dup2(pfd[0], 0); for (fd = getdtablesize() - 1; fd >= 3; --fd) - close(fd); - execl("/usr/bin/tar", "tar", - Verbose ? "-xpjvf" : "-xpjf", - "-", (char *)0); - _exit(2); - } - close(pfd[0]); - for (;;) { - if ((r = fread(buf, 1, sizeof buf, ftp)) < 1) - break; - if ((w = write(pfd[1], buf, r)) != r) - break; - if (keep_package) { - if ((w = write(pkgfd, buf, r)) != r) + close(fd); + _exit(unpack(NULL, NULL)); + break; + default: + signal(SIGHUP, fetch_cleanup); + signal(SIGINT, fetch_cleanup); + close(pfd[0]); + for (;;) { + if ((r = fread(buf, 1, sizeof(buf), ftp)) < 1) + break; + if ((w = write(pfd[1], buf, r)) != r) break; - } + if (keep_package) { + if ((w = write(pkgfd, buf, r)) != r) + break; + } + + } + signal(SIGHUP, cleanup); + signal(SIGINT, cleanup); } + if (ferror(ftp)) warn("warning: error reading from server"); fclose(ftp); @@ -164,7 +182,7 @@ warn("warning: error writing to tar"); tpid = waitpid(tpid, &pstat, 0); if (Verbose) - printf("tar command returns %d status\n", WEXITSTATUS(pstat)); + printf("unpack returned status: %d\n", WEXITSTATUS(pstat)); if (rp && (isatty(0) || Verbose)) printf(" Done.\n"); return rp;help
Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201004121026.o3CAQliR018254>
