Date: Wed, 11 Oct 2000 15:17:24 -0400 (EDT) From: ak03@gte.com To: FreeBSD-gnats-submit@freebsd.org Cc: des@freebsd.org Subject: bin/21918: Unjustified basename code removal and subsequent breakage Message-ID: <200010111917.e9BJHOb80947@h132-197-97-45.gte.com>
next in thread | raw e-mail | index | archive | help
>Number: 21918
>Category: bin
>Synopsis: Revision 1.5 provides incomplete fix for 1.4 breakage by DES
>Confidential: no
>Severity: serious
>Priority: high
>Responsible: freebsd-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: sw-bug
>Submitter-Id: current-users
>Arrival-Date: Wed Oct 11 12:50:01 PDT 2000
>Closed-Date:
>Last-Modified:
>Originator: Alexander Kabaev
>Release: FreeBSD 5.0-CURRENT i386
>Organization:
Verizon Laboratories Inc.
>Environment:
FreeBSD-CURRENT PRE_SMPNG and later
>Description:
The comment on the old (correct) revision states that:
If the suffix operand is present, is not identical to the
characters remaining in string, and is identical to a suffix
of the characters remaining in string, the suffix suffix
shall be removed from string.
The new version removes suffix even when suffix is identical
to the remaining string itself. That is clearly not the
behaviour both comment and basename man page describe.
>How-To-Repeat:
in sh:
% basename filename.ext filename.ext
%
in ksh:
% basename filename.ext filename.ext
filename.ext
%
>Fix:
Index: basename.c
===================================================================
RCS file: /usr/ncvs/src/usr.bin/basename/basename.c,v
retrieving revision 1.5
diff -u -r1.5 basename.c
--- basename.c 2000/09/06 07:28:02 1.5
+++ basename.c 2000/10/11 19:00:43
@@ -56,7 +56,7 @@
int argc;
char **argv;
{
- char *p, *q;
+ char *p;
int ch;
while ((ch = getopt(argc, argv, "")) != -1)
@@ -73,8 +73,25 @@
if ((p = basename(argv[0])) == NULL)
err(1, "%s", argv[0]);
- if (*++argv && (q = strstr(p, *argv)) && strcmp(q, *argv) == 0)
- *q = '\0';
+
+ /*
+ * If the suffix operand is present, is not identical to the
+ * characters remaining in string, and is identical to a suffix
+ * of the characters remaining in string, the suffix
+ * shall be removed from string.
+ */
+ if (*++argv) {
+ int suffixlen, stringlen, off;
+
+ suffixlen = strlen(*argv);
+ stringlen = strlen(p);
+
+ if (suffixlen < stringlen) {
+ off = stringlen - suffixlen;
+ if (!strcmp(p + off, *argv))
+ p[off] = '\0';
+ }
+ }
(void)printf("%s\n", p);
exit(0);
}
>Release-Note:
>Audit-Trail:
>Unformatted:
Alexander N. Kabaev
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?200010111917.e9BJHOb80947>
