use size_t for strbuffer writes, and avoid integer overflow

This commit is contained in:
JKL 2011-06-24 09:57:20 -07:00 committed by Petri Lehtinen
parent c0193bfb7f
commit cd9757512d
2 changed files with 12 additions and 5 deletions

View File

@ -13,6 +13,7 @@
#define STRBUFFER_MIN_SIZE 16 #define STRBUFFER_MIN_SIZE 16
#define STRBUFFER_FACTOR 2 #define STRBUFFER_FACTOR 2
#define STRBUFFER_SIZE_MAX ((size_t)-1)
int strbuffer_init(strbuffer_t *strbuff) int strbuffer_init(strbuffer_t *strbuff)
{ {
@ -64,13 +65,19 @@ int strbuffer_append_byte(strbuffer_t *strbuff, char byte)
return strbuffer_append_bytes(strbuff, &byte, 1); return strbuffer_append_bytes(strbuff, &byte, 1);
} }
int strbuffer_append_bytes(strbuffer_t *strbuff, const char *data, int size) int strbuffer_append_bytes(strbuffer_t *strbuff, const char *data, size_t size)
{ {
if(strbuff->length + size >= strbuff->size) if(size >= strbuff->size - strbuff->length)
{ {
size_t new_size; size_t new_size;
char *new_value; char *new_value;
/* avoid integer overflow */
if (strbuff->size > STRBUFFER_SIZE_MAX / STRBUFFER_FACTOR
|| size > STRBUFFER_SIZE_MAX - 1
|| strbuff->length > STRBUFFER_SIZE_MAX - 1 - size)
return -1;
new_size = max(strbuff->size * STRBUFFER_FACTOR, new_size = max(strbuff->size * STRBUFFER_FACTOR,
strbuff->length + size + 1); strbuff->length + size + 1);

View File

@ -10,8 +10,8 @@
typedef struct { typedef struct {
char *value; char *value;
int length; /* bytes used */ size_t length; /* bytes used */
int size; /* bytes allocated */ size_t size; /* bytes allocated */
} strbuffer_t; } strbuffer_t;
int strbuffer_init(strbuffer_t *strbuff); int strbuffer_init(strbuffer_t *strbuff);
@ -24,7 +24,7 @@ char *strbuffer_steal_value(strbuffer_t *strbuff);
int strbuffer_append(strbuffer_t *strbuff, const char *string); int strbuffer_append(strbuffer_t *strbuff, const char *string);
int strbuffer_append_byte(strbuffer_t *strbuff, char byte); int strbuffer_append_byte(strbuffer_t *strbuff, char byte);
int strbuffer_append_bytes(strbuffer_t *strbuff, const char *data, int size); int strbuffer_append_bytes(strbuffer_t *strbuff, const char *data, size_t size);
char strbuffer_pop(strbuffer_t *strbuff); char strbuffer_pop(strbuffer_t *strbuff);