in src/buffer.c [151:201]
int BUFFER_build(BUFFER_HANDLE handle, const unsigned char* source, size_t size)
{
int result;
if (handle == NULL)
{
/* Codes_SRS_BUFFER_07_009: [BUFFER_build shall return nonzero if handle is NULL ] */
result = MU_FAILURE;
}
/* Codes_SRS_BUFFER_01_002: [The size argument can be zero, in which case the underlying buffer held by the buffer instance shall be freed.] */
else if (size == 0)
{
/* Codes_SRS_BUFFER_01_003: [If size is zero, source can be NULL.] */
BUFFER* b = handle;
free(b->buffer);
b->buffer = NULL;
b->size = 0;
result = 0;
}
else
{
if (source == NULL)
{
/* Codes_SRS_BUFFER_01_001: [If size is positive and source is NULL, BUFFER_build shall return nonzero] */
result = MU_FAILURE;
}
else
{
BUFFER* b = handle;
/* Codes_SRS_BUFFER_07_011: [BUFFER_build shall overwrite previous contents if the buffer has been previously allocated.] */
unsigned char* newBuffer = realloc(b->buffer, size);
if (newBuffer == NULL)
{
/* Codes_SRS_BUFFER_07_010: [BUFFER_build shall return nonzero if any error is encountered.] */
LogError("Failure reallocating buffer");
result = MU_FAILURE;
}
else
{
b->buffer = newBuffer;
b->size = size;
/* Codes_SRS_BUFFER_01_002: [The size argument can be zero, in which case nothing shall be copied from source.] */
(void)memcpy(b->buffer, source, size);
result = 0;
}
}
}
return result;
}