--- configure.ac | 4 ++-- src/fuser.c | 16 ++++++++++------ 2 files changed, 12 insertions(+), 8 deletions(-) --- configure.ac +++ configure.ac 2017-06-20 13:46:32.464296485 +0000 @@ -40,7 +40,7 @@ fi if test "$enable_timeout_stat" = "static"; then AC_DEFINE([WITH_TIMEOUT_STAT], [2], [Use timeout on stat calls]) fi -AM_CONDITIONAL([WANT_TIMEOUT_STAT], [test "$enable_timeout_stat" = "static"]) +AM_CONDITIONAL([WANT_TIMEOUT_STAT], [test "$enable_timeout_stat" != "no"]) # Use string search for network based file systems but only if the system # has /proc/self/mountinfo @@ -121,7 +121,7 @@ AC_CHECK_MEMBERS([struct user_regs_struc struct user_regs_struct.rdi, struct user_regs_struct.rsi, struct user_regs_struct.rdx], [],[], - [#include + [#include #include ]) AC_CHECK_MEMBERS([struct pt_regs.orig_gpr3, struct pt_regs.gpr], [],[], [#include ]) --- src/fuser.c +++ src/fuser.c 2017-06-20 13:46:32.548294929 +0000 @@ -34,6 +34,7 @@ #include #include #include +#include #include #include #include @@ -901,6 +902,7 @@ int main(int argc, char *argv[]) struct option *optr; char *nsptr; int skip_argv; + int seen_file; struct option options[] = { {"all", 0, NULL, 'a'}, @@ -941,6 +943,7 @@ int main(int argc, char *argv[]) fill_unix_cache(&unixsockets); #endif + seen_file = 0; for (argc_cnt = 1; argc_cnt < argc; argc_cnt++) { current_argv = argv[argc_cnt]; if (current_argv[0] == '-') { /* its an option */ @@ -1093,6 +1096,7 @@ int main(int argc, char *argv[]) } } this_name->matched_procs = NULL; + seen_file = 1; if (opts & (OPT_MOUNTS | OPT_ISMOUNTPOINT) && this_name->name_space != NAMESPACE_FILE) usage(_ @@ -1144,7 +1148,7 @@ int main(int argc, char *argv[]) names_tail->next = this_name; names_tail = this_name; } /* for across the argvs */ - if (names_head == NULL) + if (names_head == NULL && !seen_file) usage(_("No process specification given")); /* Check if -M flag was used and if so check mounts */ @@ -1394,17 +1398,17 @@ check_dir(const pid_t pid, const char *d struct device_list *dev_tmp; struct unixsocket_list *sock_tmp; struct stat st, lst; - char dirpath[MAX_PATHNAME]; - char filepath[MAX_PATHNAME]; + char dirpath[PATH_MAX+1]; + char filepath[PATH_MAX+1]; - snprintf(dirpath, MAX_PATHNAME, "/proc/%d/%s", pid, dirname); + snprintf(dirpath, PATH_MAX , "/proc/%d/%s", pid, dirname); if ((dirp = opendir(dirpath)) == NULL) return; while ((direntry = readdir(dirp)) != NULL) { if (direntry->d_name[0] < '0' || direntry->d_name[0] > '9') continue; - snprintf(filepath, MAX_PATHNAME, "/proc/%d/%s/%s", + snprintf(filepath, PATH_MAX, "/proc/%d/%s/%s", pid, dirname, direntry->d_name); if (timeout(thestat, filepath, &st, 5) != 0) { @@ -1541,7 +1545,7 @@ void fill_unix_cache(struct unixsocket_l while (fgets(line, BUFSIZ, fp) != NULL) { char *path; char *scanned_path = NULL; - if (sscanf(line, "%*x: %*x %*x %*x %*x %*d %d %as", + if (sscanf(line, "%*x: %*x %*x %*x %*x %*d %d %ms", &scanned_inode, &scanned_path) != 2) { if (scanned_path) free(scanned_path);