Mercurial > trustbridge
view common/strhelp.c @ 92:4980b0deb773
Fix memleak in case of invalid signature
author | Andre Heinecke <aheinecke@intevation.de> |
---|---|
date | Fri, 21 Mar 2014 09:47:54 +0000 |
parents | 80ab2168760f |
children | c602d8cfa619 |
line wrap: on
line source
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <assert.h> static void out_of_core(void) { fputs("\nfatal: out of memory\n", stderr); exit(2); } void * xmalloc( size_t n ) { void *p = malloc( n ); if( !p ) out_of_core(); return p; } void * xrealloc( void *a, size_t n ) { void *p = realloc( a, n ); if( !p ) out_of_core(); return p; } char * xstrndup( const char *string, const size_t len ) { char *p = xmalloc( len + 1 ); memcpy( p, string, len ); p[len] = '\0'; return p; } unsigned int strv_length (char **str_array) { unsigned int i = 0; if (!str_array) return 0; while (str_array[i]) ++i; return i; } void array_append_str(char ***pArray, const char *string, const size_t len) { unsigned int old_len = 0; if (!*pArray) { *pArray = xmalloc(2 * sizeof(char*)); (*pArray)[0] = xstrndup(string, len); (*pArray)[1] = NULL; return; } old_len = strv_length(*pArray); *pArray = xrealloc(*pArray, sizeof(char**) * (old_len + 2)); (*pArray)[old_len] = xstrndup(string, len); (*pArray)[old_len + 1] = NULL; } void str_append_str(char **pDst, size_t *dst_len, const char *appendage, const size_t len) { if (!appendage) return; if (!(*pDst)) { *pDst = xstrndup(appendage, len); *dst_len = len; } else { size_t new_size = (*dst_len) + len + 1; char *p_old = *pDst; *pDst = xmalloc(new_size); strncpy(*pDst, p_old, *dst_len); strncpy(*pDst + *dst_len, appendage, len); *dst_len = new_size - 1; (*pDst)[*dst_len] = '\0'; free (p_old); } } void strfreev (char **str_array) { if (str_array) { int i; for (i = 0; str_array[i] != NULL; i++) free (str_array[i]); free (str_array); } }