sbase

suckless unix tools
git clone git://git.2f30.org/sbase
Log | Files | Refs | README | LICENSE

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:
MREADME | 6+++---
Mbasename.c | 19++++++++-----------
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; }