archival: added O_TRUNC so that when we overwrite files on unpack, we truncate them. Also spotted & fixed hard to trigger bug with extension handling.
This commit was genuinely broken at the time (not related to our build system): scripts/config/mkconfigs.c (2005-08-01 - 2006-10-05 arasi) uretilen bbconfigopts.h icine .config satirlarini kacissiz, ham newline'larla gömüyordu - gecerli C degildi, busybox'un kendi bb_mkdep araci bile parse edemiyordu (7d219aab7 ile duzeltildi, mkconfigs shell scripte cevrildi)
No binary (build failed)
—
(log yok)
| @@ -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); | |
| } | |
| @@ -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; | |
| @@ -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 */ | |
| @@ -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); | |
| @@ -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); | |