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.
This commit is contained in:
		
							
								
								
									
										2
									
								
								README
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								README
									
									
									
									
									
								
							@@ -9,7 +9,7 @@ The following tools are implemented ('*' == finished, '#' == UTF-8 support,
 | 
			
		||||
 | 
			
		||||
    UTILITY         POSIX 2008 COMPLIANT         MISSING OPTIONS
 | 
			
		||||
    -------         --------------------         ---------------
 | 
			
		||||
=*  basename        yes                          none
 | 
			
		||||
=*| basename        yes                          none
 | 
			
		||||
=*  cal             yes                          none
 | 
			
		||||
=*  cat             yes                          none
 | 
			
		||||
=*  chgrp           yes                          none
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										15
									
								
								basename.c
									
									
									
									
									
								
							
							
						
						
									
										15
									
								
								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)) {
 | 
			
		||||
	p = basename(argv[0]);
 | 
			
		||||
	if (argc == 2) {
 | 
			
		||||
		off = strlen(p) - strlen(argv[1]);
 | 
			
		||||
			if (strcmp(&p[off], argv[1]) == 0)
 | 
			
		||||
		if (off > 0 && !strcmp(p + off, argv[1]))
 | 
			
		||||
			p[off] = '\0';
 | 
			
		||||
	}
 | 
			
		||||
	}
 | 
			
		||||
	puts(p);
 | 
			
		||||
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user