← Commit list

5d84c2398

Rob Landley
Rob Landley
2005-12-20
SOURCE BUG Duration: 10s

Subject

Fix chroot, leave console alone if -c not specified, and yank debug code. (I still haven't set up a test environment to confirm this works...)

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 →

util-linux/switch_root.c+16 -11
@@ -56,17 +56,17 @@ static void delete_contents(char *directory)
closedir(dir);
// Directory should now be empty. Zap it.
- printf("rmdir %s\n",directory); // rmdir(directory);
+ rmdir(directory);
}
// It wasn't a directory. Zap it.
- } else printf("unlink %s\n",directory); //unlink(directory);
+ } else unlink(directory);
}
int switch_root_main(int argc, char *argv[])
{
- char *newroot, *console="/dev/console";
+ char *newroot, *console=NULL;
struct stat st1, st2;
struct statfs stfs;
@@ -98,19 +98,24 @@ int switch_root_main(int argc, char *argv[])
}
// Zap everything out of rootdev
+
delete_contents("/");
- // Overmount / with newdir
+ // Overmount / with newdir and chroot into it. The chdir is needed to
+ // recalculate "." and ".." links.
- if (mount(".", "/", NULL, MS_MOVE, NULL) || chdir("/"))
+ if (mount(".", "/", NULL, MS_MOVE, NULL) || chroot(".") || chdir("/"))
bb_error_msg_and_die("moving root");
- // Reopen stdin/stdout/stderr to /dev/console
- close(0);
- if(open(console, O_RDWR) < 0)
- bb_error_msg_and_die("Bad console '%s'",console);
- dup2(0, 1);
- dup2(0, 2);
+ // If a new console specified, redirect stdin/stdout/stderr to that.
+
+ if (console) {
+ close(0);
+ if(open(console, O_RDWR) < 0)
+ bb_error_msg_and_die("Bad console '%s'",console);
+ dup2(0, 1);
+ dup2(0, 2);
+ }
// Exec real init. (This is why we must be pid 1.)
execv(argv[optind],argv+optind+1);