- fix: readlink return value clobbered by header write.
authorjbj <devnull@localhost>
Wed, 25 Apr 2001 15:07:53 +0000 (15:07 +0000)
committerjbj <devnull@localhost>
Wed, 25 Apr 2001 15:07:53 +0000 (15:07 +0000)
CVS patchset: 4707
CVS date: 2001/04/25 15:07:53

CHANGES
lib/fsm.c

diff --git a/CHANGES b/CHANGES
index 6b15e1d..bffebf1 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -31,6 +31,7 @@
        - cpanflute perl dependency needs explicit epoch (#37034).
        - regenerate rpm.8 man page from docbook glop (in max-rpm).
        - lib/depends.c: diddle debugging messages.
+       - fix: readlink return value clobbered by header write.
 
 4.0 -> 4.0.[12]
        - add doxygen and lclint annotations most everywhere.
index 4357cc9..42f0de2 100644 (file)
--- a/lib/fsm.c
+++ b/lib/fsm.c
@@ -681,6 +681,7 @@ static int writeFile(FSM_t fsm, int writeData)
     struct stat * st = &fsm->sb;
     struct stat * ost = &fsm->osb;
     size_t pos = fdGetCpioPos(fsm->cfd);
+    char * symbuf = NULL;
     int left;
     int rc;
 
@@ -696,6 +697,7 @@ static int writeFile(FSM_t fsm, int writeData)
        rc = fsmStage(fsm, FSM_READLINK);
        if (rc) goto exit;
        st->st_size = fsm->rdnb;
+       symbuf = alloca_strdup(fsm->rdbuf);     /* XXX save readlink return. */
     }
 
     if (fsm->mapFlags & CPIO_MAP_ABSOLUTE) {
@@ -767,6 +769,8 @@ static int writeFile(FSM_t fsm, int writeData)
 
     } else if (writeData && S_ISLNK(st->st_mode)) {
        /* XXX DWRITE uses rdnb for I/O length. */
+       strcpy(fsm->rdbuf, symbuf);     /* XXX restore readlink buffer. */
+       fsm->rdnb = strlen(symbuf);
        rc = fsmStage(fsm, FSM_DWRITE);
        if (rc) goto exit;
     }