3bb32d6
diff --git a/lib/transaction.c b/lib/transaction.c
3bb32d6
index 7e432a3..42f1b12 100644
3bb32d6
--- a/lib/transaction.c
3bb32d6
+++ b/lib/transaction.c
3bb32d6
@@ -910,33 +910,51 @@ static int runTransScripts(rpmts ts, rpmTag stag)
3bb32d6
 	if (script == NULL && scriptprog == NULL)
3bb32d6
  	    continue;
3bb32d6
 
3bb32d6
-    	p->fd = rpmtsNotify(ts, p, RPMCALLBACK_INST_OPEN_FILE, 0, 0);
3bb32d6
-    	p->h = NULL;
3bb32d6
-    	if (rpmteFd(p) != NULL) {
3bb32d6
-	    rpmVSFlags ovsflags = rpmtsVSFlags(ts);
3bb32d6
-    	    rpmVSFlags vsflags = ovsflags | RPMVSF_NEEDPAYLOAD;
3bb32d6
-	    rpmRC rpmrc;
3bb32d6
-	    ovsflags = rpmtsSetVSFlags(ts, vsflags);
3bb32d6
-	    rpmrc = rpmReadPackageFile(ts, rpmteFd(p),
3bb32d6
-		    rpmteNEVR(p), &p->h);
3bb32d6
-	    vsflags = rpmtsSetVSFlags(ts, ovsflags);
3bb32d6
-	    switch (rpmrc) {
3bb32d6
-	    default:
3bb32d6
-	        /* FIX: notify annotations */
3bb32d6
-	        p->fd = rpmtsNotify(ts, p, RPMCALLBACK_INST_CLOSE_FILE, 0, 0);
3bb32d6
-	        p->fd = NULL;
3bb32d6
-	        break;
3bb32d6
-	    case RPMRC_NOTTRUSTED:
3bb32d6
-	    case RPMRC_NOKEY:
3bb32d6
-	    case RPMRC_OK:
3bb32d6
-	        break;
3bb32d6
+	if (stag==RPMTAG_POSTTRANS) {
3bb32d6
+	    /* get (already installed) header from rpmdb */
3bb32d6
+	    rpmdbMatchIterator mi;
3bb32d6
+	    mi = rpmtsInitIterator(ts, RPMTAG_NAME, rpmteN(p), 0);
3bb32d6
+	    xx = rpmdbSetIteratorRE(mi, RPMTAG_EPOCH, RPMMIRE_STRCMP,
3bb32d6
+				rpmteE(p));
3bb32d6
+	    xx = rpmdbSetIteratorRE(mi, RPMTAG_VERSION, RPMMIRE_STRCMP,
3bb32d6
+				rpmteV(p));
3bb32d6
+	    xx = rpmdbSetIteratorRE(mi, RPMTAG_RELEASE, RPMMIRE_STRCMP,
3bb32d6
+				rpmteR(p));
3bb32d6
+	    xx = rpmdbSetIteratorRE(mi, RPMTAG_ARCH, RPMMIRE_STRCMP,
3bb32d6
+				rpmteA(p));
3bb32d6
+
3bb32d6
+	    p->h = headerCopy(rpmdbNextIterator(mi));
3bb32d6
+	    mi = rpmdbFreeIterator(mi);
3bb32d6
+	} else {
3bb32d6
+	    /* reread rpm file */
3bb32d6
+	    p->fd = rpmtsNotify(ts, p, RPMCALLBACK_INST_OPEN_FILE, 0, 0);
3bb32d6
+	    p->h = NULL;
3bb32d6
+	    if (rpmteFd(p) != NULL) {
3bb32d6
+		rpmVSFlags ovsflags = rpmtsVSFlags(ts);
3bb32d6
+		rpmVSFlags vsflags = ovsflags | RPMVSF_NEEDPAYLOAD;
3bb32d6
+		rpmRC rpmrc;
3bb32d6
+		ovsflags = rpmtsSetVSFlags(ts, vsflags);
3bb32d6
+		rpmrc = rpmReadPackageFile(ts, rpmteFd(p),
3bb32d6
+					   rpmteNEVR(p), &p->h);
3bb32d6
+		vsflags = rpmtsSetVSFlags(ts, ovsflags);
3bb32d6
+		switch (rpmrc) {
3bb32d6
+		default:
3bb32d6
+		    /* FIX: notify annotations */
3bb32d6
+		     p->fd = rpmtsNotify(ts, p, RPMCALLBACK_INST_CLOSE_FILE, 0, 0);
3bb32d6
+		     p->fd = NULL;
3bb32d6
+		     break;
3bb32d6
+		case RPMRC_NOTTRUSTED:
3bb32d6
+		case RPMRC_NOKEY:
3bb32d6
+		case RPMRC_OK:
3bb32d6
+		     break;
3bb32d6
+		}
3bb32d6
 	    }
3bb32d6
-        }
3bb32d6
+	}
3bb32d6
 
3bb32d6
-    	if (rpmteFd(p) != NULL) {
3bb32d6
- 	    fi = rpmfiNew(ts, p->h, RPMTAG_BASENAMES, 1);
3bb32d6
+	if (p->h) {
3bb32d6
+	    fi = rpmfiNew(ts, p->h, RPMTAG_BASENAMES, 1);
3bb32d6
 	    if (fi != NULL) {	/* XXX can't happen */
3bb32d6
-		if (stag == RPMTAG_PRETRANS) {
3bb32d6
+		if (stag == RPMTAG_PRETRANS) { /* isn't this the same? */
3bb32d6
 		    fi->te = p;
3bb32d6
 		    p->fi = fi;
3bb32d6
 		} else {
3bb32d6
@@ -944,14 +962,16 @@ static int runTransScripts(rpmts ts, rpmTag stag)
3bb32d6
 		    p->fi->te = p;
3bb32d6
 		}
3bb32d6
 	    }
3bb32d6
+	    fi->h = p->h; // is this right?
3bb32d6
 	    psm = rpmpsmNew(ts, p, p->fi);
3bb32d6
 	    assert(psm != NULL);
3bb32d6
 	    xx = rpmpsmScriptStage(psm, stag, progtag);
3bb32d6
 	    psm = rpmpsmFree(psm);
3bb32d6
-
3bb32d6
-	    (void) rpmtsNotify(ts, p, RPMCALLBACK_INST_CLOSE_FILE, 0, 0);
3bb32d6
-	    p->fd = NULL;
3bb32d6
-	    p->h = headerFree(p->h);
3bb32d6
+	    if (p->fd != NULL) {
3bb32d6
+		(void) rpmtsNotify(ts, p, RPMCALLBACK_INST_CLOSE_FILE, 0, 0);
3bb32d6
+		p->fd = NULL;
3bb32d6
+	    }
3bb32d6
+	    p->h = fi->h = headerFree(p->h);
3bb32d6
 	}
3bb32d6
     }
3bb32d6
     pi = rpmtsiFree(pi);