← Commit list

ae907f38f

Rob Landley
Rob Landley
2005-10-09
SOURCE BUG Duration: 5s

Subject

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.

SOURCE BUG

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)

→ Bu hatanin tam hikayesini ve duzeltme diffini gor

Binary

No binary (build failed)

Architecture & Compiler Flags

Architecture: x86_64-linux-gnu Compiler: gcc (Ubuntu 11.4.0-1ubuntu1~22.04.3) 11.4.0

—

Build Log

(log yok)

Commit Diff GitHub →

coreutils/install.c+9 -10
@@ -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);