forked from pool/psmisc
270 lines
7.0 KiB
Diff
270 lines
7.0 KiB
Diff
--- src/fuser.c
|
|
+++ src/fuser.c 2010-07-13 14:42:02.762926098 +0000
|
|
@@ -148,18 +148,12 @@ scan_procs(struct names *names_head, str
|
|
{
|
|
DIR *topproc_dir;
|
|
struct dirent *topproc_dent;
|
|
- char *fd_dirpath, *fd_pathname;
|
|
struct inode_list *ino_tmp;
|
|
struct device_list *dev_tmp;
|
|
pid_t pid, my_pid;
|
|
uid_t uid;
|
|
struct stat *cwd_stat, *exe_stat, *root_stat;
|
|
|
|
- if ((fd_dirpath = malloc(MAX_PATHNAME)) == NULL)
|
|
- return;
|
|
- if ((fd_pathname = malloc(MAX_PATHNAME)) == NULL)
|
|
- return;
|
|
-
|
|
if ((topproc_dir = opendir("/proc")) == NULL) {
|
|
fprintf(stderr, _("Cannot open /proc directory: %s\n"),
|
|
strerror(errno));
|
|
@@ -219,6 +213,9 @@ scan_procs(struct names *names_head, str
|
|
}
|
|
}
|
|
}
|
|
+ if (root_stat) free(root_stat);
|
|
+ if (cwd_stat) free(cwd_stat);
|
|
+ if (exe_stat) free(exe_stat);
|
|
check_dir(pid, "lib", dev_head, ino_head, uid, ACCESS_MMAP,
|
|
sockets, netdev);
|
|
check_dir(pid, "mmap", dev_head, ino_head, uid, ACCESS_MMAP,
|
|
@@ -237,10 +234,9 @@ add_inode(struct inode_list **ino_list,
|
|
{
|
|
struct inode_list *ino_tmp, *ino_head;
|
|
|
|
- ino_head = *ino_list;
|
|
-
|
|
- if ((ino_tmp = malloc(sizeof(struct inode_list))) == NULL)
|
|
+ if ((ino_tmp = (struct inode_list*)malloc(sizeof(struct inode_list))) == NULL)
|
|
return;
|
|
+ ino_head = *ino_list;
|
|
ino_tmp->name = this_name;
|
|
ino_tmp->device = device;
|
|
ino_tmp->inode = inode;
|
|
@@ -254,10 +250,10 @@ add_device(struct device_list **dev_list
|
|
struct device_list *dev_tmp, *dev_head;
|
|
|
|
/*printf("Adding device %s %d\n", this_name->filename, device); */
|
|
- dev_head = *dev_list;
|
|
|
|
- if ((dev_tmp = malloc(sizeof(struct device_list))) == NULL)
|
|
+ if ((dev_tmp = (struct device_list*)malloc(sizeof(struct device_list))) == NULL)
|
|
return;
|
|
+ dev_head = *dev_list;
|
|
dev_tmp->name = this_name;
|
|
dev_tmp->device = device;
|
|
dev_tmp->next = dev_head;
|
|
@@ -271,10 +267,9 @@ add_ip_conn(struct ip_connections **ip_l
|
|
{
|
|
struct ip_connections *ip_tmp, *ip_head;
|
|
|
|
- ip_head = *ip_list;
|
|
-
|
|
- if ((ip_tmp = malloc(sizeof(struct ip_connections))) == NULL)
|
|
+ if ((ip_tmp = (struct ip_connections*)malloc(sizeof(struct ip_connections))) == NULL)
|
|
return;
|
|
+ ip_head = *ip_list;
|
|
ip_tmp->name = this_name;
|
|
ip_tmp->lcl_port = lcl_port;
|
|
ip_tmp->rmt_port = rmt_port;
|
|
@@ -292,10 +287,9 @@ add_ip6_conn(struct ip6_connections **ip
|
|
{
|
|
struct ip6_connections *ip_tmp, *ip_head;
|
|
|
|
- ip_head = *ip_list;
|
|
-
|
|
- if ((ip_tmp = malloc(sizeof(struct ip6_connections))) == NULL)
|
|
+ if ((ip_tmp = (struct ip6_connections*)malloc(sizeof(struct ip6_connections))) == NULL)
|
|
return;
|
|
+ ip_head = *ip_list;
|
|
ip_tmp->name = this_name;
|
|
ip_tmp->lcl_port = lcl_port;
|
|
ip_tmp->rmt_port = rmt_port;
|
|
@@ -326,7 +320,7 @@ add_matched_proc(struct names *name_list
|
|
}
|
|
}
|
|
/* Not found */
|
|
- if ((pptr = malloc(sizeof(struct procs))) == NULL) {
|
|
+ if ((pptr = (struct procs*)malloc(sizeof(struct procs))) == NULL) {
|
|
fprintf(stderr,
|
|
_("Cannot allocate memory for matched proc: %s\n"),
|
|
strerror(errno));
|
|
@@ -339,10 +333,13 @@ add_matched_proc(struct names *name_list
|
|
pptr->next = NULL;
|
|
/* set command name */
|
|
pptr->command = NULL;
|
|
+
|
|
+ fp = NULL;
|
|
+ pathname = NULL;
|
|
if ((asprintf(&pathname, "/proc/%d/stat", pid) > 0) &&
|
|
((fp = fopen(pathname, "r")) != NULL) &&
|
|
(fscanf(fp, "%*d (%100[^)]", cmdname) == 1))
|
|
- if ((pptr->command = malloc(MAX_CMDNAME + 1)) != NULL) {
|
|
+ if ((pptr->command = (char*)malloc(MAX_CMDNAME + 1)) != NULL) {
|
|
cmdlen = 0;
|
|
for (cptr = cmdname; cmdlen < MAX_CMDNAME && *cptr;
|
|
cptr++) {
|
|
@@ -359,6 +356,10 @@ add_matched_proc(struct names *name_list
|
|
name_list->matched_procs = pptr;
|
|
else
|
|
last_proc->next = pptr;
|
|
+ if (pathname)
|
|
+ free(pathname);
|
|
+ if (fp)
|
|
+ fclose(fp);
|
|
}
|
|
|
|
/* Adds a knfsd etc process */
|
|
@@ -680,7 +681,7 @@ find_net_sockets(struct inode_list **ino
|
|
}
|
|
|
|
}
|
|
- return;
|
|
+ fclose(fp);
|
|
}
|
|
|
|
#ifdef WITH_IPV6
|
|
@@ -753,6 +754,7 @@ find_net6_sockets(struct inode_list **in
|
|
}
|
|
}
|
|
}
|
|
+ fclose(fp);
|
|
}
|
|
#endif
|
|
|
|
@@ -1253,13 +1255,15 @@ static struct stat *get_pidstat(const pi
|
|
char pathname[256];
|
|
struct stat *st;
|
|
|
|
- if ((st = malloc(sizeof(struct stat))) == NULL)
|
|
+ if ((st = (struct stat*)malloc(sizeof(struct stat))) == NULL)
|
|
return NULL;
|
|
snprintf(pathname, 256, "/proc/%d/%s", pid, filename);
|
|
if (stat(pathname, st) != 0)
|
|
- return NULL;
|
|
- else
|
|
- return st;
|
|
+ goto out;
|
|
+ return st;
|
|
+out:
|
|
+ free(st);
|
|
+ return NULL;
|
|
}
|
|
|
|
static void
|
|
@@ -1267,7 +1271,7 @@ check_dir(const pid_t pid, const char *d
|
|
struct inode_list *ino_head, const uid_t uid, const char access,
|
|
struct unixsocket_list *sockets, dev_t netdev)
|
|
{
|
|
- char *dirpath, *filepath;
|
|
+ char *dirpath = NULL, *filepath = NULL;
|
|
DIR *dirp;
|
|
struct dirent *direntry;
|
|
struct inode_list *ino_tmp;
|
|
@@ -1275,14 +1279,14 @@ check_dir(const pid_t pid, const char *d
|
|
struct unixsocket_list *sock_tmp;
|
|
struct stat st, lst;
|
|
|
|
- if ((dirpath = malloc(MAX_PATHNAME)) == NULL)
|
|
- return;
|
|
- if ((filepath = malloc(MAX_PATHNAME)) == NULL)
|
|
- return;
|
|
+ if ((dirpath = (char*)malloc(MAX_PATHNAME)) == NULL)
|
|
+ goto out;
|
|
+ if ((filepath = (char*)malloc(MAX_PATHNAME)) == NULL)
|
|
+ goto out;
|
|
|
|
snprintf(dirpath, MAX_PATHNAME, "/proc/%d/%s", pid, dirname);
|
|
if ((dirp = opendir(dirpath)) == NULL)
|
|
- return;
|
|
+ goto out;
|
|
while ((direntry = readdir(dirp)) != NULL) {
|
|
if (direntry->d_name[0] < '0' || direntry->d_name[0] > '9')
|
|
continue;
|
|
@@ -1341,6 +1345,11 @@ check_dir(const pid_t pid, const char *d
|
|
}
|
|
} /* while fd_dent */
|
|
closedir(dirp);
|
|
+out:
|
|
+ if (dirpath)
|
|
+ free(dirpath);
|
|
+ if (filepath)
|
|
+ free(filepath);
|
|
}
|
|
|
|
static void
|
|
@@ -1400,7 +1409,6 @@ void fill_unix_cache(struct unixsocket_l
|
|
{
|
|
FILE *fp;
|
|
char line[BUFSIZ];
|
|
- char *scanned_path;
|
|
int scanned_inode;
|
|
struct stat st;
|
|
struct unixsocket_list *newsocket;
|
|
@@ -1411,24 +1419,38 @@ void fill_unix_cache(struct unixsocket_l
|
|
return;
|
|
}
|
|
while (fgets(line, BUFSIZ, fp) != NULL) {
|
|
+ char * path;
|
|
+ char * scanned_path = NULL;
|
|
if (sscanf(line, "%*x: %*x %*x %*x %*x %*d %d %as",
|
|
- &scanned_inode, &scanned_path) != 2)
|
|
+ &scanned_inode, &scanned_path) != 2) {
|
|
+ if (scanned_path)
|
|
+ free(scanned_path);
|
|
continue;
|
|
+ }
|
|
+ if (scanned_path == NULL)
|
|
+ continue;
|
|
+ path = scanned_path;
|
|
+ if (*scanned_path == '@')
|
|
+ scanned_path++;
|
|
if (stat(scanned_path, &st) < 0) {
|
|
- free(scanned_path);
|
|
+ free(path);
|
|
continue;
|
|
}
|
|
- if ((newsocket =
|
|
- malloc(sizeof(struct unixsocket_list))) == NULL)
|
|
+ if ((newsocket = (struct unixsocket_list*)
|
|
+ malloc(sizeof(struct unixsocket_list))) == NULL) {
|
|
+ free(path);
|
|
continue;
|
|
+ }
|
|
newsocket->sun_name = strdup(scanned_path);
|
|
newsocket->inode = st.st_ino;
|
|
newsocket->dev = st.st_dev;
|
|
newsocket->net_inode = scanned_inode;
|
|
newsocket->next = *unixsocket_head;
|
|
*unixsocket_head = newsocket;
|
|
+ free(path);
|
|
} /* while */
|
|
|
|
+ fclose(fp);
|
|
}
|
|
|
|
#ifdef DEBUG
|
|
@@ -1567,6 +1589,7 @@ scan_knfsd(struct names *names_head, str
|
|
line);
|
|
}
|
|
}
|
|
+ fclose(fp);
|
|
}
|
|
|
|
static void
|
|
@@ -1610,6 +1633,7 @@ scan_mounts(struct names *names_head, st
|
|
find_mountp);
|
|
}
|
|
}
|
|
+ fclose(fp);
|
|
}
|
|
|
|
static void
|
|
@@ -1656,4 +1680,5 @@ scan_swaps(struct names *names_head, str
|
|
line);
|
|
}
|
|
}
|
|
+ fclose(fp);
|
|
}
|