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);