Blob Blame History Raw
--- 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 \