]> Dogcows Code - chaz/tar/commitdiff
--strip strips file system prefix too, and it counts adjacent
authorPaul Eggert <eggert@cs.ucla.edu>
Mon, 22 Sep 2003 18:54:50 +0000 (18:54 +0000)
committerPaul Eggert <eggert@cs.ucla.edu>
Mon, 22 Sep 2003 18:54:50 +0000 (18:54 +0000)
slashes as if they were one slash.

ChangeLog
src/common.h
src/extract.c
src/names.c

index f990a350f03fbd29267d0a4cded9457333c0c434..af6888b6083d3683b3351de34ffac69ea4db9c55 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+2003-09-22  Paul Eggert  <eggert@twinsun.com>
+
+       * doc/tar.texi (extracting untrusted archives): New section.
+
+       * src/common.h (stripped_path_len): Renamed from cut_path_elements.
+       Return size_t, not pointer, so that we don't have to worry about
+       violating the C standard by converting char const * to char *.
+       All callers changed.
+       * src/names.c (stripped_path_len): Likewise.  Strip file system
+       prefix, too.  Count adjacent slashes as if they were one slash;
+       that is the POSIX standard.
+
 2003-09-17  Paul Eggert  <eggert@twinsun.com>
 
        * README-alpha: Document maintainer tool assumptions a bit.  GNU
index 40609bb82892297c9985b2ad06e526947eedbb25..9e1ec68fb00e0b76699fc6d0d22aa62c7663f051 100644 (file)
@@ -567,7 +567,7 @@ char *name_from_list (void);
 void blank_name_list (void);
 char *new_name (const char *, const char *);
 char *safer_name_suffix (char const *, bool);
-char const *cut_path_elements (char const *file_name, size_t num);
+size_t stripped_path_len (char const *file_name, size_t num);
 
 bool excluded_name (char const *);
 
index d7aba0d95bad075c08e8f61b3d95af7af997b92e..26fcecbc49230fd62acc6e218be8d22e3ef1ca25 100644 (file)
@@ -719,12 +719,13 @@ extract_archive (void)
   file_name = safer_name_suffix (current_stat_info.file_name, 0);
   if (strip_path_elements)
     {
-      file_name = cut_path_elements (file_name, strip_path_elements);
-      if (!file_name)
+      size_t prefix_len = stripped_prefix_len (file_name, strip_path_elements);
+      if (prefix_len == (size_t) -1)
        {
          skip_member ();
          return;
        }
+      file_name += prefix_len;
     }
   
   apply_nonancestor_delayed_set_stat (file_name, 0);
index ee68749bb921be22ce3b13bcfeb3a4e8be8be205..04719d081c8e0151e7f74f21f0199a7da2553d1d 100644 (file)
@@ -1043,21 +1043,29 @@ safer_name_suffix (char const *file_name, bool link_target)
   return (char *) p;
 }
 \f
-char const *
-cut_path_elements (char const *file_name, size_t num)
+/* Return the size of the prefix of FILE_NAME that is removed after
+   stripping NUM leading path name components.  NUM must be
+   positive.  */
+
+size_t
+stripped_prefix_len (char const *file_name, size_t num)
 {
-  char const *p = file_name;
-  if (ISSLASH (*p))
+  char const *p = file_name + FILESYSTEM_PREFIX_LEN (file_name);
+  while (ISSLASH (*p))
     p++;
-  for (; *p; p++)
+  while (*p)
     {
-      if (ISSLASH (*p))
+      bool slash = ISSLASH (*p);
+      p++;
+      if (slash)
        {
          if (--num == 0)
-           return p + 1;
+           return p - file_name;
+         while (ISSLASH (*p))
+           p++;
        }
     }
-  return NULL;
+  return -1;
 }
 \f
 /* Return nonzero if NAME contains ".." as a path name component.  */
This page took 0.037539 seconds and 4 git commands to generate.