When lstat returns an error (such as file not found), the value of st_mode is random garbage (under uClibc), leading to random triggering of the S_ISDIR() case when the destination will be a normal file which doesn't exist yet. I.E. checking the return value of lstat is not optional.
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)
| @@ -51,7 +51,6 @@ static const struct option install_long_options[] = { | |
| extern int install_main(int argc, char **argv) | |
| { | |
| - | struct stat statbuf; |
| mode_t mode; | |
| uid_t uid; | |
| gid_t gid; | |
| @@ -59,9 +58,7 @@ extern int install_main(int argc, char **argv) | |
| char *uid_str = "-1"; | |
| char *mode_str = "0755"; | |
| int copy_flags = FILEUTILS_DEREFERENCE | FILEUTILS_FORCE; | |
| - | int ret = EXIT_SUCCESS; |
| - | int flags; |
| - | int i; |
| + | int ret = EXIT_SUCCESS, flags, i, isdir; |
| bb_applet_long_options = install_long_options; | |
| bb_opt_complementally = "!s~d:d~s"; | |
| @@ -112,15 +109,16 @@ extern int install_main(int argc, char **argv) | |
| return(ret); | |
| } | |
| - | cp_mv_stat2(argv[argc - 1], &statbuf, lstat); |
| + | { |
| + | struct stat statbuf; |
| + | isdir = lstat(argv[argc - 1], &statbuf)<0 |
| + | ? 0 : S_ISDIR(statbuf.st_mode); |
| + | } |
| for (i = optind; i < argc - 1; i++) { | |
| unsigned char *dest; | |
| - | if (S_ISDIR(statbuf.st_mode)) { |
| - | dest = concat_path_file(argv[argc - 1], basename(argv[i])); |
| - | } else { |
| - | dest = argv[argc - 1]; |
| - | } |
| + | dest = argv[argc - 1]; |
| + | if (isdir) dest = concat_path_file(argv[argc - 1], basename(argv[i])); |
| ret |= copy_file(argv[i], dest, copy_flags); | |
| /* Set the file mode */ | |
| @@ -140,6 +138,7 @@ extern int install_main(int argc, char **argv) | |
| ret = EXIT_FAILURE; | |
| } | |
| } | |
| + | if(ENABLE_FEATURE_CLEAN_UP && isdir) free(dest); |
| } | |
| return(ret); | |