diff --git a/cJSON.c b/cJSON.c index d1439dd..77b148b 100644 --- a/cJSON.c +++ b/cJSON.c @@ -1055,17 +1055,28 @@ static unsigned char *print(const cJSON * const item, cJSON_bool format, const i } update_offset(buffer); - /* copy the buffer over to a new one */ - printed = (unsigned char*) hooks->allocate(buffer->offset + 1); - if (printed == NULL) + /* check if reallocate is available */ + if (hooks->reallocate != NULL) { - goto fail; + printed = (unsigned char*) hooks->reallocate(buffer->buffer, buffer->length); + buffer->buffer = NULL; + if (printed == NULL) { + goto fail; + } } - strncpy((char*)printed, (char*)buffer->buffer, min(buffer->length, buffer->offset + 1)); - printed[buffer->offset] = '\0'; /* just to be sure */ + else /* otherwise copy the JSON over to a new buffer */ + { + printed = (unsigned char*) hooks->allocate(buffer->offset + 1); + if (printed == NULL) + { + goto fail; + } + memcpy(printed, buffer->buffer, min(buffer->length, buffer->offset + 1)); + printed[buffer->offset] = '\0'; /* just to be sure */ - /* free the buffer */ - hooks->deallocate(buffer->buffer); + /* free the buffer */ + hooks->deallocate(buffer->buffer); + } return printed;