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 */
// 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);

View File

@ -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));

View File

@ -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

View File

@ -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);
}

View File

@ -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

View File

@ -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)

View File

@ -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);

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)) {
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);

View File

@ -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;

View File

@ -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);
}

View File

@ -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) {

View File

@ -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 */

View File

@ -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;

View File

@ -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;

View File

@ -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();