There are a lot of ways to lose the value of errno after a failed rpmPackageFilesInstall. Typically, stdio will call isatty which then overwrites errno with ENOTTY. Save and restore errno between the return from rpmPackageFilesInstall and the logging of the error. There may be more opportunities inside rpmPackageFilesInstall to clobber the real errno which I haven't investigated yet. --- lib/psm.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/lib/psm.c b/lib/psm.c index df09bd3..e327bba 100644 --- a/lib/psm.c +++ b/lib/psm.c @@ -806,6 +806,7 @@ static rpmRC rpmpsmStage(rpmpsm psm, pkgStage stage) case PSM_PROCESS: if (psm->goal == PKG_INSTALL) { int fsmrc = 0; + int saved_errno = 0; rpmpsmNotify(psm, RPMCALLBACK_INST_START, 0); /* make sure first progress call gets made */ @@ -820,6 +821,7 @@ static rpmRC rpmpsmStage(rpmpsm psm, pkgStage stage) fsmrc = rpmPackageFilesInstall(psm->ts, psm->te, psm->fi, payload, psm, &psm->failedFile); + saved_errno = errno; rpmswAdd(rpmtsOp(psm->ts, RPMTS_OP_UNCOMPRESS), fdOp(payload, FDSTAT_READ)); @@ -834,7 +836,9 @@ static rpmRC rpmpsmStage(rpmpsm psm, pkgStage stage) rpmpsmNotify(psm, RPMCALLBACK_INST_STOP, psm->total); if (fsmrc) { - char *emsg = rpmcpioStrerror(fsmrc); + char *emsg; + errno = saved_errno; + emsg = rpmcpioStrerror(fsmrc); rpmlog(RPMLOG_ERR, _("unpacking of archive failed%s%s: %s\n"), (psm->failedFile != NULL ? _(" on file ") : ""), -- 1.8.3.1 -- Andreas Schwab, sch...@linux-m68k.org GPG Key fingerprint = 58CA 54C7 6D53 942B 1756 01D3 44D5 214B 8276 4ED5 "And now for something completely different." _______________________________________________ Rpm-maint mailing list Rpm-maint@lists.rpm.org http://lists.rpm.org/mailman/listinfo/rpm-maint