archival: added O_TRUNC so that when we overwrite files on unpack,
authorDenis Vlasenko <vda.linux@googlemail.com>
Sun, 3 Sep 2006 14:23:29 +0000 (14:23 -0000)
committerDenis Vlasenko <vda.linux@googlemail.com>
Sun, 3 Sep 2006 14:23:29 +0000 (14:23 -0000)
          we truncate them. Also spotted & fixed hard to trigger bug
          with extension handling.

archival/bunzip2.c
archival/gunzip.c
archival/uncompress.c
archival/unlzma.c
archival/unzip.c

index a970aeb205e5cae74fc10c9954ca180eb6891dad..9810e029010196cad6323f8a39828132a86957db 100644 (file)
@@ -41,17 +41,20 @@ int bunzip2_main(int argc, char **argv)
 
        if (filename) {
                struct stat stat_buf;
-               char *extension=filename+strlen(filename)-4;
-               if (strcmp(extension, ".bz2") != 0) {
+               /* extension = filename+strlen(filename)-4 is buggy:
+                * strlen may be less than 4 */
+               char *extension = strrchr(filename, '.');
+               if (!extension || strcmp(extension, ".bz2") != 0) {
                        bb_error_msg_and_die("Invalid extension");
                }
                xstat(filename, &stat_buf);
-               *extension=0;
-               dst_fd = xopen3(filename, O_WRONLY | O_CREAT, stat_buf.st_mode);
+               *extension = '\0';
+               dst_fd = xopen3(filename, O_WRONLY | O_CREAT | O_TRUNC,
+                               stat_buf.st_mode);
        } else dst_fd = STDOUT_FILENO;
        status = uncompressStream(src_fd, dst_fd);
        if(filename) {
-               if (!status) filename[strlen(filename)]='.';
+               if (!status) filename[strlen(filename)] = '.';
                if (unlink(filename) < 0) {
                        bb_error_msg_and_die("Couldn't remove %s", filename);
                }
index 3a1d1cb616b698be7fb1e4d56eaa7a55f021978b..7be94e1b8df0ae513f779d8cfb49e6a08b3e114f 100644 (file)
@@ -98,7 +98,8 @@ int gunzip_main(int argc, char **argv)
                        }
 
                        /* Open output file (with correct permissions) */
-                       dst_fd = xopen3(new_path, O_WRONLY | O_CREAT, stat_buf.st_mode);
+                       dst_fd = xopen3(new_path, O_WRONLY | O_CREAT | O_TRUNC,
+                                       stat_buf.st_mode);
 
                        /* If unzip succeeds remove the old file */
                        delete_path = old_path;
index ca775c787355909900b5af939997723d2b8c148b..8c466ebdf9d7df3597ef932c2ac82fa0638bb9e8 100644 (file)
@@ -55,7 +55,8 @@ int uncompress_main(int argc, char **argv)
 
                        /* Open output file */
                        xstat(compressed_file, &stat_buf);
-                       dst_fd = xopen3(uncompressed_file, O_WRONLY | O_CREAT,
+                       dst_fd = xopen3(uncompressed_file,
+                                       O_WRONLY | O_CREAT | O_TRUNC,
                                        stat_buf.st_mode);
 
                        /* If unzip succeeds remove the old file */
index fbd207ca174998b5ecd2fa1a393a7e70ae240d2a..00acea6e0e4f879c38226aabb9b63d5f10ecf25b 100644 (file)
@@ -37,14 +37,15 @@ int unlzma_main(int argc, char **argv)
 
        if (filename) {
                struct stat stat_buf;
-               char *extension = filename + strlen(filename) - 5;
-
-               if (strcmp(extension, ".lzma") != 0) {
+               /* bug: char *extension = filename + strlen(filename) - 5; */
+               char *extension = strrchr(filename, '.');
+               if (!extension || strcmp(extension, ".lzma") != 0) {
                        bb_error_msg_and_die("Invalid extension");
                }
                xstat(filename, &stat_buf);
-               *extension = 0;
-               dst_fd = xopen3(filename, O_WRONLY | O_CREAT, stat_buf.st_mode);
+               *extension = '\0';
+               dst_fd = xopen3(filename, O_WRONLY | O_CREAT | O_TRUNC,
+                               stat_buf.st_mode);
        } else
                dst_fd = STDOUT_FILENO;
        status = unlzma(src_fd, dst_fd);
index 6dd1d3597edef9c4b46a1ce4b2e1204a6f1f7164..709ebf81a8423fab18b7b3eb657f8b110a374af9 100644 (file)
@@ -333,7 +333,7 @@ int unzip_main(int argc, char **argv)
                        overwrite = o_always;
                case 'y': /* Open file and fall into unzip */
                        unzip_create_leading_dirs(dst_fn);
-                       dst_fd = xopen3(dst_fn, O_WRONLY | O_CREAT, 0777);
+                       dst_fd = xopen3(dst_fn, O_WRONLY | O_CREAT | O_TRUNC, 0777);
                case -1: /* Unzip */
                        if (verbosity == v_normal) {
                                printf("  inflating: %s\n", dst_fn);