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
This commit is contained in:
parent
ff182a3d68
commit
d48e81f0cd
15
init/init.c
15
init/init.c
@ -221,20 +221,7 @@ static void console_init(void)
|
|||||||
} else {
|
} else {
|
||||||
/* Make sure fd 0,1,2 are not closed
|
/* Make sure fd 0,1,2 are not closed
|
||||||
* (so that they won't be used by future opens) */
|
* (so that they won't be used by future opens) */
|
||||||
|
bb_sanitize_stdio();
|
||||||
/* bb_sanitize_stdio(); - WRONG.
|
|
||||||
* It fails if "/dev/null" doesnt exist, and for init
|
|
||||||
* this is a real possibility! Open code it instead. */
|
|
||||||
|
|
||||||
int fd = open(bb_dev_null, O_RDWR);
|
|
||||||
if (fd < 0) {
|
|
||||||
/* Give me _ANY_ open descriptor! */
|
|
||||||
fd = xopen("/", O_RDONLY); /* we don't believe this can fail */
|
|
||||||
}
|
|
||||||
while ((unsigned)fd < 2)
|
|
||||||
fd = dup(fd);
|
|
||||||
if (fd > 2)
|
|
||||||
close(fd);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
s = getenv("TERM");
|
s = getenv("TERM");
|
||||||
|
@ -265,7 +265,14 @@ void FAST_FUNC bb_daemonize_or_rexec(int flags, char **argv)
|
|||||||
close(2);
|
close(2);
|
||||||
}
|
}
|
||||||
|
|
||||||
fd = xopen(bb_dev_null, O_RDWR);
|
fd = open(bb_dev_null, O_RDWR);
|
||||||
|
if (fd < 0) {
|
||||||
|
/* NB: we can be called as bb_sanitize_stdio() from init
|
||||||
|
* or mdev, and there /dev/null may legitimately not (yet) exist!
|
||||||
|
* Do not use xopen above, but obtain _ANY_ open descriptor,
|
||||||
|
* even bogus one as below. */
|
||||||
|
fd = xopen("/", O_RDONLY); /* don't believe this can fail */
|
||||||
|
}
|
||||||
|
|
||||||
while ((unsigned)fd < 2)
|
while ((unsigned)fd < 2)
|
||||||
fd = dup(fd); /* have 0,1,2 open at least to /dev/null */
|
fd = dup(fd); /* have 0,1,2 open at least to /dev/null */
|
||||||
|
@ -19,7 +19,8 @@ struct globals {
|
|||||||
#define root_major (G.root_major)
|
#define root_major (G.root_major)
|
||||||
#define root_minor (G.root_minor)
|
#define root_minor (G.root_minor)
|
||||||
|
|
||||||
#define MAX_SYSFS_DEPTH 3 /* prevent infinite loops in /sys symlinks */
|
/* Prevent infinite loops in /sys symlinks */
|
||||||
|
#define MAX_SYSFS_DEPTH 3
|
||||||
|
|
||||||
/* We use additional 64+ bytes in make_device() */
|
/* We use additional 64+ bytes in make_device() */
|
||||||
#define SCRATCH_SIZE 80
|
#define SCRATCH_SIZE 80
|
||||||
@ -392,11 +393,17 @@ int mdev_main(int argc, char **argv)
|
|||||||
char *env_path;
|
char *env_path;
|
||||||
RESERVE_CONFIG_BUFFER(temp, PATH_MAX + SCRATCH_SIZE);
|
RESERVE_CONFIG_BUFFER(temp, PATH_MAX + SCRATCH_SIZE);
|
||||||
|
|
||||||
#ifdef YOU_WANT_TO_DEBUG_HOTPLUG_EVENTS
|
/* We can be called as hotplug helper */
|
||||||
/* Kernel cannot provide suitable stdio fds for us, do it ourself */
|
/* Kernel cannot provide suitable stdio fds for us, do it ourself */
|
||||||
|
#if 1
|
||||||
|
bb_sanitize_stdio();
|
||||||
|
#else
|
||||||
|
/* Debug code */
|
||||||
/* Replace LOGFILE by other file or device name if you need */
|
/* Replace LOGFILE by other file or device name if you need */
|
||||||
#define LOGFILE "/dev/console"
|
#define LOGFILE "/dev/console"
|
||||||
xmove_fd(xopen("/dev/null", O_RDONLY), STDIN_FILENO);
|
/* Just making sure fd 0 is not closed,
|
||||||
|
* we don't really intend to read from it */
|
||||||
|
xmove_fd(xopen("/", O_RDONLY), STDIN_FILENO);
|
||||||
xmove_fd(xopen(LOGFILE, O_WRONLY|O_APPEND), STDOUT_FILENO);
|
xmove_fd(xopen(LOGFILE, O_WRONLY|O_APPEND), STDOUT_FILENO);
|
||||||
xmove_fd(xopen(LOGFILE, O_WRONLY|O_APPEND), STDERR_FILENO);
|
xmove_fd(xopen(LOGFILE, O_WRONLY|O_APPEND), STDERR_FILENO);
|
||||||
#endif
|
#endif
|
||||||
@ -414,11 +421,11 @@ int mdev_main(int argc, char **argv)
|
|||||||
root_minor = minor(st.st_dev);
|
root_minor = minor(st.st_dev);
|
||||||
|
|
||||||
recursive_action("/sys/block",
|
recursive_action("/sys/block",
|
||||||
ACTION_RECURSE | ACTION_FOLLOWLINKS,
|
ACTION_RECURSE /* no ACTION_FOLLOWLINKS! */,
|
||||||
fileAction, dirAction, temp, 0);
|
fileAction, dirAction, temp, 0);
|
||||||
|
|
||||||
recursive_action("/sys/class",
|
recursive_action("/sys/class",
|
||||||
ACTION_RECURSE | ACTION_FOLLOWLINKS,
|
ACTION_RECURSE /* no ACTION_FOLLOWLINKS! */,
|
||||||
fileAction, dirAction, temp, 0);
|
fileAction, dirAction, temp, 0);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
Loading…
Reference in New Issue
Block a user