Denis Vlasenko spotted the lack of bounds checking in my first attempt at

itoa/utoa.
This commit is contained in:
Rob Landley 2006-07-11 00:44:36 +00:00
parent 1cca9484db
commit 22d3958d76

View File

@ -237,19 +237,21 @@ int wait4pid(int pid)
// http://www.unix.org/whitepapers/64bit.html // http://www.unix.org/whitepapers/64bit.html
static char local_buf[12]; static char local_buf[12];
void utoa_to_buf(unsigned n, char *buf, int buflen) void utoa_to_buf(unsigned n, char *buf, unsigned buflen)
{ {
int i, out = 0; int i, out = 0;
for (i=1000000000; i; i/=10) { if (buflen) {
int res = n/i; for (i=1000000000; i; i/=10) {
int res = n/i;
if (res || out || i == 1) { if ((res || out || i == 1) && --buflen>0) {
out++; out++;
n -= res*i; n -= res*i;
*buf++ = '0' + res; *buf++ = '0' + res;
}
} }
*buf = 0;
} }
*buf = 0;
} }
// Note: uses static buffer, calling it twice in a row will overwrite. // Note: uses static buffer, calling it twice in a row will overwrite.
@ -261,11 +263,12 @@ char *utoa(unsigned n)
return local_buf; return local_buf;
} }
void itoa_to_buf(int n, char *buf, int buflen) void itoa_to_buf(int n, char *buf, unsigned buflen)
{ {
if (n<0) { if (buflen && n<0) {
n = -n; n = -n;
*buf++ = '-'; *buf++ = '-';
buflen--;
} }
utoa_to_buf((unsigned)n, buf, buflen); utoa_to_buf((unsigned)n, buf, buflen);
} }