]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
PR fastjar/28359 / CVE-2006-3619
authorMatthias Klose <doko@debian.org>
Sat, 5 Aug 2006 09:43:02 +0000 (09:43 +0000)
committerMatthias Klose <doko@gcc.gnu.org>
Sat, 5 Aug 2006 09:43:02 +0000 (09:43 +0000)
        2006-07-17  Richard Guenther  <rguenther@suse.de>
        * jartool.c (extract_jar): Do not allow directory traversal
        to parents of the extraction root.

From-SVN: r115946

fastjar/ChangeLog
fastjar/jartool.c

index 87f6a39d3dde1cace825db1cd49b3344d2ae3663..14b52a0f29ea25ee849e36008c067f9d30e4d66a 100644 (file)
@@ -1,3 +1,11 @@
+2006-08-04  Matthias Klose  <doko@debian.org>
+
+        PR fastjar/28359 / CVE-2006-3619
+
+       2006-07-17  Richard Guenther  <rguenther@suse.de>
+       * jartool.c (extract_jar): Do not allow directory traversal
+       to parents of the extraction root.
+
 2006-03-09  Release Manager
 
        * GCC 4.0.3 released.
index a3b059740cc6243275854d2892919e970a9d7712..a6f3c615f948d752235f03f68f0ad0d1e19c8ad4 100644 (file)
@@ -1724,6 +1724,7 @@ int extract_jar(int fd, char **files, int file_num){
       const ub1 *start = filename;
       char *tmp_buff;
       struct stat sbuf;
+      int depth = 0;
 
       tmp_buff = malloc(sizeof(char) * strlen((const char *)filename));
 
@@ -1744,7 +1745,14 @@ int extract_jar(int fd, char **files, int file_num){
 #ifdef DEBUG    
         printf("checking the existance of %s\n", tmp_buff);
 #endif
-
+       if(strcmp(tmp_buff, "..") == 0){
+         --depth;
+         if (depth < 0){
+           fprintf(stderr, "Traversal to parent directories during unpacking!\n");
+           exit(1);
+         }
+       } else if (strcmp(tmp_buff, ".") != 0)
+         ++depth;
         if(stat(tmp_buff, &sbuf) < 0){
           if(errno != ENOENT){
             perror("stat");