=== modified file 'src/fuser.c' --- src/fuser.c 2007-05-30 13:45:07 +0000 +++ src/fuser.c 2007-05-30 13:48:30 +0000 @@ -60,7 +60,8 @@ #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); @@ -72,7 +73,7 @@ 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 */ @@ -125,7 +126,7 @@ "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; @@ -185,9 +186,9 @@ } } } - 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 */ @@ -863,7 +864,7 @@ #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 */ @@ -983,13 +984,15 @@ 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) @@ -1009,6 +1012,15 @@ 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)) {