bb_full_fd_action: remove potential xmalloc from NOFORK path

cat: stop using stdio.h opens
libbb: introduce & use open[3]_or_warn
function                                             old     new   delta
open3_or_warn                                          -      54     +54
bb_cat                                               115     144     +29
open_or_warn                                           -      25     +25
unlzma                                              2404    2412      +8
chattr_main                                          334     339      +5
xstrtoul_range_sfx                                   251     255      +4
telnet_main                                         1514    1510      -4
static.opt                                             4       -      -4
qgravechar                                           122     118      -4
fuser_add_pid                                         61      54      -7
fuser_add_inode                                      154     147      -7
writeFileToTarball                                  1542    1534      -8
refresh                                             1156    1148      -8
do_show                                              856     846     -10
read_leases                                          212     200     -12
setup_redirects                                      236     222     -14
iproute_list_or_flush                               1582    1568     -14
read_config                                          427     411     -16
write_leases                                         284     264     -20
hash_file                                            338     318     -20
copy_file                                           1760    1740     -20
do_iproute                                          2610    2588     -22
bb_full_fd_action                                    320     269     -51
open_to_or_warn                                      103      49     -54
fuser_main                                          1660    1596     -64
.rodata                                           131160  131096     -64
------------------------------------------------------------------------------
(add/remove: 2/1 grow/shrink: 4/19 up/down: 125/-423)        Total: -298 bytes
This commit is contained in:
Denis Vlasenko 2007-04-11 23:20:53 +00:00
parent d7c8196c1b
commit 50f7f446ec
20 changed files with 186 additions and 165 deletions

View File

@ -20,16 +20,11 @@ enum {
static static
int open_to_or_warn(int to_fd, const char *filename, int flags, int mode) int open_to_or_warn(int to_fd, const char *filename, int flags, int mode)
{ {
int fd = open(filename, flags, mode); int fd = open3_or_warn(filename, flags, mode);
if (fd < 0) { if (fd < 0) {
bb_perror_msg("%s", filename);
return 1; return 1;
} }
if (fd != to_fd) { xmove_fd(fd, to_fd);
if (dup2(fd, to_fd) < 0)
bb_perror_msg_and_die("cannot dup");
close(fd);
}
return 0; return 0;
} }

View File

@ -440,9 +440,8 @@ static int writeFileToTarball(const char *fileName, struct stat *statbuf,
/* Is this a regular file? */ /* Is this a regular file? */
if (tbInfo->hlInfo == NULL && S_ISREG(statbuf->st_mode)) { if (tbInfo->hlInfo == NULL && S_ISREG(statbuf->st_mode)) {
/* open the file we want to archive, and make sure all is well */ /* open the file we want to archive, and make sure all is well */
inputFileFd = open(fileName, O_RDONLY); inputFileFd = open_or_warn(fileName, O_RDONLY);
if (inputFileFd < 0) { if (inputFileFd < 0) {
bb_perror_msg("%s: cannot open", fileName);
return FALSE; return FALSE;
} }
} }
@ -455,7 +454,7 @@ static int writeFileToTarball(const char *fileName, struct stat *statbuf,
/* If it was a regular file, write out the body */ /* If it was a regular file, write out the body */
if (inputFileFd >= 0) { if (inputFileFd >= 0) {
size_t readSize; size_t readSize;
/* Wwrite the file to the archive. */ /* Write the file to the archive. */
/* We record size into header first, */ /* We record size into header first, */
/* and then write out file. If file shrinks in between, */ /* and then write out file. If file shrinks in between, */
/* tar will be corrupted. So we don't allow for that. */ /* tar will be corrupted. So we don't allow for that. */

View File

@ -19,18 +19,21 @@ int bb_cat(char **argv)
{ {
static const char *const argv_dash[] = { "-", NULL }; static const char *const argv_dash[] = { "-", NULL };
FILE *f; int fd;
int retval = EXIT_SUCCESS; int retval = EXIT_SUCCESS;
if (!*argv) if (!*argv)
argv = (char**) &argv_dash; argv = (char**) &argv_dash;
do { do {
f = fopen_or_warn_stdin(*argv); fd = STDIN_FILENO;
if (f) { if (!LONE_DASH(*argv))
fd = open_or_warn(*argv, O_RDONLY);
if (fd >= 0) {
/* This is not an xfunc - never exits */ /* This is not an xfunc - never exits */
off_t r = bb_copyfd_eof(fileno(f), STDOUT_FILENO); off_t r = bb_copyfd_eof(fd, STDOUT_FILENO);
fclose_if_not_stdin(f); if (fd != STDIN_FILENO)
close(fd);
if (r >= 0) if (r >= 0)
continue; continue;
} }

View File

@ -30,7 +30,7 @@ static int convert(char *fn)
/* /*
The file is then created with mode read/write and The file is then created with mode read/write and
permissions 0666 for glibc 2.0.6 and earlier or permissions 0666 for glibc 2.0.6 and earlier or
0600 for glibc 2.0.7 and later. 0600 for glibc 2.0.7 and later.
*/ */
snprintf(bb_common_bufsiz1, sizeof(bb_common_bufsiz1), "%sXXXXXX", fn); snprintf(bb_common_bufsiz1, sizeof(bb_common_bufsiz1), "%sXXXXXX", fn);
/* /*
@ -38,8 +38,8 @@ static int convert(char *fn)
hold the full path. However if the output is truncated the hold the full path. However if the output is truncated the
subsequent call to mkstemp would fail. subsequent call to mkstemp would fail.
*/ */
if ((i = mkstemp(&bb_common_bufsiz1[0])) == -1 i = mkstemp(&bb_common_bufsiz1[0]);
|| chmod(bb_common_bufsiz1, 0600) == -1) { if (i == -1 || chmod(bb_common_bufsiz1, 0600) == -1) {
bb_perror_nomsg_and_die(); bb_perror_nomsg_and_die();
} }
out = fdopen(i, "w+"); out = fdopen(i, "w+");

View File

@ -38,9 +38,8 @@ static uint8_t *hash_file(const char *filename, hash_algo_t hash_algo)
src_fd = STDIN_FILENO; src_fd = STDIN_FILENO;
if (NOT_LONE_DASH(filename)) { if (NOT_LONE_DASH(filename)) {
src_fd = open(filename, O_RDONLY); src_fd = open_or_warn(filename, O_RDONLY);
if (src_fd < 0) { if (src_fd < 0) {
bb_perror_msg("%s", filename);
return NULL; return NULL;
} }
} }

View File

@ -396,7 +396,6 @@ static void load_fs_info(const char *filename)
f = fopen_or_warn(filename, "r"); f = fopen_or_warn(filename, "r");
if (f == NULL) { if (f == NULL) {
/*bb_perror_msg("WARNING: cannot open %s", filename);*/
return; return;
} }
while (1) { while (1) {

View File

@ -288,6 +288,8 @@ void xunlink(const char *pathname);
void xstat(const char *pathname, struct stat *buf); void xstat(const char *pathname, struct stat *buf);
int xopen(const char *pathname, int flags); int xopen(const char *pathname, int flags);
int xopen3(const char *pathname, int flags, int mode); int xopen3(const char *pathname, int flags, int mode);
int open_or_warn(const char *pathname, int flags);
int open3_or_warn(const char *pathname, int flags, int mode);
off_t xlseek(int fd, off_t offset, int whence); off_t xlseek(int fd, off_t offset, int whence);
off_t fdlength(int fd); off_t fdlength(int fd);

View File

@ -217,9 +217,8 @@ int copy_file(const char *source, const char *dest, int flags)
add_to_ino_dev_hashtable(&source_stat, dest); add_to_ino_dev_hashtable(&source_stat, dest);
} }
src_fd = open(source, O_RDONLY); src_fd = open_or_warn(source, O_RDONLY);
if (src_fd == -1) { if (src_fd < 0) {
bb_perror_msg("cannot open '%s'", source);
return -1; return -1;
} }
@ -237,9 +236,8 @@ int copy_file(const char *source, const char *dest, int flags)
return ovr; return ovr;
} }
/* It shouldn't exist. If it exists, do not open (symlink attack?) */ /* It shouldn't exist. If it exists, do not open (symlink attack?) */
dst_fd = open(dest, O_WRONLY|O_CREAT|O_EXCL, source_stat.st_mode); dst_fd = open3_or_warn(dest, O_WRONLY|O_CREAT|O_EXCL, source_stat.st_mode);
if (dst_fd == -1) { if (dst_fd < 0) {
bb_perror_msg("cannot open '%s'", dest);
close(src_fd); close(src_fd);
return -1; return -1;
} }

View File

@ -14,14 +14,13 @@
#define BUFSIZ 4096 #define BUFSIZ 4096
#endif #endif
/* Used by NOFORK applets (e.g. cat) - must be very careful /* Used by NOFORK applets (e.g. cat) - must not use xmalloc */
* when calling xfuncs, allocating memory, with signals, termios, etc... */
static off_t bb_full_fd_action(int src_fd, int dst_fd, off_t size) static off_t bb_full_fd_action(int src_fd, int dst_fd, off_t size)
{ {
int status = -1; int status = -1;
off_t total = 0; off_t total = 0;
RESERVE_CONFIG_BUFFER(buffer, BUFSIZ); char buffer[BUFSIZ];
if (src_fd < 0) if (src_fd < 0)
goto out; goto out;
@ -63,7 +62,6 @@ static off_t bb_full_fd_action(int src_fd, int dst_fd, off_t size)
} }
} }
out: out:
RELEASE_CONFIG_BUFFER(buffer);
return status ? -1 : total; return status ? -1 : total;
} }

View File

@ -11,7 +11,7 @@
* is a command line arg. Since often that arg is '-' (meaning stdin), * is a command line arg. Since often that arg is '-' (meaning stdin),
* we avoid testing everywhere by consolidating things in this routine. * we avoid testing everywhere by consolidating things in this routine.
* *
* Note: We also consider "" to main stdin (for 'cmp' at least). * Note: we also consider "" to mean stdin (for 'cmp' at least).
*/ */
#include "libbb.h" #include "libbb.h"

View File

@ -106,31 +106,46 @@ FILE *xfopen(const char *path, const char *mode)
{ {
FILE *fp = fopen(path, mode); FILE *fp = fopen(path, mode);
if (fp == NULL) if (fp == NULL)
bb_perror_msg_and_die("%s", path); bb_perror_msg_and_die("cannot open '%s'", path);
return fp; return fp;
} }
// Die if we can't open an existing file and return an fd. // Die if we can't open a file and return a fd.
int xopen(const char *pathname, int flags)
{
//if (ENABLE_DEBUG && (flags & O_CREAT))
// bb_error_msg_and_die("xopen() with O_CREAT");
return xopen3(pathname, flags, 0666);
}
// Die if we can't open a new file and return an fd.
int xopen3(const char *pathname, int flags, int mode) int xopen3(const char *pathname, int flags, int mode)
{ {
int ret; int ret;
ret = open(pathname, flags, mode); ret = open(pathname, flags, mode);
if (ret < 0) { if (ret < 0) {
bb_perror_msg_and_die("%s", pathname); bb_perror_msg_and_die("cannot open '%s'", pathname);
} }
return ret; return ret;
} }
// Die if we can't open an existing file and return a fd.
int xopen(const char *pathname, int flags)
{
return xopen3(pathname, flags, 0666);
}
// Warn if we can't open a file and return a fd.
int open3_or_warn(const char *pathname, int flags, int mode)
{
int ret;
ret = open(pathname, flags, mode);
if (ret < 0) {
bb_perror_msg("cannot open '%s'", pathname);
}
return ret;
}
// Warn if we can't open a file and return a fd.
int open_or_warn(const char *pathname, int flags)
{
return open3_or_warn(pathname, flags, 0666);
}
void xunlink(const char *pathname) void xunlink(const char *pathname)
{ {
if (unlink(pathname)) if (unlink(pathname))
@ -184,6 +199,7 @@ off_t xlseek(int fd, off_t offset, int whence)
void die_if_ferror(FILE *fp, const char *fn) void die_if_ferror(FILE *fp, const char *fn)
{ {
if (ferror(fp)) { if (ferror(fp)) {
/* doesn't set useful errno */
bb_error_msg_and_die("%s: I/O error", fn); bb_error_msg_and_die("%s: I/O error", fn);
} }
} }

View File

@ -114,14 +114,14 @@ static void crondlog(const char *ctl, ...)
if (LogFile == 0) { if (LogFile == 0) {
vsyslog(type, fmt, va); vsyslog(type, fmt, va);
} else { } else {
#if !ENABLE_DEBUG_CROND_OPTION
int logfd = open(LogFile, O_WRONLY | O_CREAT | O_APPEND, 0600); int logfd = open(LogFile, O_WRONLY | O_CREAT | O_APPEND, 0600);
#else
int logfd = open3_or_warn(LogFile, O_WRONLY | O_CREAT | O_APPEND, 0600);
#endif
if (logfd >= 0) { if (logfd >= 0) {
vdprintf(logfd, fmt, va); vdprintf(logfd, fmt, va);
close(logfd); close(logfd);
#if ENABLE_DEBUG_CROND_OPTION
} else {
bb_perror_msg("can't open log file");
#endif
} }
} }
} }
@ -281,10 +281,9 @@ static void startlogger(void)
else { /* test logfile */ else { /* test logfile */
int logfd; int logfd;
if ((logfd = open(LogFile, O_WRONLY | O_CREAT | O_APPEND, 0600)) >= 0) { logfd = open3_or_warn(LogFile, O_WRONLY | O_CREAT | O_APPEND, 0600);
if (logfd >= 0) {
close(logfd); close(logfd);
} else {
bb_perror_msg("failed to open log file '%s': ", LogFile);
} }
} }
#endif #endif

View File

@ -484,10 +484,9 @@ static int rtnl_rtcache_request(struct rtnl_handle *rth, int family)
static void iproute_flush_cache(void) static void iproute_flush_cache(void)
{ {
static const char fn[] = "/proc/sys/net/ipv4/route/flush"; static const char fn[] = "/proc/sys/net/ipv4/route/flush";
int flush_fd = open(fn, O_WRONLY); int flush_fd = open_or_warn(fn, O_WRONLY);
if (flush_fd < 0) { if (flush_fd < 0) {
bb_perror_msg("cannot open '%s'", fn);
return; return;
} }

View File

@ -426,10 +426,9 @@ static void do_tunnels_list(struct ip_tunnel_parm *p)
int type; int type;
struct ip_tunnel_parm p1; struct ip_tunnel_parm p1;
char buf[512]; char buf[512];
FILE *fp = fopen("/proc/net/dev", "r"); FILE *fp = fopen_or_warn("/proc/net/dev", "r");
if (fp == NULL) { if (fp == NULL) {
bb_perror_msg("fopen");
return; return;
} }

View File

@ -311,9 +311,8 @@ int read_config(const char *file)
if (keywords[i].def[0]) if (keywords[i].def[0])
keywords[i].handler(keywords[i].def, keywords[i].var); keywords[i].handler(keywords[i].def, keywords[i].var);
in = fopen(file, "r"); in = fopen_or_warn(file, "r");
if (!in) { if (!in) {
bb_error_msg("cannot open config file: %s", file);
return 0; return 0;
} }
@ -360,9 +359,8 @@ void write_leases(void)
time_t curr = time(0); time_t curr = time(0);
unsigned long tmp_time; unsigned long tmp_time;
fp = open(server_config.lease_file, O_WRONLY|O_CREAT|O_TRUNC, 0666); fp = open3_or_warn(server_config.lease_file, O_WRONLY|O_CREAT|O_TRUNC, 0666);
if (fp < 0) { if (fp < 0) {
bb_error_msg("cannot open %s for writing", server_config.lease_file);
return; return;
} }
@ -401,9 +399,8 @@ void read_leases(const char *file)
unsigned int i = 0; unsigned int i = 0;
struct dhcpOfferedAddr lease; struct dhcpOfferedAddr lease;
fp = open(file, O_RDONLY); fp = open_or_warn(file, O_RDONLY);
if (fp < 0) { if (fp < 0) {
bb_error_msg("cannot open %s for reading", file);
return; return;
} }

View File

@ -34,19 +34,19 @@ static int fuser_option(char *option)
{ {
int opt = 0; int opt = 0;
if(!(strlen(option))) return 0; if (!option[0])
if(option[0] != '-') return 0; return 0;
if (option[0] != '-')
return 0;
++option; ++option;
while(*option != '\0') { while (*option != '\0') {
if(*option == 'm') opt |= FUSER_OPT_MOUNT; if (*option == 'm') opt |= FUSER_OPT_MOUNT;
else if(*option == 'k') opt |= FUSER_OPT_KILL; else if (*option == 'k') opt |= FUSER_OPT_KILL;
else if(*option == 's') opt |= FUSER_OPT_SILENT; else if (*option == 's') opt |= FUSER_OPT_SILENT;
else if(*option == '6') opt |= FUSER_OPT_IP6; else if (*option == '6') opt |= FUSER_OPT_IP6;
else if(*option == '4') opt |= FUSER_OPT_IP4; else if (*option == '4') opt |= FUSER_OPT_IP4;
else { else
bb_error_msg_and_die( bb_error_msg_and_die("unsupported option '%c'", *option);
"Unsupported option '%c'", *option);
}
++option; ++option;
} }
return opt; return opt;
@ -56,7 +56,8 @@ static int fuser_file_to_dev_inode(const char *filename,
dev_t *dev, ino_t *inode) dev_t *dev, ino_t *inode)
{ {
struct stat f_stat; struct stat f_stat;
if((stat(filename, &f_stat)) < 0) return 0; if ((stat(filename, &f_stat)) < 0)
return 0;
*inode = f_stat.st_ino; *inode = f_stat.st_ino;
*dev = f_stat.st_dev; *dev = f_stat.st_dev;
return 1; return 1;
@ -68,7 +69,7 @@ static int fuser_find_socket_dev(dev_t *dev)
struct stat buf; struct stat buf;
if (fd >= 0 && (fstat(fd, &buf)) == 0) { if (fd >= 0 && (fstat(fd, &buf)) == 0) {
*dev = buf.st_dev; *dev = buf.st_dev;
close(fd); close(fd);
return 1; return 1;
} }
@ -80,9 +81,11 @@ static int fuser_parse_net_arg(const char *filename,
{ {
char path[sizeof(FUSER_PROC_DIR)+12], tproto[5]; char path[sizeof(FUSER_PROC_DIR)+12], tproto[5];
if((sscanf(filename, "%d/%4s", port, tproto)) != 2) return 0; if ((sscanf(filename, "%d/%4s", port, tproto)) != 2)
sprintf(path, "%s/net/%s", FUSER_PROC_DIR, tproto); return 0;
if((access(path, R_OK)) != 0) return 0; sprintf(path, FUSER_PROC_DIR "/net/%s", tproto);
if ((access(path, R_OK)) != 0)
return 0;
*proto = xstrdup(tproto); *proto = xstrdup(tproto);
return 1; return 1;
} }
@ -91,17 +94,19 @@ static int fuser_add_pid(pid_list *plist, pid_t pid)
{ {
pid_list *curr = NULL, *last = NULL; pid_list *curr = NULL, *last = NULL;
if(plist->pid == 0) plist->pid = pid; if (plist->pid == 0)
plist->pid = pid;
curr = plist; curr = plist;
while(curr != NULL) { while (curr != NULL) {
if(curr->pid == pid) return 1; if (curr->pid == pid)
return 1;
last = curr; last = curr;
curr = curr->next; curr = curr->next;
} }
curr = xmalloc(sizeof(pid_list)); curr = xzalloc(sizeof(pid_list));
last->next = curr; last->next = curr;
curr->pid = pid; curr->pid = pid;
curr->next = NULL; /*curr->next = NULL;*/
return 1; return 1;
} }
@ -109,21 +114,22 @@ static int fuser_add_inode(inode_list *ilist, dev_t dev, ino_t inode)
{ {
inode_list *curr = NULL, *last = NULL; inode_list *curr = NULL, *last = NULL;
if(!ilist->inode && !ilist->dev) { if (!ilist->inode && !ilist->dev) {
ilist->dev = dev; ilist->dev = dev;
ilist->inode = inode; ilist->inode = inode;
} }
curr = ilist; curr = ilist;
while(curr != NULL) { while (curr != NULL) {
if(curr->inode == inode && curr->dev == dev) return 1; if (curr->inode == inode && curr->dev == dev)
return 1;
last = curr; last = curr;
curr = curr->next; curr = curr->next;
} }
curr = xmalloc(sizeof(inode_list)); curr = xzalloc(sizeof(inode_list));
last->next = curr; last->next = curr;
curr->dev = dev; curr->dev = dev;
curr->inode = inode; curr->inode = inode;
curr->next = NULL; /*curr->next = NULL;*/
return 1; return 1;
} }
@ -134,29 +140,31 @@ static int fuser_scan_proc_net(int opts, const char *proto,
char addr[128]; char addr[128];
ino_t tmp_inode; ino_t tmp_inode;
dev_t tmp_dev; dev_t tmp_dev;
long long uint64_inode; long long uint64_inode;
int tmp_port; int tmp_port;
FILE *f; FILE *f;
if(!fuser_find_socket_dev(&tmp_dev)) tmp_dev = 0; if (!fuser_find_socket_dev(&tmp_dev))
sprintf(path, "%s/net/%s", FUSER_PROC_DIR, proto); tmp_dev = 0;
sprintf(path, FUSER_PROC_DIR "/net/%s", proto);
if (!(f = fopen(path, "r"))) return 0; f = fopen(path, "r");
while(fgets(line, FUSER_MAX_LINE, f)) { if (!f)
if(sscanf(line, return 0;
"%*d: %64[0-9A-Fa-f]:%x %*x:%*x %*x %*x:%*x " while (fgets(line, FUSER_MAX_LINE, f)) {
"%*x:%*x %*x %*d %*d %llu", if (sscanf(line, "%*d: %64[0-9A-Fa-f]:%x %*x:%*x %*x %*x:%*x "
addr, &tmp_port, &uint64_inode) == 3) { "%*x:%*x %*x %*d %*d %llu",
if((strlen(addr) == 8) && addr, &tmp_port, &uint64_inode) == 3
(opts & FUSER_OPT_IP6)) continue; ) {
else if((strlen(addr) > 8) && if (strlen(addr) == 8 && (opts & FUSER_OPT_IP6))
(opts & FUSER_OPT_IP4)) continue; continue;
if(tmp_port == port) { if (strlen(addr) > 8 && (opts & FUSER_OPT_IP4))
continue;
if (tmp_port == port) {
tmp_inode = uint64_inode; tmp_inode = uint64_inode;
fuser_add_inode(ilist, tmp_dev, tmp_inode); fuser_add_inode(ilist, tmp_dev, tmp_inode);
} }
} }
} }
fclose(f); fclose(f);
return 1; return 1;
@ -168,10 +176,10 @@ static int fuser_search_dev_inode(int opts, inode_list *ilist,
inode_list *curr; inode_list *curr;
curr = ilist; curr = ilist;
while(curr) { while (curr) {
if((opts & FUSER_OPT_MOUNT) && curr->dev == dev) if ((opts & FUSER_OPT_MOUNT) && curr->dev == dev)
return 1; return 1;
if(curr->inode == inode && curr->dev == dev) if (curr->inode == inode && curr->dev == dev)
return 1; return 1;
curr = curr->next; curr = curr->next;
} }
@ -188,17 +196,19 @@ static int fuser_scan_pid_maps(int opts, const char *fname, pid_t pid,
long long uint64_inode; long long uint64_inode;
dev_t dev; dev_t dev;
if (!(file = fopen(fname, "r"))) return 0; file = fopen(fname, "r");
if (!file)
return 0;
while (fgets(line, FUSER_MAX_LINE, file)) { while (fgets(line, FUSER_MAX_LINE, file)) {
if(sscanf(line, "%*s %*s %*s %x:%x %llu", if (sscanf(line, "%*s %*s %*s %x:%x %llu", &major, &minor, &uint64_inode) != 3)
&major, &minor, &uint64_inode) != 3) continue; continue;
inode = uint64_inode; inode = uint64_inode;
if(major == 0 && minor == 0 && inode == 0) continue; if (major == 0 && minor == 0 && inode == 0)
continue;
dev = makedev(major, minor); dev = makedev(major, minor);
if(fuser_search_dev_inode(opts, ilist, dev, inode)) { if (fuser_search_dev_inode(opts, ilist, dev, inode)) {
fuser_add_pid(plist, pid); fuser_add_pid(plist, pid);
} }
} }
fclose(file); fclose(file);
return 1; return 1;
@ -210,8 +220,9 @@ static int fuser_scan_link(int opts, const char *lname, pid_t pid,
ino_t inode; ino_t inode;
dev_t dev; dev_t dev;
if(!fuser_file_to_dev_inode(lname, &dev, &inode)) return 0; if (!fuser_file_to_dev_inode(lname, &dev, &inode))
if(fuser_search_dev_inode(opts, ilist, dev, inode)) return 0;
if (fuser_search_dev_inode(opts, ilist, dev, inode))
fuser_add_pid(plist, pid); fuser_add_pid(plist, pid);
return 1; return 1;
} }
@ -223,19 +234,18 @@ static int fuser_scan_dir_links(int opts, const char *dname, pid_t pid,
struct dirent *de; struct dirent *de;
char *lname; char *lname;
if((d = opendir(dname))) { d = opendir(dname);
while((de = readdir(d)) != NULL) { if (!d)
lname = concat_subpath_file(dname, de->d_name); return 0;
if(lname == NULL) while ((de = readdir(d)) != NULL) {
continue; lname = concat_subpath_file(dname, de->d_name);
fuser_scan_link(opts, lname, pid, ilist, plist); if (lname == NULL)
free(lname); continue;
} fuser_scan_link(opts, lname, pid, ilist, plist);
closedir(d); free(lname);
} }
else return 0; closedir(d);
return 1; return 1;
} }
static int fuser_scan_proc_pids(int opts, inode_list *ilist, pid_list *plist) static int fuser_scan_proc_pids(int opts, inode_list *ilist, pid_list *plist)
@ -245,12 +255,15 @@ static int fuser_scan_proc_pids(int opts, inode_list *ilist, pid_list *plist)
pid_t pid; pid_t pid;
char *dname; char *dname;
if(!(d = opendir(FUSER_PROC_DIR))) return 0; d = opendir(FUSER_PROC_DIR);
while((de = readdir(d)) != NULL) { if (!d)
return 0;
while ((de = readdir(d)) != NULL) {
pid = (pid_t)atoi(de->d_name); pid = (pid_t)atoi(de->d_name);
if(!pid) continue; if (!pid)
continue;
dname = concat_subpath_file(FUSER_PROC_DIR, de->d_name); dname = concat_subpath_file(FUSER_PROC_DIR, de->d_name);
if(chdir(dname) < 0) { if (chdir(dname) < 0) {
free(dname); free(dname);
continue; continue;
} }
@ -272,9 +285,11 @@ static int fuser_print_pid_list(pid_list *plist)
{ {
pid_list *curr = plist; pid_list *curr = plist;
if(plist == NULL) return 0; if (plist == NULL)
while(curr != NULL) { return 0;
if(curr->pid > 0) printf("%d ", curr->pid); while (curr != NULL) {
if (curr->pid > 0)
printf("%d ", curr->pid);
curr = curr->next; curr = curr->next;
} }
puts(""); puts("");
@ -287,12 +302,12 @@ static int fuser_kill_pid_list(pid_list *plist, int sig)
pid_t mypid = getpid(); pid_t mypid = getpid();
int success = 1; int success = 1;
if(plist == NULL) return 0; if (plist == NULL)
while(curr != NULL) { return 0;
if(curr->pid > 0 && curr->pid != mypid) { while (curr != NULL) {
if (curr->pid > 0 && curr->pid != mypid) {
if (kill(curr->pid, sig) != 0) { if (kill(curr->pid, sig) != 0) {
bb_perror_msg( bb_perror_msg("kill pid '%d'", curr->pid);
"cannot kill pid '%d'", curr->pid);
success = 0; success = 0;
} }
} }
@ -304,11 +319,12 @@ static int fuser_kill_pid_list(pid_list *plist, int sig)
int fuser_main(int argc, char **argv); int fuser_main(int argc, char **argv);
int fuser_main(int argc, char **argv) int fuser_main(int argc, char **argv)
{ {
/*static -- huh???*/ int opt = 0; /* FUSER_OPT_ */
int port, i, optn; int port, i, optn;
int* fni; /* file name indexes of argv */ int* fni; /* file name indexes of argv */
int fnic = 0; /* file name index count */ int fnic = 0; /* file name index count */
const char *proto; const char *proto;
static int opt = 0; /* FUSER_OPT_ */
dev_t dev; dev_t dev;
ino_t inode; ino_t inode;
pid_list *pids; pid_list *pids;
@ -320,30 +336,31 @@ int fuser_main(int argc, char **argv)
bb_show_usage(); bb_show_usage();
fni = xmalloc(sizeof(int)); fni = xmalloc(sizeof(int));
for (i=1;i<argc;i++) { for (i = 1; i < argc; i++) {
optn = fuser_option(argv[i]); optn = fuser_option(argv[i]);
if(optn) opt |= optn; if (optn)
else if(argv[i][0] == '-') { opt |= optn;
else if (argv[i][0] == '-') {
killsig = get_signum(argv[i]+1); killsig = get_signum(argv[i]+1);
if(0 > killsig) if (killsig < 0)
killsig = SIGTERM; killsig = SIGTERM;
} } else {
else {
fni = xrealloc(fni, sizeof(int) * (fnic+2)); fni = xrealloc(fni, sizeof(int) * (fnic+2));
fni[fnic++] = i; fni[fnic++] = i;
} }
} }
if(!fnic) return 1;
if (!fnic)
return 1;
inodes = xmalloc(sizeof(inode_list)); inodes = xmalloc(sizeof(inode_list));
for (i=0;i<fnic;i++) { for (i = 0; i < fnic; i++) {
if(fuser_parse_net_arg(argv[fni[i]], &proto, &port)) { if (fuser_parse_net_arg(argv[fni[i]], &proto, &port)) {
fuser_scan_proc_net(opt, proto, port, inodes); fuser_scan_proc_net(opt, proto, port, inodes);
} } else {
else { if (!fuser_file_to_dev_inode(argv[fni[i]], &dev, &inode)) {
if(!fuser_file_to_dev_inode( if (ENABLE_FEATURE_CLEAN_UP)
argv[fni[i]], &dev, &inode)) { free(inodes);
if (ENABLE_FEATURE_CLEAN_UP) free(inodes);
bb_perror_msg_and_die("cannot open '%s'", argv[fni[i]]); bb_perror_msg_and_die("cannot open '%s'", argv[fni[i]]);
} }
fuser_add_inode(inodes, dev, inode); fuser_add_inode(inodes, dev, inode);
@ -352,17 +369,19 @@ int fuser_main(int argc, char **argv)
pids = xmalloc(sizeof(pid_list)); pids = xmalloc(sizeof(pid_list));
success = fuser_scan_proc_pids(opt, inodes, pids); success = fuser_scan_proc_pids(opt, inodes, pids);
/* if the first pid in the list is 0, none have been found */ /* if the first pid in the list is 0, none have been found */
if(pids->pid == 0) success = 0; if (pids->pid == 0)
if(success) { success = 0;
if(opt & FUSER_OPT_KILL) { if (success) {
if (opt & FUSER_OPT_KILL) {
success = fuser_kill_pid_list(pids, killsig); success = fuser_kill_pid_list(pids, killsig);
} } else if (!(opt & FUSER_OPT_SILENT)) {
else if(!(opt & FUSER_OPT_SILENT)) {
success = fuser_print_pid_list(pids); success = fuser_print_pid_list(pids);
} }
} }
free(pids); if (ENABLE_FEATURE_CLEAN_UP) {
free(inodes); free(pids);
free(inodes);
}
/* return 0 on (success == 1) 1 otherwise */ /* return 0 on (success == 1) 1 otherwise */
return (success != 1); return (success != 1);
} }

View File

@ -202,7 +202,8 @@ int sysctl_write_setting(const char *setting, int output)
while ((cptr = strchr(outname, '/')) != NULL) while ((cptr = strchr(outname, '/')) != NULL)
*cptr = '.'; *cptr = '.';
if ((fd = open(tmpname, O_WRONLY | O_CREAT | O_TRUNC, 0666)) < 0) { fd = open(tmpname, O_WRONLY | O_CREAT | O_TRUNC, 0666);
if (fd < 0) {
switch (errno) { switch (errno) {
case ENOENT: case ENOENT:
bb_error_msg(ERR_INVALID_KEY, outname); bb_error_msg(ERR_INVALID_KEY, outname);

View File

@ -1019,11 +1019,10 @@ static int setup_redirects(struct child_prog *prog, int squirrel[])
} }
if (redir->dup == -1) { if (redir->dup == -1) {
mode = redir_table[redir->type].mode; mode = redir_table[redir->type].mode;
openfd = open(redir->word.gl_pathv[0], mode, 0666); openfd = open3_or_warn(redir->word.gl_pathv[0], mode, 0666);
if (openfd < 0) { if (openfd < 0) {
/* this could get lost if stderr has been redirected, but /* this could get lost if stderr has been redirected, but
bash and ash both lose it as well (though zsh doesn't!) */ bash and ash both lose it as well (though zsh doesn't!) */
bb_perror_msg("error opening %s", redir->word.gl_pathv[0]);
return 1; return 1;
} }
} else { } else {

View File

@ -571,11 +571,10 @@ static int setup_redirects(struct child_prog *prog, int squirrel[])
break; break;
} }
openfd = open(redir->filename, mode, 0666); openfd = open3_or_warn(redir->filename, mode, 0666);
if (openfd < 0) { if (openfd < 0) {
/* this could get lost if stderr has been redirected, but /* this could get lost if stderr has been redirected, but
bash and ash both lose it as well (though zsh doesn't!) */ bash and ash both lose it as well (though zsh doesn't!) */
bb_perror_msg("error opening %s", redir->filename);
return 1; return 1;
} }

View File

@ -111,7 +111,7 @@ int switch_root_main(int argc, char **argv)
if (console) { if (console) {
close(0); close(0);
if(open(console, O_RDWR) < 0) if (open(console, O_RDWR) < 0)
bb_error_msg_and_die("bad console '%s'", console); bb_error_msg_and_die("bad console '%s'", console);
dup2(0, 1); dup2(0, 1);
dup2(0, 2); dup2(0, 2);