--- rpm-4.11.3/lib/transaction.c.old 2019-01-02 13:14:10.304068576 +0100 +++ rpm-4.11.3/lib/transaction.c 2019-02-28 11:03:32.164403544 +0100 @@ -368,6 +368,11 @@ return rConflicts; } +static rpm_loff_t DivideHardlinkSize(int nlink, rpm_loff_t originalSize) +{ + return (originalSize / nlink) + 1; +} + /** * handleInstInstalledFiles. * @param ts transaction set @@ -384,6 +389,8 @@ { rpmfs fs = rpmteGetFileStates(p); int isCfgFile = ((rpmfiFFlagsIndex(otherFi, ofx) | rpmfiFFlagsIndex(fi, fx)) & RPMFILE_CONFIG); + rpm_loff_t otherFileSize; + int nlink; if (XFA_SKIPPING(rpmfsGetAction(fs, fx))) return; @@ -445,7 +452,15 @@ action = rpmfiDecideFateIndex(otherFi, ofx, fi, fx, skipMissing); rpmfsSetAction(fs, fx, action); } - rpmfiSetFReplacedSizeIndex(fi, fx, rpmfiFSizeIndex(otherFi, ofx)); + + otherFileSize = rpmfiFSizeIndex(otherFi, ofx); + + /* Only an appropriate fraction of the file size of a hardlink */ + nlink = rpmfiFNlinkIndex(otherFi, ofx); + if (nlink > 1) + otherFileSize = DivideHardlinkSize(nlink, otherFileSize); + + rpmfiSetFReplacedSizeIndex(fi, fx, otherFileSize); } /** @@ -470,6 +485,8 @@ rpmfileAttrs FFlags; struct rpmffi_s * recs; int numRecs; + rpm_loff_t fileSize; + int nlink; if (XFA_SKIPPING(rpmfsGetAction(fs, i))) continue; @@ -633,9 +650,15 @@ break; } + fileSize = rpmfiFSizeIndex(fi, i); + nlink = rpmfiFNlinkIndex(fi, i); + /* Only an appropriate fraction of the file sizeof a hardlink */ + if (nlink > 1) + fileSize = DivideHardlinkSize(nlink, fileSize); + /* Update disk space info for a file. */ rpmtsUpdateDSI(ts, fpEntryDev(fpc, fiFps), fpEntryDir(fpc, fiFps), - rpmfiFSizeIndex(fi, i), rpmfiFReplacedSizeIndex(fi, i), + fileSize, rpmfiFReplacedSizeIndex(fi, i), fixupSize, rpmfsGetAction(fs, i)); } --- rpm-4.11.3/lib/rpmfi.h.old 2014-02-05 14:04:02.000000000 +0100 +++ rpm-4.11.3/lib/rpmfi.h 2019-01-07 09:57:40.407787724 +0100 @@ -396,7 +396,7 @@ #define RPMFI_FLAGS_ERASE \ (RPMFI_NOFILECLASS | RPMFI_NOFILELANGS | \ - RPMFI_NOFILEMTIMES | RPMFI_NOFILERDEVS | RPMFI_NOFILEINODES | \ + RPMFI_NOFILEMTIMES | RPMFI_NOFILERDEVS | \ RPMFI_NOFILEVERIFYFLAGS) #define RPMFI_FLAGS_INSTALL \