diff options
author | espie <> | 2004-05-01 10:52:59 +0000 |
---|---|---|
committer | espie <> | 2004-05-01 10:52:59 +0000 |
commit | 020a840ea33d9a0972e79af8e8d5b08fd704ff84 (patch) | |
tree | 1f27d0d8245ae0d59ef8d9d1db9d52e15d4a17c1 | |
parent | a4f10b37035e781770724661a37a45a83b65c25f (diff) | |
download | openbsd-020a840ea33d9a0972e79af8e8d5b08fd704ff84.tar.gz openbsd-020a840ea33d9a0972e79af8e8d5b08fd704ff84.tar.bz2 openbsd-020a840ea33d9a0972e79af8e8d5b08fd704ff84.zip |
let __strerror fill precisely the part of the buffer it can.
okay millert@
-rw-r--r-- | src/lib/libc/string/__strerror.c | 35 |
1 files changed, 18 insertions, 17 deletions
diff --git a/src/lib/libc/string/__strerror.c b/src/lib/libc/string/__strerror.c index ccb430247e..87b47b68e4 100644 --- a/src/lib/libc/string/__strerror.c +++ b/src/lib/libc/string/__strerror.c | |||
@@ -28,7 +28,7 @@ | |||
28 | */ | 28 | */ |
29 | 29 | ||
30 | #if defined(LIBC_SCCS) && !defined(lint) | 30 | #if defined(LIBC_SCCS) && !defined(lint) |
31 | static char *rcsid = "$OpenBSD: __strerror.c,v 1.11 2004/04/30 17:13:02 espie Exp $"; | 31 | static char *rcsid = "$OpenBSD: __strerror.c,v 1.12 2004/05/01 10:52:59 espie Exp $"; |
32 | #endif /* LIBC_SCCS and not lint */ | 32 | #endif /* LIBC_SCCS and not lint */ |
33 | 33 | ||
34 | #ifdef NLS | 34 | #ifdef NLS |
@@ -59,11 +59,10 @@ __digits10(unsigned int num) | |||
59 | return i; | 59 | return i; |
60 | } | 60 | } |
61 | 61 | ||
62 | static char * | 62 | void |
63 | __itoa(int num, char *buffer, size_t maxlen) | 63 | __itoa(int num, char *buffer, size_t start, size_t end) |
64 | { | 64 | { |
65 | char *p; | 65 | size_t pos; |
66 | size_t len; | ||
67 | unsigned int a; | 66 | unsigned int a; |
68 | int neg; | 67 | int neg; |
69 | 68 | ||
@@ -76,22 +75,25 @@ __itoa(int num, char *buffer, size_t maxlen) | |||
76 | neg = 0; | 75 | neg = 0; |
77 | } | 76 | } |
78 | 77 | ||
79 | len = __digits10(a); | 78 | pos = start + __digits10(a); |
80 | if (neg) | 79 | if (neg) |
81 | len++; | 80 | pos++; |
82 | 81 | ||
83 | if (len >= maxlen) | 82 | if (pos < end) |
84 | return NULL; | 83 | buffer[pos] = '\0'; |
85 | 84 | else | |
86 | buffer[len--] = '\0'; | 85 | buffer[end-1] = '\0'; |
86 | pos--; | ||
87 | do { | 87 | do { |
88 | buffer[len--] = (a % 10) + '0'; | 88 | |
89 | if (pos < end) | ||
90 | buffer[pos] = (a % 10) + '0'; | ||
91 | pos--; | ||
89 | a /= 10; | 92 | a /= 10; |
90 | } while (a != 0); | 93 | } while (a != 0); |
91 | if (neg) | 94 | if (neg) |
92 | *buffer = '-'; | 95 | if (pos < end) |
93 | 96 | buffer[pos] = '-'; | |
94 | return buffer; | ||
95 | } | 97 | } |
96 | 98 | ||
97 | /* | 99 | /* |
@@ -125,8 +127,7 @@ __strerror(int num, char *buf) | |||
125 | #else | 127 | #else |
126 | len = strlcpy(buf, UPREFIX, NL_TEXTMAX); | 128 | len = strlcpy(buf, UPREFIX, NL_TEXTMAX); |
127 | #endif | 129 | #endif |
128 | if (len < NL_TEXTMAX) | 130 | __itoa(num, buf, len, NL_TEXTMAX); |
129 | __itoa(num, buf + len, NL_TEXTMAX - len); | ||
130 | errno = EINVAL; | 131 | errno = EINVAL; |
131 | } | 132 | } |
132 | 133 | ||