Mercurial > code
changeset 21:ae4128d16c92
Improve security and FIXED size buffer
author | David Demelier <markand@malikania.fr> |
---|---|
date | Fri, 09 Sep 2011 17:32:53 +0200 |
parents | a7ff7f59c7f6 |
children | ecdf21f1d0c6 |
files | buffer.c buffer.h |
diffstat | 2 files changed, 12 insertions(+), 11 deletions(-) [+] |
line wrap: on
line diff
--- a/buffer.c Fri Sep 09 01:15:25 2011 +0200 +++ b/buffer.c Fri Sep 09 17:32:53 2011 +0200 @@ -64,10 +64,10 @@ if (buffer_grow(buf, length) < 0) return -1; - if (buf->flags & BUFFER_FIXED) + if (!(buf->flags & BUFFER_AUTO)) length = buf->size - buf->length - 1; - strncat(buf->data, str, length); + strncpy(buf->data + buf->length, str, length); buf->length = strlen(buf->data); return 0; @@ -83,6 +83,9 @@ if (buffer_grow(buf, 1) < 0) return -1; + if (!(buf->flags & BUFFER_AUTO) && buf->size - buf->length - 1 <= 2) + return -1; + buf->data[buf->length++] = c; buf->data[buf->length] = '\0'; @@ -100,7 +103,7 @@ return -1; /* Do not truncate void pointer */ - if (buf->flags & BUFFER_FIXED && size > (buf->size - buf->length - 1)) + if (!(buf->flags & BUFFER_AUTO) && size > (buf->size - buf->length - 1)) return -1; memcpy(buf->data + buf->length, data, size); @@ -232,17 +235,15 @@ if (buf->flags & BUFFER_AUTO) { newlen = buf->size; - while (newlen - buf->length - 1 < needed) + while (newlen - buf->length - 1 <= needed) newlen += buf->bsize; - if (!(buf->data = realloc(buf->data, buf->size))) + if (!(buf->data = realloc(buf->data, newlen))) return -1; buf->size = newlen; - } else - return (buf->bsize == buf->length) ? -1 : 0; - - memset(buf->data + buf->length, 0, buf->size - buf->length); + memset(buf->data + buf->length, 0, buf->size - buf->length); + } return 0; }
--- a/buffer.h Fri Sep 09 01:15:25 2011 +0200 +++ b/buffer.h Fri Sep 09 17:32:53 2011 +0200 @@ -27,8 +27,8 @@ char *data; /* string buffer */ size_t length; /* string's length */ -#define BUFFER_AUTO 0x00000000 -#define BUFFER_FIXED 0x00000001 +#define BUFFER_FIXED 0x00000000 +#define BUFFER_AUTO 0x00000001 int flags; /* buffer's flags (default AUTO) */ /* Private should not be modified by user */