Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 15 Apr 2002 22:26:40 +1000 (EST)
From:      Joshua Goodall <joshua@roughtrade.net>
To:        FreeBSD-gnats-submit@FreeBSD.org
Subject:   bin/37096: Fixes to fsdb command-line handling [patch]
Message-ID:  <20020415122640.7BE253E2A@green.shallow.net>

next in thread | raw e-mail | index | archive | help

>Number:         37096
>Category:       bin
>Synopsis:       Fixes to fsdb command-line handling [patch]
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Mon Apr 15 05:30:01 PDT 2002
>Closed-Date:
>Last-Modified:
>Originator:     Joshua Goodall
>Release:        FreeBSD 5.0-CURRENT i386
>Organization:
>Environment:
System: FreeBSD gold.shallow.net 5.0-CURRENT FreeBSD 5.0-CURRENT #1: Mon Apr 15 17:55:08 EST 2002 joshua@green.shallow.net:/usr/obj/usr/current/sys/GENERIC i386
>Description:

fsdb(8) tries to handle the case where the last argument to a command
is slurped in whitespace-n-all. Unfortunately, it's applied across the
board, with hilarious results :

fsdb (inum: 2)> ls foo
Segmentation fault (core dumped)
#

This patch fixes that by setting a new flag FL_ST for commands as
appropriate.

Plus, for some reason, fsdb sometimes reports argc's, sometimes argc-1
in usage lines. argc is an implementation detail which != count of
arguments; this patch trivially fixes the cases seen.

Tested with today's -current.

>How-To-Repeat:
>Fix:

Index: sbin/fsdb/fsdb.c
===================================================================
RCS file: /cvs/src/sbin/fsdb/fsdb.c,v
retrieving revision 1.24
diff -u -r1.24 fsdb.c
--- sbin/fsdb/fsdb.c	21 Mar 2002 13:10:52 -0000	1.24
+++ sbin/fsdb/fsdb.c	15 Apr 2002 12:06:43 -0000
@@ -150,8 +150,8 @@
 	{ "?", "Print out help", 1, 1, FL_RO, helpfn },
 	{ "inode", "Set active inode to INUM", 2, 2, FL_RO, focus },
 	{ "clri", "Clear inode INUM", 2, 2, FL_WR, zapi },
-	{ "lookup", "Set active inode by looking up NAME", 2, 2, FL_RO, focusname },
-	{ "cd", "Set active inode by looking up NAME", 2, 2, FL_RO, focusname },
+	{ "lookup", "Set active inode by looking up NAME", 2, 2, FL_RO | FL_ST, focusname },
+	{ "cd", "Set active inode by looking up NAME", 2, 2, FL_RO | FL_ST, focusname },
 	{ "back", "Go to previous active inode", 1, 1, FL_RO, back },
 	{ "active", "Print active inode", 1, 1, FL_RO, active },
 	{ "print", "Print active inode", 1, 1, FL_RO, active },
@@ -160,11 +160,11 @@
 	{ "downlink", "Decrement link count", 1, 1, FL_WR, downlink },
 	{ "linkcount", "Set link count to COUNT", 2, 2, FL_WR, linkcount },
 	{ "ls", "List current inode as directory", 1, 1, FL_RO, ls },
-	{ "rm", "Remove NAME from current inode directory", 2, 2, FL_WR, rm },
-	{ "del", "Remove NAME from current inode directory", 2, 2, FL_WR, rm },
-	{ "ln", "Hardlink INO into current inode directory as NAME", 3, 3, FL_WR, ln },
+	{ "rm", "Remove NAME from current inode directory", 2, 2, FL_WR | FL_ST, rm },
+	{ "del", "Remove NAME from current inode directory", 2, 2, FL_WR | FL_ST, rm },
+	{ "ln", "Hardlink INO into current inode directory as NAME", 3, 3, FL_WR | FL_ST, ln },
 	{ "chinum", "Change dir entry number INDEX to INUM", 3, 3, FL_WR, chinum },
-	{ "chname", "Change dir entry number INDEX to NAME", 3, 3, FL_WR, chname },
+	{ "chname", "Change dir entry number INDEX to NAME", 3, 3, FL_WR | FL_ST, chname },
 	{ "chtype", "Change type of current inode to TYPE", 2, 2, FL_WR, newtype },
 	{ "chmod", "Change mode of current inode to MODE", 2, 2, FL_WR, chmode },
 	{ "chlen", "Change length of current inode to LENGTH", 2, 2, FL_WR, chlen },
@@ -187,11 +187,11 @@
     struct cmdtable *cmdtp;
 
     printf("Commands are:\n%-10s %5s %5s   %s\n",
-	   "command", "min argc", "max argc", "what");
+	   "command", "min args", "max args", "what");
     
     for (cmdtp = cmds; cmdtp->cmd; cmdtp++)
 	printf("%-10s %5u %5u   %s\n",
-	       cmdtp->cmd, cmdtp->minargc, cmdtp->maxargc, cmdtp->helptxt);
+	       cmdtp->cmd, cmdtp->minargc-1, cmdtp->maxargc-1, cmdtp->helptxt);
     return 0;
 }
 
@@ -254,7 +254,8 @@
 		    else if (cmd_argc >= cmdp->minargc &&
 			cmd_argc <= cmdp->maxargc)
 			rval = (*cmdp->handler)(cmd_argc, cmd_argv);
-		    else if (cmd_argc >= cmdp->minargc) {
+		    else if (cmd_argc >= cmdp->minargc &&
+			(cmdp->flags & FL_ST) == FL_ST) {
 			strcpy(line, elline);
 			cmd_argv = recrack(line, &cmd_argc, cmdp->maxargc);
 			rval = (*cmdp->handler)(cmd_argc, cmd_argv);
Index: sbin/fsdb/fsdb.h
===================================================================
RCS file: /cvs/src/sbin/fsdb/fsdb.h,v
retrieving revision 1.7
diff -u -r1.7 fsdb.h
--- sbin/fsdb/fsdb.h	21 Mar 2002 13:10:52 -0000	1.7
+++ sbin/fsdb/fsdb.h	15 Apr 2002 10:54:25 -0000
@@ -48,6 +48,7 @@
 	unsigned int flags;
 #define	FL_RO	0x0000		/* for symmetry */
 #define	FL_WR	0x0001		/* wants to write */
+#define	FL_ST	0x0002		/* resplit final string if argc > maxargc */
 	int (*handler)(int argc, char *argv[]);
 };
 extern struct dinode *curinode;
Index: sbin/fsdb/fsdbutil.c
===================================================================
RCS file: /cvs/src/sbin/fsdb/fsdbutil.c,v
retrieving revision 1.16
diff -u -r1.16 fsdbutil.c
--- sbin/fsdb/fsdbutil.c	21 Mar 2002 13:10:52 -0000	1.16
+++ sbin/fsdb/fsdbutil.c	15 Apr 2002 11:48:34 -0000
@@ -96,7 +96,7 @@
 {
     if (cmdp->minargc == cmdp->maxargc)
 	warnx("command `%s' takes %u arguments, got %u", cmdp->cmd,
-	    cmdp->minargc-1, argc);
+	    cmdp->minargc-1, argc-1);
     else
 	warnx("command `%s' takes from %u to %u arguments",
 	      cmdp->cmd, cmdp->minargc-1, cmdp->maxargc-1);
>Release-Note:
>Audit-Trail:
>Unformatted:

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20020415122640.7BE253E2A>