syslogd: fix "readpath bug" by using readlink instead

libbb: rename xgetcwd and xreadlink
This commit is contained in:
Denis Vlasenko 2007-02-11 16:19:28 +00:00
parent 136f42f503
commit 6ca0444420
15 changed files with 47 additions and 39 deletions

View File

@ -92,7 +92,7 @@ int busybox_main(int argc, char **argv)
/* link */ /* link */
// XXX: FIXME: this is broken. Why not just use argv[0] ? // 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) if (!busybox)
return 1; return 1;
install_links(busybox, use_symbolic_links); install_links(busybox, use_symbolic_links);

View File

@ -273,8 +273,8 @@ static int writeTarHeader(struct TarBallInfo *tbInfo,
tbInfo->hlInfo->name, 0); tbInfo->hlInfo->name, 0);
#endif #endif
} else if (S_ISLNK(statbuf->st_mode)) { } else if (S_ISLNK(statbuf->st_mode)) {
char *lpath = xreadlink(fileName); char *lpath = xmalloc_readlink_or_warn(fileName);
if (!lpath) /* Already printed err msg inside xreadlink() */ if (!lpath)
return FALSE; return FALSE;
header.typeflag = SYMTYPE; header.typeflag = SYMTYPE;
strncpy(header.linkname, lpath, sizeof(header.linkname)); strncpy(header.linkname, lpath, sizeof(header.linkname));

View File

@ -664,7 +664,7 @@ static int list_single(struct dnode *dn)
break; break;
case LIST_SYMLINK: case LIST_SYMLINK:
if (S_ISLNK(dn->dstat.st_mode)) { if (S_ISLNK(dn->dstat.st_mode)) {
char *lpath = xreadlink(dn->fullname); char *lpath = xmalloc_readlink_or_warn(dn->fullname);
if (!lpath) break; if (!lpath) break;
printf(" -> "); printf(" -> ");
#if ENABLE_FEATURE_LS_FILETYPES || ENABLE_FEATURE_LS_COLOR #if ENABLE_FEATURE_LS_FILETYPES || ENABLE_FEATURE_LS_COLOR

View File

@ -16,7 +16,8 @@ int pwd_main(int argc, char **argv)
{ {
char *buf; char *buf;
if ((buf = xgetcwd(NULL)) != NULL) { buf = xrealloc_getcwd_or_warn(NULL);
if (buf != NULL) {
puts(buf); puts(buf);
fflush_stdout_and_exit(EXIT_SUCCESS); fflush_stdout_and_exit(EXIT_SUCCESS);
} }

View File

@ -188,7 +188,7 @@ static void print_stat(char *pformat, size_t buf_len, char m,
case 'N': case 'N':
strncat(pformat, "s", buf_len); strncat(pformat, "s", buf_len);
if (S_ISLNK(statbuf->st_mode)) { if (S_ISLNK(statbuf->st_mode)) {
char *linkname = xreadlink(filename); char *linkname = xmalloc_readlink_or_warn(filename);
if (linkname == NULL) { if (linkname == NULL) {
bb_perror_msg("cannot read symbolic link '%s'", filename); bb_perror_msg("cannot read symbolic link '%s'", filename);
return; return;
@ -477,7 +477,7 @@ static int do_stat(char const *filename, char const *format)
pw_ent = getpwuid(statbuf.st_uid); pw_ent = getpwuid(statbuf.st_uid);
if (S_ISLNK(statbuf.st_mode)) if (S_ISLNK(statbuf.st_mode))
linkname = xreadlink(filename); linkname = xmalloc_readlink_or_warn(filename);
if (linkname) if (linkname)
printf(" File: \"%s\" -> \"%s\"\n", filename, linkname); printf(" File: \"%s\" -> \"%s\"\n", filename, linkname);
else else

View File

@ -38,7 +38,7 @@ int readlink_main(int argc, char **argv)
if (opt) { if (opt) {
buf = realpath(fname, bb_common_bufsiz1); buf = realpath(fname, bb_common_bufsiz1);
} else { } else {
buf = xreadlink(fname); buf = xmalloc_readlink_or_warn(fname);
} }
if (!buf) if (!buf)

View File

@ -258,8 +258,8 @@ extern int ndelay_off(int fd);
extern DIR *xopendir(const char *path); extern DIR *xopendir(const char *path);
extern DIR *warn_opendir(const char *path); extern DIR *warn_opendir(const char *path);
char *xgetcwd(char *cwd); char *xrealloc_getcwd_or_warn(char *cwd);
char *xreadlink(const char *path); char *xmalloc_readlink_or_warn(const char *path);
char *xmalloc_realpath(const char *path); char *xmalloc_realpath(const char *path);
extern void xstat(const char *filename, struct stat *buf); extern void xstat(const char *filename, struct stat *buf);
extern pid_t spawn(char **argv); extern pid_t spawn(char **argv);

View File

@ -233,7 +233,7 @@ int copy_file(const char *source, const char *dest, int flags)
} else if (S_ISLNK(source_stat.st_mode)) { } else if (S_ISLNK(source_stat.st_mode)) {
char *lpath; char *lpath;
lpath = xreadlink(source); lpath = xmalloc_readlink_or_warn(source);
if (symlink(lpath, dest) < 0) { if (symlink(lpath, dest) < 0) {
bb_perror_msg("cannot create symlink '%s'", dest); bb_perror_msg("cannot create symlink '%s'", dest);
free(lpath); free(lpath);

View File

@ -1090,7 +1090,7 @@ static void parse_prompt(const char *prmt_ptr)
size_t cur_prmt_len = 0; size_t cur_prmt_len = 0;
char flg_not_length = '['; char flg_not_length = '[';
char *prmt_mem_ptr = xzalloc(1); 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 buf2[PATH_MAX + 1];
char buf[2]; char buf[2];
char c; char c;

View File

@ -16,7 +16,7 @@ char *bb_simplify_path(const char *path)
if (path[0] == '/') if (path[0] == '/')
start = xstrdup(path); start = xstrdup(path);
else { else {
s = xgetcwd(NULL); s = xrealloc_getcwd_or_warn(NULL);
start = concat_path_file(s, path); start = concat_path_file(s, path);
free(s); free(s);
} }

View File

@ -18,7 +18,7 @@
*/ */
char * char *
xgetcwd(char *cwd) xrealloc_getcwd_or_warn(char *cwd)
{ {
char *ret; char *ret;
unsigned path_max; unsigned path_max;
@ -26,7 +26,7 @@ xgetcwd(char *cwd)
path_max = (unsigned) PATH_MAX; path_max = (unsigned) PATH_MAX;
path_max += 2; /* The getcwd docs say to do this. */ path_max += 2; /* The getcwd docs say to do this. */
if (cwd==0) if (cwd == NULL)
cwd = xmalloc(path_max); cwd = xmalloc(path_max);
while ((ret = getcwd(cwd, path_max)) == NULL && errno == ERANGE) { while ((ret = getcwd(cwd, path_max)) == NULL && errno == ERANGE) {

View File

@ -11,7 +11,7 @@
* yourself. You have been warned. * 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 */ enum { GROWBY = 80 }; /* how large we will grow strings by */

View File

@ -423,8 +423,8 @@ static const struct built_in_command bltins[] = {
static const char *set_cwd(void) static const char *set_cwd(void)
{ {
if (cwd == bb_msg_unknown) if (cwd == bb_msg_unknown)
cwd = NULL; /* xgetcwd(arg) called free(arg) */ cwd = NULL; /* xrealloc_getcwd_or_warn(arg) called free(arg) */
cwd = xgetcwd((char *)cwd); cwd = xrealloc_getcwd_or_warn((char *)cwd);
if (!cwd) if (!cwd)
cwd = bb_msg_unknown; cwd = bb_msg_unknown;
return cwd; return cwd;

View File

@ -217,7 +217,7 @@ static int builtin_cd(struct child_prog *child)
bb_perror_msg("cd: %s", newdir); bb_perror_msg("cd: %s", newdir);
return EXIT_FAILURE; return EXIT_FAILURE;
} }
cwd = xgetcwd((char *)cwd); cwd = xrealloc_getcwd_or_warn((char *)cwd);
if (!cwd) if (!cwd)
cwd = bb_msg_unknown; cwd = bb_msg_unknown;
return EXIT_SUCCESS; return EXIT_SUCCESS;
@ -342,7 +342,7 @@ static int builtin_jobs(struct child_prog *child)
/* built-in 'pwd' handler */ /* built-in 'pwd' handler */
static int builtin_pwd(struct child_prog ATTRIBUTE_UNUSED *dummy) static int builtin_pwd(struct child_prog ATTRIBUTE_UNUSED *dummy)
{ {
cwd = xgetcwd((char *)cwd); cwd = xrealloc_getcwd_or_warn((char *)cwd);
if (!cwd) if (!cwd)
cwd = bb_msg_unknown; cwd = bb_msg_unknown;
puts(cwd); puts(cwd);
@ -1569,7 +1569,7 @@ int lash_main(int argc_l, char **argv_l)
} }
/* initialize the cwd -- this is never freed...*/ /* initialize the cwd -- this is never freed...*/
cwd = xgetcwd(0); cwd = xrealloc_getcwd_or_warn(NULL);
if (!cwd) if (!cwd)
cwd = bb_msg_unknown; cwd = bb_msg_unknown;

View File

@ -24,9 +24,6 @@
#define DEBUG 0 #define DEBUG 0
/* Path to the unix socket */
static const char *dev_log_name;
/* Path for the file where all log messages are written */ /* Path for the file where all log messages are written */
static const char *logFilePath = "/var/log/messages"; static const char *logFilePath = "/var/log/messages";
static int logFD = -1; 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); timestamp_and_log(LOG_SYSLOG | LOG_INFO, (char*)"syslogd exiting", 0);
puts("syslogd exiting"); puts("syslogd exiting");
unlink(dev_log_name);
if (ENABLE_FEATURE_IPC_SYSLOG) if (ENABLE_FEATURE_IPC_SYSLOG)
ipcsyslog_cleanup(); ipcsyslog_cleanup();
exit(1); exit(1);
@ -464,9 +460,9 @@ static void do_syslogd(void) ATTRIBUTE_NORETURN;
static void do_syslogd(void) static void do_syslogd(void)
{ {
struct sockaddr_un sunx; struct sockaddr_un sunx;
socklen_t addr_len;
int sock_fd; int sock_fd;
fd_set fds; fd_set fds;
char *dev_log_name;
/* Set up signal handlers */ /* Set up signal handlers */
signal(SIGINT, quit_signal); signal(SIGINT, quit_signal);
@ -480,22 +476,33 @@ static void do_syslogd(void)
signal(SIGALRM, do_mark); signal(SIGALRM, do_mark);
alarm(markInterval); 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)); memset(&sunx, 0, sizeof(sunx));
sunx.sun_family = AF_UNIX; sunx.sun_family = AF_UNIX;
strncpy(sunx.sun_path, dev_log_name, sizeof(sunx.sun_path)); strcpy(sunx.sun_path, "/dev/log");
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);
if (chmod(dev_log_name, 0666) < 0) { /* Unlink old /dev/log or object it points to. */
bb_perror_msg_and_die("cannot set permission on %s", dev_log_name); /* (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)) { if (ENABLE_FEATURE_IPC_SYSLOG && (option_mask32 & OPT_circularlog)) {
ipcsyslog_init(); ipcsyslog_init();