ports/143698: pkg_add probably behaving incorrectly
Ming
symingz at foxmail.com
Tue Feb 9 13:50:03 UTC 2010
>Number: 143698
>Category: ports
>Synopsis: pkg_add probably behaving incorrectly
>Confidential: no
>Severity: non-critical
>Priority: medium
>Responsible: freebsd-ports-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: sw-bug
>Submitter-Id: current-users
>Arrival-Date: Tue Feb 09 13:50:02 UTC 2010
>Closed-Date:
>Last-Modified:
>Originator: Ming
>Release: 8.0-RELEASE-p2
>Organization:
None
>Environment:
FreeBSD freebsd.hello 8.0-RELEASE-p2 FreeBSD 8.0-RELEASE-p2 #0: Tue Feb 9 00:16:31 CST 2010 root at freebsd.hello:/usr/obj/usr/src/sys/MINI i386
>Description:
I think pkg_add has 2 incorrect behaviors:
1. When using "pkg_add" or "pkg_add -r"to install a package, the installation
will continue even when pkg_add failed to find a dependent package , I think
this should only be the case when "-f" is used
2. When using "pkg_add -r" to install a package, the installation will
continue even when the fetch and extraction of the package are not
error free, and then the installation will only stop if the
"half-extracted package" triggers further error. I think installation
should stop as soon as an error is detected. Otherwise there is a chance
to leave the system in a "dirty state".
>How-To-Repeat:
For 1, just install a package without supplying the dependencies.
For 2, may be try to install a package that is a compressed broken tar (not tested, I think I encountered the problem due to network transfer error).
>Fix:
The fixes are not tested, but I think they might work:
For 1, change src/usr.sbin/pkg_install/add/perform.c, line 320 to:
for (p = Plist.head; p && code == 0; p = p->next) {
For 2, change src/usr.sbin/pkg_install/lib/url.c as follows:
Insert after line 48:
int code = 0;
int tarstat;
Replace line 152 to line 166 with:
if (ferror(ftp)) {
warn("warning: error reading from server");
code++;
}
fclose(ftp);
if (keep_package) {
close(pkgfd);
}
close(pfd[1]);
if (w == -1) {
warn("warning: error writing to tar");
code++;
}
tpid = waitpid(tpid, &pstat, 0);
tarstat = WEXITSTATUS(pstat);
if (!tarstat) {
warn("warning: error extracting package");
code++;
}
if (Verbose)
printf("tar command returns %d status\n", tarstat);
if (code) {
printf(" End with error.\n");
return NULL;
}
if (rp && (isatty(0) || Verbose))
printf(" Done.\n");
return rp;
>Release-Note:
>Audit-Trail:
>Unformatted:
More information about the freebsd-ports-bugs
mailing list