@@ -362,12 +362,12 @@ NOTE_C_STATIC unsigned char* _ensure(printbuffer * const p, size_t needed)
362362 return NULL ;
363363 }
364364
365+ needed += p -> offset + 1 ;
365366 if (needed > INT_MAX ) {
366367 /* sizes bigger than INT_MAX are currently not supported */
367368 return NULL ;
368369 }
369370
370- needed += p -> offset + 1 ;
371371 if (needed <= p -> length ) {
372372 return p -> buffer + p -> offset ;
373373 }
@@ -376,19 +376,8 @@ NOTE_C_STATIC unsigned char* _ensure(printbuffer * const p, size_t needed)
376376 return NULL ;
377377 }
378378
379- /* calculate new buffer size */
380- if (needed > (INT_MAX / 2 )) {
381- /* overflow of int, use INT_MAX if possible */
382- if (needed <= INT_MAX ) {
383- newsize = INT_MAX ;
384- } else {
385- return NULL ;
386- }
387- } else {
388- newsize = needed * 2 ;
389- }
390-
391379 /* otherwise reallocate manually */
380+ newsize = (ALLOC_CHUNK * ((needed / ALLOC_CHUNK ) + ((needed % ALLOC_CHUNK ) > 0 ))); // chunked, linear calculation for new buffer to reduce memory waste
392381 newbuffer = (unsigned char * )_Malloc (newsize );
393382 if (!newbuffer ) {
394383 _Free (p -> buffer );
@@ -1819,9 +1808,12 @@ NOTE_C_STATIC Jbool _add_item_to_array(J *array, J *item)
18191808N_CJSON_PUBLIC (void ) JAddItemToArray (J * array , J * item )
18201809{
18211810 if (array == NULL || item == NULL ) {
1811+ JDelete (item );
18221812 return ;
18231813 }
1824- _add_item_to_array (array , item );
1814+ if (!_add_item_to_array (array , item )) {
1815+ JDelete (item );
1816+ }
18251817}
18261818
18271819#if defined(__clang__ ) || (defined(__GNUC__ ) && ((__GNUC__ > 4 ) || ((__GNUC__ == 4 ) && (__GNUC_MINOR__ > 5 ))))
@@ -1874,34 +1866,46 @@ NOTE_C_STATIC Jbool _add_item_to_object(J * const object, const char * const str
18741866N_CJSON_PUBLIC (void ) JAddItemToObject (J * object , const char * string , J * item )
18751867{
18761868 if (object == NULL || string == NULL || item == NULL ) {
1869+ JDelete (item );
18771870 return ;
18781871 }
1879- _add_item_to_object (object , string , item , false);
1872+ if (!_add_item_to_object (object , string , item , false)) {
1873+ JDelete (item );
1874+ }
18801875}
18811876
18821877/* Add an item to an object with constant string as key */
18831878N_CJSON_PUBLIC (void ) JAddItemToObjectCS (J * object , const char * string , J * item )
18841879{
18851880 if (object == NULL || string == NULL || item == NULL ) {
1881+ JDelete (item );
18861882 return ;
18871883 }
1888- _add_item_to_object (object , string , item , true);
1884+ if (!_add_item_to_object (object , string , item , true)) {
1885+ JDelete (item );
1886+ }
18891887}
18901888
18911889N_CJSON_PUBLIC (void ) JAddItemReferenceToArray (J * array , J * item )
18921890{
18931891 if (array == NULL || item == NULL ) {
18941892 return ;
18951893 }
1896- _add_item_to_array (array , _create_reference (item ));
1894+ J * ref = _create_reference (item );
1895+ if (!_add_item_to_array (array , ref )) {
1896+ JDelete (ref );
1897+ }
18971898}
18981899
18991900N_CJSON_PUBLIC (void ) JAddItemReferenceToObject (J * object , const char * string , J * item )
19001901{
19011902 if (object == NULL || string == NULL || item == NULL ) {
19021903 return ;
19031904 }
1904- _add_item_to_object (object , string , _create_reference (item ), false);
1905+ J * ref = _create_reference (item );
1906+ if (!_add_item_to_object (object , string , ref , false)) {
1907+ JDelete (ref );
1908+ }
19051909}
19061910
19071911N_CJSON_PUBLIC (J * ) JAddTrueToObject (J * const object , const char * const name )
@@ -2170,18 +2174,22 @@ N_CJSON_PUBLIC(void) JDeleteItemFromObjectCaseSensitive(J *object, const char *s
21702174N_CJSON_PUBLIC (void ) JInsertItemInArray (J * array , int which , J * newitem )
21712175{
21722176 if (array == NULL || newitem == NULL ) {
2177+ JDelete (newitem );
21732178 return ;
21742179 }
21752180
21762181 J * after_inserted = NULL ;
21772182
21782183 if (which < 0 ) {
2184+ JDelete (newitem );
21792185 return ;
21802186 }
21812187
21822188 after_inserted = _get_array_item (array , (size_t )which );
21832189 if (after_inserted == NULL ) {
2184- _add_item_to_array (array , newitem );
2190+ if (!_add_item_to_array (array , newitem )) {
2191+ JDelete (newitem );
2192+ }
21852193 return ;
21862194 }
21872195
@@ -2228,14 +2236,18 @@ N_CJSON_PUBLIC(Jbool) JReplaceItemViaPointer(J * const parent, J * const item, J
22282236N_CJSON_PUBLIC (void ) JReplaceItemInArray (J * array , int which , J * newitem )
22292237{
22302238 if (array == NULL || newitem == NULL ) {
2239+ JDelete (newitem );
22312240 return ;
22322241 }
22332242
22342243 if (which < 0 ) {
2244+ JDelete (newitem );
22352245 return ;
22362246 }
22372247
2238- JReplaceItemViaPointer (array , _get_array_item (array , (size_t )which ), newitem );
2248+ if (!JReplaceItemViaPointer (array , _get_array_item (array , (size_t )which ), newitem )) {
2249+ JDelete (newitem );
2250+ }
22392251}
22402252
22412253NOTE_C_STATIC Jbool _replace_item_in_object (J * object , const char * string , J * replacement , Jbool case_sensitive )
@@ -2244,32 +2256,48 @@ NOTE_C_STATIC Jbool _replace_item_in_object(J *object, const char *string, J *re
22442256 return false;
22452257 }
22462258
2259+ J * existing = _get_object_item (object , string , case_sensitive );
2260+ if (existing == NULL ) {
2261+ return false;
2262+ }
2263+
2264+ char * new_key = (char * )_j_strdup ((const unsigned char * )string );
2265+ if (new_key == NULL ) {
2266+ return false;
2267+ }
2268+
22472269 /* replace the name in the replacement */
22482270 if (!(replacement -> type & JStringIsConst ) && (replacement -> string != NULL )) {
22492271 _Free (replacement -> string );
22502272 }
2251- replacement -> string = ( char * ) _j_strdup (( const unsigned char * ) string ) ;
2273+ replacement -> string = new_key ;
22522274 replacement -> type &= ~JStringIsConst ;
22532275
2254- JReplaceItemViaPointer (object , _get_object_item ( object , string , case_sensitive ) , replacement );
2276+ JReplaceItemViaPointer (object , existing , replacement );
22552277
22562278 return true;
22572279}
22582280
22592281N_CJSON_PUBLIC (void ) JReplaceItemInObject (J * object , const char * string , J * newitem )
22602282{
22612283 if (object == NULL || newitem == NULL ) {
2284+ JDelete (newitem );
22622285 return ;
22632286 }
2264- _replace_item_in_object (object , string , newitem , false);
2287+ if (!_replace_item_in_object (object , string , newitem , false)) {
2288+ JDelete (newitem );
2289+ }
22652290}
22662291
22672292N_CJSON_PUBLIC (void ) JReplaceItemInObjectCaseSensitive (J * object , const char * string , J * newitem )
22682293{
22692294 if (object == NULL || newitem == NULL ) {
2295+ JDelete (newitem );
22702296 return ;
22712297 }
2272- _replace_item_in_object (object , string , newitem , true);
2298+ if (!_replace_item_in_object (object , string , newitem , true)) {
2299+ JDelete (newitem );
2300+ }
22732301}
22742302
22752303N_CJSON_PUBLIC (J * ) JCreateTrue (void )
0 commit comments