{
size_t current_offset= string->end - string->string;
char *new_value;
- size_t adjust= (need - (size_t)(string->current_size - (size_t)(string->end - string->string))) / string->block_size;
+ size_t adjust;
+ size_t new_size;
+ /* This is the block multiplier. To keep it larger and surive division errors we must round it up */
+ adjust= (need - (size_t)(string->current_size - (size_t)(string->end - string->string))) / string->block_size;
adjust++;
- new_value= (char *)realloc(string->string,
- sizeof(char) * ((adjust * string->block_size) + string->current_size));
+ new_size= sizeof(char) * (size_t)((adjust * string->block_size) + string->current_size);
+ /* Test for overflow */
+ if (new_size < need)
+ return MEMCACHED_MEMORY_ALLOCATION_FAILURE;
+
+ new_value= (char *)realloc(string->string, new_size);
if (new_value == NULL)
return MEMCACHED_MEMORY_ALLOCATION_FAILURE;
return MEMCACHED_SUCCESS;
}
-memcached_string_st *memcached_string_create(memcached_st *ptr, size_t initial_size)
+memcached_string_st *memcached_string_create(memcached_st *ptr, memcached_string_st *string, size_t initial_size)
{
memcached_return rc;
- memcached_string_st *string;
/* Saving malloc calls :) */
- string= (memcached_string_st *)malloc(sizeof(memcached_string_st));
- if (!string)
- return NULL;
+ if (string)
+ {
+ memset(string, 0, sizeof(memcached_string_st));
+ string->is_allocated= MEMCACHED_NOT_ALLOCATED;
+ }
+ else
+ {
+ string= (memcached_string_st *)malloc(sizeof(memcached_string_st));
+ if (!string)
+ return NULL;
+ memset(string, 0, sizeof(memcached_string_st));
+ string->is_allocated= MEMCACHED_ALLOCATED;
+ }
string->end= string->string;
- memset(string, 0, sizeof(memcached_string_st));
string->block_size= initial_size;
rc= memcached_string_check(string, initial_size);
return NULL;
}
- assert(string->string == string->end);
+ WATCHPOINT_ASSERT(string->string == string->end);
return string;
}
if (rc != MEMCACHED_SUCCESS)
return rc;
-
- assert(string->string);
- assert(string->end >= string->string && string->end <= string->string + string->current_size);
+
+ WATCHPOINT_ASSERT(length <= string->current_size);
+ WATCHPOINT_ASSERT(string->string);
+ WATCHPOINT_ASSERT(string->end >= string->string);
memcpy(string->end, value, length);
string->end+= length;
void memcached_string_free(memcached_st *ptr, memcached_string_st *string)
{
free(string->string);
- free(string);
+ if (string->is_allocated == MEMCACHED_ALLOCATED)
+ free(string);
}