Blob Blame History Raw
diff -ur deltarpm-3.4/applydeltarpm.c deltarpm-3.4b/applydeltarpm.c
--- deltarpm-3.4/applydeltarpm.c	2007-12-17 17:48:18.000000000 +0200
+++ deltarpm-3.4b/applydeltarpm.c	2008-01-03 08:47:02.000000000 +0200
@@ -1104,6 +1104,7 @@
   unsigned char buf[4096];
   MD5_CTX wrmd5;
   unsigned char wrmd5res[16];
+  int nofullmd5 = 0;
   FILE *ofp;
   int numblks;
   int percent = 0;
@@ -1212,6 +1213,7 @@
       if (verbose)
 	fprintf(vfp, "reading deltarpm\n");
       readdeltarpm(deltarpm, &d, &bfp);
+      nofullmd5 = !memcmp("\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", d.targetmd5, 16);
 #ifdef DELTARPM_64BIT
       if (d.outlen >= 0xffffffffULL << BLKSHIFT)
 	{
@@ -1465,7 +1467,8 @@
       fprintf(stderr, "write error\n");
       exit(1);
     }
-  rpmMD5Update(&wrmd5, d.lead, d.leadl);
+  if (!nofullmd5)
+    rpmMD5Update(&wrmd5, d.lead, d.leadl);
   if (!d.h)
     fromrpm_raw = 1;
 
@@ -1494,7 +1497,24 @@
 	  exit(1);
 	}
       rpmMD5Final(wrmd5res, &wrmd5);
-      if (memcmp(wrmd5res, d.targetmd5, 16) != 0)
+      if (nofullmd5)
+        {
+          struct rpmhead *dsigh = readhead_buf(d.lead + 96, d.leadl - 96, 0);
+          if (dsigh)
+            {
+              unsigned char *hmd5 = headbin(dsigh, SIGTAG_MD5, 16);
+              if (hmd5)
+                {
+                  if (memcmp(wrmd5res, hmd5, 16) != 0)
+                    {
+                      fprintf(stderr, "%s: md5 mismatch of result\n", deltarpm);
+                      exit(1);
+                    }
+                }
+              xfree(dsigh);
+            }
+        }
+      else if (memcmp(wrmd5res, d.targetmd5, 16) != 0)
 	{
 	  fprintf(stderr, "%s: md5 mismatch of result\n", deltarpm);
 	  exit(1);
@@ -1753,7 +1773,24 @@
         fprintf(vfp, "had to call prelink %d times\n", nprelink);
     }
   rpmMD5Final(wrmd5res, &wrmd5);
-  if (memcmp(wrmd5res, d.targetmd5, 16) != 0)
+  if (nofullmd5)
+    {
+      struct rpmhead *dsigh = readhead_buf(d.lead + 96, d.leadl - 96, 0);
+      if (dsigh)
+        {
+          unsigned char *hmd5 = headbin(dsigh, SIGTAG_MD5, 16);
+          if (hmd5)
+            {
+              if (memcmp(wrmd5res, hmd5, 16) != 0)
+                {
+                  fprintf(stderr, "%s: md5 mismatch of result\n", deltarpm);
+                  exit(1);
+                }
+            }
+          xfree(dsigh);
+        }
+    }
+  else if (memcmp(wrmd5res, d.targetmd5, 16) != 0)
     {
       fprintf(stderr, "%s: md5 mismatch of result\n", deltarpm);
       exit(1);