syslogd: fix "readpath bug" by using readlink instead
libbb: rename xgetcwd and xreadlink
This commit is contained in:
parent
136f42f503
commit
6ca0444420
@ -92,7 +92,7 @@ int busybox_main(int argc, char **argv)
|
||||
|
||||
/* link */
|
||||
// XXX: FIXME: this is broken. Why not just use argv[0] ?
|
||||
busybox = xreadlink("/proc/self/exe");
|
||||
busybox = xmalloc_readlink_or_warn("/proc/self/exe");
|
||||
if (!busybox)
|
||||
return 1;
|
||||
install_links(busybox, use_symbolic_links);
|
||||
|
@ -273,8 +273,8 @@ static int writeTarHeader(struct TarBallInfo *tbInfo,
|
||||
tbInfo->hlInfo->name, 0);
|
||||
#endif
|
||||
} else if (S_ISLNK(statbuf->st_mode)) {
|
||||
char *lpath = xreadlink(fileName);
|
||||
if (!lpath) /* Already printed err msg inside xreadlink() */
|
||||
char *lpath = xmalloc_readlink_or_warn(fileName);
|
||||
if (!lpath)
|
||||
return FALSE;
|
||||
header.typeflag = SYMTYPE;
|
||||
strncpy(header.linkname, lpath, sizeof(header.linkname));
|
||||
|
@ -664,7 +664,7 @@ static int list_single(struct dnode *dn)
|
||||
break;
|
||||
case LIST_SYMLINK:
|
||||
if (S_ISLNK(dn->dstat.st_mode)) {
|
||||
char *lpath = xreadlink(dn->fullname);
|
||||
char *lpath = xmalloc_readlink_or_warn(dn->fullname);
|
||||
if (!lpath) break;
|
||||
printf(" -> ");
|
||||
#if ENABLE_FEATURE_LS_FILETYPES || ENABLE_FEATURE_LS_COLOR
|
||||
|
@ -16,7 +16,8 @@ int pwd_main(int argc, char **argv)
|
||||
{
|
||||
char *buf;
|
||||
|
||||
if ((buf = xgetcwd(NULL)) != NULL) {
|
||||
buf = xrealloc_getcwd_or_warn(NULL);
|
||||
if (buf != NULL) {
|
||||
puts(buf);
|
||||
fflush_stdout_and_exit(EXIT_SUCCESS);
|
||||
}
|
||||
|
@ -188,7 +188,7 @@ static void print_stat(char *pformat, size_t buf_len, char m,
|
||||
case 'N':
|
||||
strncat(pformat, "s", buf_len);
|
||||
if (S_ISLNK(statbuf->st_mode)) {
|
||||
char *linkname = xreadlink(filename);
|
||||
char *linkname = xmalloc_readlink_or_warn(filename);
|
||||
if (linkname == NULL) {
|
||||
bb_perror_msg("cannot read symbolic link '%s'", filename);
|
||||
return;
|
||||
@ -477,7 +477,7 @@ static int do_stat(char const *filename, char const *format)
|
||||
pw_ent = getpwuid(statbuf.st_uid);
|
||||
|
||||
if (S_ISLNK(statbuf.st_mode))
|
||||
linkname = xreadlink(filename);
|
||||
linkname = xmalloc_readlink_or_warn(filename);
|
||||
if (linkname)
|
||||
printf(" File: \"%s\" -> \"%s\"\n", filename, linkname);
|
||||
else
|
||||
|
@ -38,7 +38,7 @@ int readlink_main(int argc, char **argv)
|
||||
if (opt) {
|
||||
buf = realpath(fname, bb_common_bufsiz1);
|
||||
} else {
|
||||
buf = xreadlink(fname);
|
||||
buf = xmalloc_readlink_or_warn(fname);
|
||||
}
|
||||
|
||||
if (!buf)
|
||||
|
@ -258,8 +258,8 @@ extern int ndelay_off(int fd);
|
||||
extern DIR *xopendir(const char *path);
|
||||
extern DIR *warn_opendir(const char *path);
|
||||
|
||||
char *xgetcwd(char *cwd);
|
||||
char *xreadlink(const char *path);
|
||||
char *xrealloc_getcwd_or_warn(char *cwd);
|
||||
char *xmalloc_readlink_or_warn(const char *path);
|
||||
char *xmalloc_realpath(const char *path);
|
||||
extern void xstat(const char *filename, struct stat *buf);
|
||||
extern pid_t spawn(char **argv);
|
||||
|
@ -233,7 +233,7 @@ int copy_file(const char *source, const char *dest, int flags)
|
||||
} else if (S_ISLNK(source_stat.st_mode)) {
|
||||
char *lpath;
|
||||
|
||||
lpath = xreadlink(source);
|
||||
lpath = xmalloc_readlink_or_warn(source);
|
||||
if (symlink(lpath, dest) < 0) {
|
||||
bb_perror_msg("cannot create symlink '%s'", dest);
|
||||
free(lpath);
|
||||
|
@ -1090,7 +1090,7 @@ static void parse_prompt(const char *prmt_ptr)
|
||||
size_t cur_prmt_len = 0;
|
||||
char flg_not_length = '[';
|
||||
char *prmt_mem_ptr = xzalloc(1);
|
||||
char *pwd_buf = xgetcwd(0);
|
||||
char *pwd_buf = xrealloc_getcwd_or_warn(NULL);
|
||||
char buf2[PATH_MAX + 1];
|
||||
char buf[2];
|
||||
char c;
|
||||
|
@ -16,7 +16,7 @@ char *bb_simplify_path(const char *path)
|
||||
if (path[0] == '/')
|
||||
start = xstrdup(path);
|
||||
else {
|
||||
s = xgetcwd(NULL);
|
||||
s = xrealloc_getcwd_or_warn(NULL);
|
||||
start = concat_path_file(s, path);
|
||||
free(s);
|
||||
}
|
||||
|
@ -18,7 +18,7 @@
|
||||
*/
|
||||
|
||||
char *
|
||||
xgetcwd(char *cwd)
|
||||
xrealloc_getcwd_or_warn(char *cwd)
|
||||
{
|
||||
char *ret;
|
||||
unsigned path_max;
|
||||
@ -26,7 +26,7 @@ xgetcwd(char *cwd)
|
||||
path_max = (unsigned) PATH_MAX;
|
||||
path_max += 2; /* The getcwd docs say to do this. */
|
||||
|
||||
if (cwd==0)
|
||||
if (cwd == NULL)
|
||||
cwd = xmalloc(path_max);
|
||||
|
||||
while ((ret = getcwd(cwd, path_max)) == NULL && errno == ERANGE) {
|
||||
|
@ -11,7 +11,7 @@
|
||||
* yourself. You have been warned.
|
||||
*/
|
||||
|
||||
char *xreadlink(const char *path)
|
||||
char *xmalloc_readlink_or_warn(const char *path)
|
||||
{
|
||||
enum { GROWBY = 80 }; /* how large we will grow strings by */
|
||||
|
||||
|
@ -423,8 +423,8 @@ static const struct built_in_command bltins[] = {
|
||||
static const char *set_cwd(void)
|
||||
{
|
||||
if (cwd == bb_msg_unknown)
|
||||
cwd = NULL; /* xgetcwd(arg) called free(arg) */
|
||||
cwd = xgetcwd((char *)cwd);
|
||||
cwd = NULL; /* xrealloc_getcwd_or_warn(arg) called free(arg) */
|
||||
cwd = xrealloc_getcwd_or_warn((char *)cwd);
|
||||
if (!cwd)
|
||||
cwd = bb_msg_unknown;
|
||||
return cwd;
|
||||
|
@ -217,7 +217,7 @@ static int builtin_cd(struct child_prog *child)
|
||||
bb_perror_msg("cd: %s", newdir);
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
cwd = xgetcwd((char *)cwd);
|
||||
cwd = xrealloc_getcwd_or_warn((char *)cwd);
|
||||
if (!cwd)
|
||||
cwd = bb_msg_unknown;
|
||||
return EXIT_SUCCESS;
|
||||
@ -342,7 +342,7 @@ static int builtin_jobs(struct child_prog *child)
|
||||
/* built-in 'pwd' handler */
|
||||
static int builtin_pwd(struct child_prog ATTRIBUTE_UNUSED *dummy)
|
||||
{
|
||||
cwd = xgetcwd((char *)cwd);
|
||||
cwd = xrealloc_getcwd_or_warn((char *)cwd);
|
||||
if (!cwd)
|
||||
cwd = bb_msg_unknown;
|
||||
puts(cwd);
|
||||
@ -1569,7 +1569,7 @@ int lash_main(int argc_l, char **argv_l)
|
||||
}
|
||||
|
||||
/* initialize the cwd -- this is never freed...*/
|
||||
cwd = xgetcwd(0);
|
||||
cwd = xrealloc_getcwd_or_warn(NULL);
|
||||
if (!cwd)
|
||||
cwd = bb_msg_unknown;
|
||||
|
||||
|
@ -24,9 +24,6 @@
|
||||
|
||||
#define DEBUG 0
|
||||
|
||||
/* Path to the unix socket */
|
||||
static const char *dev_log_name;
|
||||
|
||||
/* Path for the file where all log messages are written */
|
||||
static const char *logFilePath = "/var/log/messages";
|
||||
static int logFD = -1;
|
||||
@ -446,7 +443,6 @@ static void quit_signal(int sig)
|
||||
{
|
||||
timestamp_and_log(LOG_SYSLOG | LOG_INFO, (char*)"syslogd exiting", 0);
|
||||
puts("syslogd exiting");
|
||||
unlink(dev_log_name);
|
||||
if (ENABLE_FEATURE_IPC_SYSLOG)
|
||||
ipcsyslog_cleanup();
|
||||
exit(1);
|
||||
@ -464,9 +460,9 @@ static void do_syslogd(void) ATTRIBUTE_NORETURN;
|
||||
static void do_syslogd(void)
|
||||
{
|
||||
struct sockaddr_un sunx;
|
||||
socklen_t addr_len;
|
||||
int sock_fd;
|
||||
fd_set fds;
|
||||
char *dev_log_name;
|
||||
|
||||
/* Set up signal handlers */
|
||||
signal(SIGINT, quit_signal);
|
||||
@ -480,22 +476,33 @@ static void do_syslogd(void)
|
||||
signal(SIGALRM, do_mark);
|
||||
alarm(markInterval);
|
||||
|
||||
dev_log_name = xmalloc_realpath(_PATH_LOG);
|
||||
if (!dev_log_name)
|
||||
dev_log_name = _PATH_LOG;
|
||||
|
||||
/* Unlink old /dev/log (or object it points to) */
|
||||
unlink(dev_log_name);
|
||||
|
||||
memset(&sunx, 0, sizeof(sunx));
|
||||
sunx.sun_family = AF_UNIX;
|
||||
strncpy(sunx.sun_path, dev_log_name, sizeof(sunx.sun_path));
|
||||
sock_fd = xsocket(AF_UNIX, SOCK_DGRAM, 0);
|
||||
addr_len = sizeof(sunx.sun_family) + strlen(sunx.sun_path);
|
||||
xbind(sock_fd, (struct sockaddr *) &sunx, addr_len);
|
||||
strcpy(sunx.sun_path, "/dev/log");
|
||||
|
||||
if (chmod(dev_log_name, 0666) < 0) {
|
||||
bb_perror_msg_and_die("cannot set permission on %s", dev_log_name);
|
||||
/* Unlink old /dev/log or object it points to. */
|
||||
/* (if it exists, bind will fail) */
|
||||
logmode = LOGMODE_NONE;
|
||||
dev_log_name = xmalloc_readlink_or_warn("/dev/log");
|
||||
logmode = LOGMODE_STDIO;
|
||||
if (dev_log_name) {
|
||||
int fd = xopen(".", O_NONBLOCK);
|
||||
xchdir("/dev");
|
||||
/* we do not check whether this is a link also */
|
||||
unlink(dev_log_name);
|
||||
fchdir(fd);
|
||||
close(fd);
|
||||
safe_strncpy(sunx.sun_path, dev_log_name, sizeof(sunx.sun_path));
|
||||
free(dev_log_name);
|
||||
} else {
|
||||
unlink("/dev/log");
|
||||
}
|
||||
|
||||
sock_fd = xsocket(AF_UNIX, SOCK_DGRAM, 0);
|
||||
xbind(sock_fd, (struct sockaddr *) &sunx, sizeof(sunx));
|
||||
|
||||
if (chmod("/dev/log", 0666) < 0) {
|
||||
bb_perror_msg_and_die("cannot set permission on /dev/log");
|
||||
}
|
||||
if (ENABLE_FEATURE_IPC_SYSLOG && (option_mask32 & OPT_circularlog)) {
|
||||
ipcsyslog_init();
|
||||
|
Loading…
Reference in New Issue
Block a user