diff options
Diffstat (limited to 'openbsd-compat/basename.c')
-rw-r--r-- | openbsd-compat/basename.c | 39 |
1 files changed, 20 insertions, 19 deletions
diff --git a/openbsd-compat/basename.c b/openbsd-compat/basename.c index 552dc1e1c..ad040e139 100644 --- a/openbsd-compat/basename.c +++ b/openbsd-compat/basename.c | |||
@@ -1,9 +1,7 @@ | |||
1 | /* OPENBSD ORIGINAL: lib/libc/gen/basename.c */ | 1 | /* $OpenBSD: basename.c,v 1.14 2005/08/08 08:05:33 espie Exp $ */ |
2 | |||
3 | /* $OpenBSD: basename.c,v 1.11 2003/06/17 21:56:23 millert Exp $ */ | ||
4 | 2 | ||
5 | /* | 3 | /* |
6 | * Copyright (c) 1997 Todd C. Miller <Todd.Miller@courtesan.com> | 4 | * Copyright (c) 1997, 2004 Todd C. Miller <Todd.Miller@courtesan.com> |
7 | * | 5 | * |
8 | * Permission to use, copy, modify, and distribute this software for any | 6 | * Permission to use, copy, modify, and distribute this software for any |
9 | * purpose with or without fee is hereby granted, provided that the above | 7 | * purpose with or without fee is hereby granted, provided that the above |
@@ -18,34 +16,35 @@ | |||
18 | * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | 16 | * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
19 | */ | 17 | */ |
20 | 18 | ||
19 | /* OPENBSD ORIGINAL: lib/libc/gen/basename.c */ | ||
20 | |||
21 | #include "includes.h" | 21 | #include "includes.h" |
22 | #ifndef HAVE_BASENAME | 22 | #ifndef HAVE_BASENAME |
23 | 23 | ||
24 | #ifndef lint | ||
25 | static char rcsid[] = "$OpenBSD: basename.c,v 1.11 2003/06/17 21:56:23 millert Exp $"; | ||
26 | #endif /* not lint */ | ||
27 | |||
28 | char * | 24 | char * |
29 | basename(const char *path) | 25 | basename(const char *path) |
30 | { | 26 | { |
31 | static char bname[MAXPATHLEN]; | 27 | static char bname[MAXPATHLEN]; |
32 | register const char *endp, *startp; | 28 | size_t len; |
29 | const char *endp, *startp; | ||
33 | 30 | ||
34 | /* Empty or NULL string gets treated as "." */ | 31 | /* Empty or NULL string gets treated as "." */ |
35 | if (path == NULL || *path == '\0') { | 32 | if (path == NULL || *path == '\0') { |
36 | (void)strlcpy(bname, ".", sizeof bname); | 33 | bname[0] = '.'; |
37 | return(bname); | 34 | bname[1] = '\0'; |
35 | return (bname); | ||
38 | } | 36 | } |
39 | 37 | ||
40 | /* Strip trailing slashes */ | 38 | /* Strip any trailing slashes */ |
41 | endp = path + strlen(path) - 1; | 39 | endp = path + strlen(path) - 1; |
42 | while (endp > path && *endp == '/') | 40 | while (endp > path && *endp == '/') |
43 | endp--; | 41 | endp--; |
44 | 42 | ||
45 | /* All slashes become "/" */ | 43 | /* All slashes becomes "/" */ |
46 | if (endp == path && *endp == '/') { | 44 | if (endp == path && *endp == '/') { |
47 | (void)strlcpy(bname, "/", sizeof bname); | 45 | bname[0] = '/'; |
48 | return(bname); | 46 | bname[1] = '\0'; |
47 | return (bname); | ||
49 | } | 48 | } |
50 | 49 | ||
51 | /* Find the start of the base */ | 50 | /* Find the start of the base */ |
@@ -53,12 +52,14 @@ basename(const char *path) | |||
53 | while (startp > path && *(startp - 1) != '/') | 52 | while (startp > path && *(startp - 1) != '/') |
54 | startp--; | 53 | startp--; |
55 | 54 | ||
56 | if (endp - startp + 2 > sizeof(bname)) { | 55 | len = endp - startp + 1; |
56 | if (len >= sizeof(bname)) { | ||
57 | errno = ENAMETOOLONG; | 57 | errno = ENAMETOOLONG; |
58 | return(NULL); | 58 | return (NULL); |
59 | } | 59 | } |
60 | strlcpy(bname, startp, endp - startp + 2); | 60 | memcpy(bname, startp, len); |
61 | return(bname); | 61 | bname[len] = '\0'; |
62 | return (bname); | ||
62 | } | 63 | } |
63 | 64 | ||
64 | #endif /* !defined(HAVE_BASENAME) */ | 65 | #endif /* !defined(HAVE_BASENAME) */ |