X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=file_subs.c;h=4191b92969a9787a0ff4102b00e692b224b8b1d4;hb=8f168ea31fb75e6dd2540c77a64224e538aa7083;hp=73db1af11295febfc8a5c5d6e3123d19bae71325;hpb=3a2c49c9d8beafc53c5eaece425d9eae1e65fd33;p=debian%2Fpax diff --git a/file_subs.c b/file_subs.c index 73db1af..4191b92 100644 --- a/file_subs.c +++ b/file_subs.c @@ -351,7 +351,7 @@ node_creat(ARCHD *arcn) int pass = 0; mode_t file_mode; struct stat sb; - char target[MAXPATHLEN]; + char *target = NULL; char *nm = arcn->name; int len; @@ -374,8 +374,15 @@ node_creat(ARCHD *arcn) if (strcmp(NM_TAR, argv0) == 0 && Lflag) { while (lstat(nm, &sb) == 0 && S_ISLNK(sb.st_mode)) { + target = malloc(sb.st_size + 1); + if (target == NULL) { + oerrno = ENOMEM; + syswarn(1, oerrno, + "Insufficient memory"); + return(-1); + } len = readlink(nm, target, - sizeof target - 1); + sb.st_size); if (len == -1) { syswarn(0, errno, "cannot follow symlink %s in chain for %s", @@ -411,6 +418,7 @@ badlink: paxwarn(0, "%s skipped. Sockets cannot be copied or extracted", nm); + free(target); return(-1); case PAX_SLK: res = symlink(arcn->ln_name, nm); @@ -425,6 +433,7 @@ badlink: */ paxwarn(0, "%s has an unknown file type, skipping", nm); + free(target); return(-1); } @@ -440,14 +449,17 @@ badlink: * we failed to make the node */ oerrno = errno; - if ((ign = unlnk_exist(nm, arcn->type)) < 0) + if ((ign = unlnk_exist(nm, arcn->type)) < 0) { + free(target); return(-1); + } if (++pass <= 1) continue; if (nodirs || chk_path(nm,arcn->sb.st_uid,arcn->sb.st_gid) < 0) { syswarn(1, oerrno, "Could not create: %s", nm); + free(target); return(-1); } } @@ -465,8 +477,10 @@ badlink: /* * symlinks are done now. */ - if (arcn->type == PAX_SLK) + if (arcn->type == PAX_SLK) { + free(target); return(0); + } /* * IMPORTANT SECURITY NOTE: @@ -517,6 +531,7 @@ badlink: if (patime || pmtime) set_ftime(nm, arcn->sb.st_mtime, arcn->sb.st_atime, 0); + free(target); return(0); }