#define NAME_FIELD 20 /* space reserved for file name */
/* Function defines */
static void add_matched_proc(struct names *name_list, const pid_t pid, const uid_t uid, const char access);
-static void check_dir(const pid_t pid, const char *dirname, struct device_list *dev_head, struct inode_list *ino_head, const uid_t uid, const char access);
+static void check_dir(const pid_t pid, const char *dirname, struct device_list *dev_head, struct inode_list *ino_head, const uid_t uid, const char access,
+ struct unixsocket_list *sockets, dev_t netdev);
static void check_map(const pid_t pid, const char *filename, struct device_list *dev_head, struct inode_list *ino_head, const uid_t uid, const char access);
static struct stat *get_pidstat(const pid_t pid, const char *filename);
static uid_t getpiduid(const pid_t pid);
void scan_mount_devices(const opt_type opts, struct mountdev_list **mount_devices);
void fill_unix_cache(struct unixsocket_list **unixsocket_head);
static dev_t find_net_dev(void);
-static void scan_procs(struct names *names_head, struct inode_list *ino_head, struct device_list *dev_head);
+static void scan_procs(struct names *names_head, struct inode_list *ino_head, struct device_list *dev_head, struct unixsocket_list *sockets, dev_t netdev);
#ifdef NFS_CHECKS
static void scan_knfsd(struct names *names_head, struct device_list *dev_head);
#endif /* NFS_CHECKS */
"For more information about these matters, see the files named COPYING.\n"));
}
-static void scan_procs(struct names *names_head, struct inode_list *ino_head, struct device_list *dev_head)
+static void scan_procs(struct names *names_head, struct inode_list *ino_head, struct device_list *dev_head, struct unixsocket_list *sockets, dev_t netdev)
{
DIR *topproc_dir;
struct dirent *topproc_dent;
}
}
}
- check_dir(pid, "lib", dev_head, ino_head, uid, ACCESS_MMAP);
- check_dir(pid, "mmap", dev_head, ino_head, uid, ACCESS_MMAP);
- check_dir(pid, "fd", dev_head, ino_head, uid, ACCESS_FILE);
+ check_dir(pid, "lib", dev_head, ino_head, uid, ACCESS_MMAP, sockets, netdev);
+ check_dir(pid, "mmap", dev_head, ino_head, uid, ACCESS_MMAP, sockets, netdev);
+ check_dir(pid, "fd", dev_head, ino_head, uid, ACCESS_FILE, sockets, netdev);
check_map(pid, "maps", dev_head, ino_head, uid, ACCESS_MMAP);
} /* while topproc_dent */
#ifdef DEBUG
debug_match_lists(names_head, match_inodes, match_devices);
#endif
- scan_procs(names_head, match_inodes, match_devices);
+ scan_procs(names_head, match_inodes, match_devices, unixsockets, netdev);
#ifdef NFS_CHECKS
scan_knfsd(names_head, match_devices);
#endif /* NFS_CHECKS */
return st;
}
-static void check_dir(const pid_t pid, const char *dirname, struct device_list *dev_head, struct inode_list *ino_head, const uid_t uid, const char access)
+static void check_dir(const pid_t pid, const char *dirname, struct device_list *dev_head, struct inode_list *ino_head, const uid_t uid, const char access,
+ struct unixsocket_list *sockets, dev_t netdev)
{
char *dirpath, *filepath;
DIR *dirp;
struct dirent *direntry;
struct inode_list *ino_tmp;
struct device_list *dev_tmp;
+ struct unixsocket_list *sock_tmp;
struct stat st, lst;
if ( (dirpath = malloc(MAX_PATHNAME)) == NULL)
if (stat(filepath, &st) != 0) {
fprintf(stderr, _("Cannot stat file %s: %s\n"),filepath, strerror(errno));
} else {
+ if (st.st_dev == netdev) {
+ for (sock_tmp = sockets; sock_tmp != NULL; sock_tmp = sock_tmp->next) {
+ if (sock_tmp->net_inode == st.st_ino) {
+ st.st_ino = sock_tmp->inode;
+ st.st_dev = sock_tmp->dev;
+ break;
+ }
+ }
+ }
for (dev_tmp = dev_head ; dev_tmp != NULL ; dev_tmp = dev_tmp->next) {
if (st.st_dev == dev_tmp->device) {
if (access == ACCESS_FILE && (lstat(filepath, &lst)==0) && (lst.st_mode & S_IWUSR)) {