commit e7c33c4af3ee448c689d2e18c473a554c64a1f00
parent 44bd9318348cff0d971f7bc6c496257854225118
Author: FRIGN <dev@frign.de>
Date: Sat, 28 Feb 2015 14:48:44 +0100
Audit basename(1)
1) be stricter which number of arguments is accepted (1 or 2)
2) basename already returns a pointer to "." is argv[0] is ""
3) No need to check for *p != '/', because basename() only returns
a string beginning with '/' which has length 1, so if strlen(p)
== 1, the only way for suffix to be "evaluated" is for off to
be > 0, being equal to suffix being "", but "" != "/".
4) don't calculate strlen twice for each string. Store it in a
ssize_t and check if it's > 0.
Diffstat:
2 files changed, 11 insertions(+), 14 deletions(-)
diff --git a/README b/README
@@ -7,9 +7,9 @@ across UNIX and UNIX-like systems.
The following tools are implemented ('*' == finished, '#' == UTF-8 support,
'=' == implicit UTF-8 support, '|' == audited):
- UTILITY POSIX 2008 COMPLIANT MISSING OPTIONS
- ------- -------------------- ---------------
-=* basename yes none
+ UTILITY POSIX 2008 COMPLIANT MISSING OPTIONS
+ ------- -------------------- ---------------
+=*| basename yes none
=* cal yes none
=* cat yes none
=* chgrp yes none
diff --git a/basename.c b/basename.c
@@ -5,8 +5,6 @@
#include "util.h"
-static void usage(void);
-
void
usage(void)
{
@@ -16,25 +14,24 @@ usage(void)
int
main(int argc, char *argv[])
{
+ ssize_t off;
char *p;
- size_t off;
ARGBEGIN {
default:
usage();
} ARGEND;
- if (argc < 1)
+ if (argc != 1 && argc != 2)
usage();
- p = strlen(argv[0]) ? basename(argv[0]) : ".";
- if (argc == 2 && *p != '/') {
- if (strlen(argv[1]) < strlen(p)) {
- off = strlen(p) - strlen(argv[1]);
- if (strcmp(&p[off], argv[1]) == 0)
- p[off] = '\0';
- }
+ p = basename(argv[0]);
+ if (argc == 2) {
+ off = strlen(p) - strlen(argv[1]);
+ if (off > 0 && !strcmp(p + off, argv[1]))
+ p[off] = '\0';
}
puts(p);
+
return 0;
}