// realloc static void * real() { int j,size, oldsize; void * current = NULL; oldsize = 0; for (j = 0 ; j < REALLOC_COUNT ; j ++) { TotalAlloc ++; size = (random() % MAX_ALLOCATE_SIZE); TotalAllocSize += size; if (oldsize && current) { memset(current, 'A', oldsize); } current = (void *)upnp_realloc(current, size); if (current && size && oldsize) { void *ptr = current; int c; int m = ((size > oldsize)?oldsize:size); for (c = 0 ; c <m ; c ++, ptr ++) { if (*((char*)ptr) != 'A') { printf("strdup error ! duplicated character error : %c [expected: %c]\n", *((char*)ptr), 'A'); upnp_mm_dump(); exit(1); } } } if ((!current) && size) { printf("reallocate Warning: out of memory (size : %d)\n", size); upnp_mm_dump(); NullAlloc ++; } oldsize = size; } return current; }
int iasnprintf( char **ret, int incr, int max, const char *fmt, ... ) { int size = incr; int retc = 0; va_list ap; char *temp = NULL; assert( ret ); assert( fmt ); #ifdef _UPNP_MM_ ( *ret ) = ( char * )upnp_malloc( incr ); #else ( *ret ) = ( char * )malloc( incr ); #endif while( 1 ) { va_start( ap, fmt ); retc = vsnprintf( ( *ret ), size, fmt, ap ); va_end( ap ); if( retc < 0 ) { //size not big enough //and vsnprintf does NOT return the //necessary number of bytes if( ( max != -1 ) && ( size == max ) ) //max reached { break; } incr *= 2; //increase increment //increase size and try again if( ( max != -1 ) && ( ( size + incr ) > max ) ) { incr = ( max - size ); } #ifdef _UPNP_MM_ temp = ( char * )upnp_realloc( ( *ret ), size + incr ); #else temp = ( char * )realloc( ( *ret ), size + incr ); #endif if( temp == NULL ) { break; } size += incr; ( *ret ) = temp; } else { if( ( retc + 1 ) > size ) { //size not big enough //and vsnprintf //returns the necessary //number of bytes if( ( max != -1 ) && ( retc + 1 > max ) ) { retc = -1; break; } #ifdef _UPNP_MM_ temp = ( char * )upnp_realloc( ( *ret ), retc + 1 ); #else temp = ( char * )realloc( ( *ret ), retc + 1 ); #endif if( temp == NULL ) { retc = -1; break; } size = retc + 1; ( *ret ) = temp; //size increased try again } else if( ( retc + 1 ) < size ) { //size is bigger than needed //try and reallocate smaller #ifdef _UPNP_MM_ temp = ( char * )upnp_realloc( ( *ret ), retc + 1 ); #else temp = ( char * )realloc( ( *ret ), retc + 1 ); #endif if( temp != NULL ) { ( *ret ) = temp; } break; } else //size is just right, exit { break; } } } if( retc < 0 ) { #ifdef _UPNP_MM_ upnp_free( ( *ret ) ); #else free( ( *ret ) ); #endif ( *ret ) = NULL; } return retc; }