[Crash-utility] [PATCH v2] Fix "fuser" command to properly deal with an invalid argument

Lianbo Jiang lijiang at redhat.com
Mon Apr 10 03:41:16 UTC 2023


The man page of the "fuser" command suggests that the argument can be a
full pathname or inode address. However, the "fuser" command accepts an
invalid argument and prints a bogus result as below:

  crash> fuser x
   PID         TASK        COMM             USAGE
  100507  ffff9914431f4c80  "packagekitd"    fd
  100508  ffff991574e59980  "gmain"          fd
  100509  ffff9914431f3300  "gdbus"          fd
  102020  ffff991574400000  "sshd"           fd
  102043  ffff991441d19980  "sshd"           fd

The current fuser command has no checking mechanism to determine if an
argument is valid or not. Lets add it to handle such cases.

With the patch:
  crash> fuser x
  fuser: invalid argument: x

In addition, also add a note that fuser does not expect an argument other
than an inode address and full pathname, if others are specified, the output
can be an unexpected result.

Reported-by: Buland Kumar Singh <bsingh at redhat.com>
Signed-off-by: Lianbo Jiang <lijiang at redhat.com>
---
 filesys.c | 8 +++++++-
 help.c    | 3 +++
 2 files changed, 10 insertions(+), 1 deletion(-)

diff --git a/filesys.c b/filesys.c
index d64b54a9b822..307da05a774f 100644
--- a/filesys.c
+++ b/filesys.c
@@ -3421,7 +3421,13 @@ cmd_fuser(void)
 
 	doing_fds = doing_mmap = 0;
 	while (args[optind]) {
-                spec_string = args[optind];
+		ulong spec_addr;
+		spec_string = args[optind];
+		spec_addr = htol(spec_string, RETURN_ON_ERROR|QUIET, NULL);
+		if ((spec_addr == BADADDR || !IS_KVADDR(spec_addr)) &&
+			spec_string[0] != '/')
+			error(FATAL, "invalid argument: %s\n", args[optind]);
+
 		if (STRNEQ(spec_string, "0x") && hexadecimal(spec_string, 0))
 			shift_string_left(spec_string, 2);
 		len = strlen(spec_string);
diff --git a/help.c b/help.c
index 9a5cd3615589..ded4ee19d955 100644
--- a/help.c
+++ b/help.c
@@ -7990,6 +7990,9 @@ char *help_fuser[] = {
 "  listed.\n",
 "    pathname  the full pathname of the file.",
 "    inode     the hexadecimal inode address for the file.",
+"  Note: fuser does not expect an argument other than an inode address",
+"        and a full path, and if others are specified, the output can",
+"        be an unexpected one.",
 "\nEXAMPLES",
 "  Display the tasks using file /usr/lib/libkfm.so.2.0.0\n",
 "    %s> fuser /usr/lib/libkfm.so.2.0.0",
-- 
2.37.1



More information about the Crash-utility mailing list