diff options
| author | Denis Vlasenko <vda.linux@googlemail.com> | 2008-07-06 07:00:11 +0000 |
|---|---|---|
| committer | Denis Vlasenko <vda.linux@googlemail.com> | 2008-07-06 07:00:11 +0000 |
| commit | d48e81f0cda73aca49cd852212a62e879cf35b86 (patch) | |
| tree | bc7f639f139f1fe5d65dd20b5819d41a5acf2cea | |
| parent | ff182a3d68462cb7ec38affa1afb04a06031862f (diff) | |
| download | busybox-w32-d48e81f0cda73aca49cd852212a62e879cf35b86.tar.gz busybox-w32-d48e81f0cda73aca49cd852212a62e879cf35b86.tar.bz2 busybox-w32-d48e81f0cda73aca49cd852212a62e879cf35b86.zip | |
mdev: do not follow symlinks in /sys (as was intended prior to rev 18811).
If this breaks things, please document why!
mdev,init: use shared code for fd sanitization
function old new delta
bb_daemonize_or_rexec 155 172 +17
mdev_main 500 505 +5
init_main 907 856 -51
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 2/1 up/down: 22/-51) Total: -29 bytes
| -rw-r--r-- | init/init.c | 15 | ||||
| -rw-r--r-- | libbb/vfork_daemon_rexec.c | 9 | ||||
| -rw-r--r-- | util-linux/mdev.c | 17 |
3 files changed, 21 insertions, 20 deletions
diff --git a/init/init.c b/init/init.c index 232896709..4b2bd9c77 100644 --- a/init/init.c +++ b/init/init.c | |||
| @@ -221,20 +221,7 @@ static void console_init(void) | |||
| 221 | } else { | 221 | } else { |
| 222 | /* Make sure fd 0,1,2 are not closed | 222 | /* Make sure fd 0,1,2 are not closed |
| 223 | * (so that they won't be used by future opens) */ | 223 | * (so that they won't be used by future opens) */ |
| 224 | 224 | bb_sanitize_stdio(); | |
| 225 | /* bb_sanitize_stdio(); - WRONG. | ||
| 226 | * It fails if "/dev/null" doesnt exist, and for init | ||
| 227 | * this is a real possibility! Open code it instead. */ | ||
| 228 | |||
| 229 | int fd = open(bb_dev_null, O_RDWR); | ||
| 230 | if (fd < 0) { | ||
| 231 | /* Give me _ANY_ open descriptor! */ | ||
| 232 | fd = xopen("/", O_RDONLY); /* we don't believe this can fail */ | ||
| 233 | } | ||
| 234 | while ((unsigned)fd < 2) | ||
| 235 | fd = dup(fd); | ||
| 236 | if (fd > 2) | ||
| 237 | close(fd); | ||
| 238 | } | 225 | } |
| 239 | 226 | ||
| 240 | s = getenv("TERM"); | 227 | s = getenv("TERM"); |
diff --git a/libbb/vfork_daemon_rexec.c b/libbb/vfork_daemon_rexec.c index 37d4c274e..da0dc03e5 100644 --- a/libbb/vfork_daemon_rexec.c +++ b/libbb/vfork_daemon_rexec.c | |||
| @@ -265,7 +265,14 @@ void FAST_FUNC bb_daemonize_or_rexec(int flags, char **argv) | |||
| 265 | close(2); | 265 | close(2); |
| 266 | } | 266 | } |
| 267 | 267 | ||
| 268 | fd = xopen(bb_dev_null, O_RDWR); | 268 | fd = open(bb_dev_null, O_RDWR); |
| 269 | if (fd < 0) { | ||
| 270 | /* NB: we can be called as bb_sanitize_stdio() from init | ||
| 271 | * or mdev, and there /dev/null may legitimately not (yet) exist! | ||
| 272 | * Do not use xopen above, but obtain _ANY_ open descriptor, | ||
| 273 | * even bogus one as below. */ | ||
| 274 | fd = xopen("/", O_RDONLY); /* don't believe this can fail */ | ||
| 275 | } | ||
| 269 | 276 | ||
| 270 | while ((unsigned)fd < 2) | 277 | while ((unsigned)fd < 2) |
| 271 | fd = dup(fd); /* have 0,1,2 open at least to /dev/null */ | 278 | fd = dup(fd); /* have 0,1,2 open at least to /dev/null */ |
diff --git a/util-linux/mdev.c b/util-linux/mdev.c index c7109373d..9c4938a70 100644 --- a/util-linux/mdev.c +++ b/util-linux/mdev.c | |||
| @@ -19,7 +19,8 @@ struct globals { | |||
| 19 | #define root_major (G.root_major) | 19 | #define root_major (G.root_major) |
| 20 | #define root_minor (G.root_minor) | 20 | #define root_minor (G.root_minor) |
| 21 | 21 | ||
| 22 | #define MAX_SYSFS_DEPTH 3 /* prevent infinite loops in /sys symlinks */ | 22 | /* Prevent infinite loops in /sys symlinks */ |
| 23 | #define MAX_SYSFS_DEPTH 3 | ||
| 23 | 24 | ||
| 24 | /* We use additional 64+ bytes in make_device() */ | 25 | /* We use additional 64+ bytes in make_device() */ |
| 25 | #define SCRATCH_SIZE 80 | 26 | #define SCRATCH_SIZE 80 |
| @@ -392,11 +393,17 @@ int mdev_main(int argc, char **argv) | |||
| 392 | char *env_path; | 393 | char *env_path; |
| 393 | RESERVE_CONFIG_BUFFER(temp, PATH_MAX + SCRATCH_SIZE); | 394 | RESERVE_CONFIG_BUFFER(temp, PATH_MAX + SCRATCH_SIZE); |
| 394 | 395 | ||
| 395 | #ifdef YOU_WANT_TO_DEBUG_HOTPLUG_EVENTS | 396 | /* We can be called as hotplug helper */ |
| 396 | /* Kernel cannot provide suitable stdio fds for us, do it ourself */ | 397 | /* Kernel cannot provide suitable stdio fds for us, do it ourself */ |
| 398 | #if 1 | ||
| 399 | bb_sanitize_stdio(); | ||
| 400 | #else | ||
| 401 | /* Debug code */ | ||
| 397 | /* Replace LOGFILE by other file or device name if you need */ | 402 | /* Replace LOGFILE by other file or device name if you need */ |
| 398 | #define LOGFILE "/dev/console" | 403 | #define LOGFILE "/dev/console" |
| 399 | xmove_fd(xopen("/dev/null", O_RDONLY), STDIN_FILENO); | 404 | /* Just making sure fd 0 is not closed, |
| 405 | * we don't really intend to read from it */ | ||
| 406 | xmove_fd(xopen("/", O_RDONLY), STDIN_FILENO); | ||
| 400 | xmove_fd(xopen(LOGFILE, O_WRONLY|O_APPEND), STDOUT_FILENO); | 407 | xmove_fd(xopen(LOGFILE, O_WRONLY|O_APPEND), STDOUT_FILENO); |
| 401 | xmove_fd(xopen(LOGFILE, O_WRONLY|O_APPEND), STDERR_FILENO); | 408 | xmove_fd(xopen(LOGFILE, O_WRONLY|O_APPEND), STDERR_FILENO); |
| 402 | #endif | 409 | #endif |
| @@ -414,11 +421,11 @@ int mdev_main(int argc, char **argv) | |||
| 414 | root_minor = minor(st.st_dev); | 421 | root_minor = minor(st.st_dev); |
| 415 | 422 | ||
| 416 | recursive_action("/sys/block", | 423 | recursive_action("/sys/block", |
| 417 | ACTION_RECURSE | ACTION_FOLLOWLINKS, | 424 | ACTION_RECURSE /* no ACTION_FOLLOWLINKS! */, |
| 418 | fileAction, dirAction, temp, 0); | 425 | fileAction, dirAction, temp, 0); |
| 419 | 426 | ||
| 420 | recursive_action("/sys/class", | 427 | recursive_action("/sys/class", |
| 421 | ACTION_RECURSE | ACTION_FOLLOWLINKS, | 428 | ACTION_RECURSE /* no ACTION_FOLLOWLINKS! */, |
| 422 | fileAction, dirAction, temp, 0); | 429 | fileAction, dirAction, temp, 0); |
| 423 | 430 | ||
| 424 | } else { | 431 | } else { |
