Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/netbsd-2-0]: src/bin/pax Pullup rev 1.58 (requested by christos in ticke...



details:   https://anonhg.NetBSD.org/src/rev/c33239938ed4
branches:  netbsd-2-0
changeset: 562797:c33239938ed4
user:      jmc <jmc%NetBSD.org@localhost>
date:      Fri Nov 12 05:02:09 2004 +0000

description:
Pullup rev 1.58 (requested by christos in ticket #921)

Keep track of the length of the gnu long name/link hack, so that
we can append to it. Modify the code so that file_write is re-entrant,
even in the gnu long name/link hack.

diffstat:

 bin/pax/tar.c |  26 ++++++++++++++++----------
 1 files changed, 16 insertions(+), 10 deletions(-)

diffs (82 lines):

diff -r 390c1b2d4add -r c33239938ed4 bin/pax/tar.c
--- a/bin/pax/tar.c     Fri Nov 12 04:59:40 2004 +0000
+++ b/bin/pax/tar.c     Fri Nov 12 05:02:09 2004 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: tar.c,v 1.47.2.7 2004/11/12 04:59:17 jmc Exp $ */
+/*     $NetBSD: tar.c,v 1.47.2.8 2004/11/12 05:02:09 jmc Exp $ */
 
 /*-
  * Copyright (c) 1992 Keith Muller.
@@ -42,7 +42,7 @@
 #if 0
 static char sccsid[] = "@(#)tar.c      8.2 (Berkeley) 4/18/94";
 #else
-__RCSID("$NetBSD: tar.c,v 1.47.2.7 2004/11/12 04:59:17 jmc Exp $");
+__RCSID("$NetBSD: tar.c,v 1.47.2.8 2004/11/12 05:02:09 jmc Exp $");
 #endif
 #endif /* not lint */
 
@@ -68,7 +68,7 @@
  * Routines for reading, writing and header identify of various versions of tar
  */
 
-static int expandname(char *, size_t,  char **, const char *, size_t);
+static int expandname(char *, size_t,  char **, size_t *, const char *, size_t);
 static void longlink(ARCHD *, int);
 static u_long tar_chksm(char *, int);
 static char *name_split(char *, int);
@@ -93,6 +93,8 @@
 static int gnu_hack_len;               /* len of gnu_hack_string */
 char *gnu_name_string;                 /* ././@LongLink hackery name */
 char *gnu_link_string;                 /* ././@LongLink hackery link */
+size_t gnu_name_length;                        /* ././@LongLink hackery name */
+size_t gnu_link_length;                        /* ././@LongLink hackery link */
 static int gnu_short_trailer;          /* gnu short trailer */
 
 static const char LONG_LINK[] = "././@LongLink";
@@ -450,9 +452,11 @@
        hd = (HD_TAR *)buf;
        if (hd->linkflag != LONGLINKTYPE && hd->linkflag != LONGNAMETYPE) {
                arcn->nlen = expandname(arcn->name, sizeof(arcn->name),
-                   &gnu_name_string, hd->name, sizeof(hd->name));
+                   &gnu_name_string, &gnu_name_length, hd->name,
+                   sizeof(hd->name));
                arcn->ln_nlen = expandname(arcn->ln_name, sizeof(arcn->ln_name),
-                   &gnu_link_string, hd->linkname, sizeof(hd->linkname));
+                   &gnu_link_string, &gnu_link_length, hd->linkname,
+                   sizeof(hd->linkname));
        }
        arcn->sb.st_mode = (mode_t)(asc_ul(hd->mode,sizeof(hd->mode),OCT) &
            0xfff);
@@ -817,10 +821,11 @@
 
        if (hd->typeflag != LONGLINKTYPE && hd->typeflag != LONGNAMETYPE) {
                arcn->nlen = expandname(dest, sizeof(arcn->name) - cnt,
-                   &gnu_name_string, hd->name, sizeof(hd->name)) + cnt;
+                   &gnu_name_string, &gnu_name_length, hd->name,
+                   sizeof(hd->name)) + cnt;
                arcn->ln_nlen = expandname(arcn->ln_name,
-                   sizeof(arcn->ln_name), &gnu_link_string, hd->linkname,
-                   sizeof(hd->linkname));
+                   sizeof(arcn->ln_name), &gnu_link_string, &gnu_link_length,
+                   hd->linkname, sizeof(hd->linkname));
        }
 
        /*
@@ -940,13 +945,14 @@
 }
 
 static int
-expandname(char *buf, size_t len, char **gnu_name, const char *name,
-    size_t nlen)
+expandname(char *buf, size_t len, char **gnu_name, size_t *gnu_length,
+    const char *name, size_t nlen)
 {
        if (*gnu_name) {
                len = strlcpy(buf, *gnu_name, len);
                free(*gnu_name);
                *gnu_name = NULL;
+               *gnu_length = 0;
        } else {
                if (len > ++nlen)
                        len = nlen;



Home | Main Index | Thread Index | Old Index