From: Dan F. <dfa...@us...> - 2008-02-10 05:25:11
|
Update of /cvsroot/libexif/exif/libjpeg In directory sc8-pr-cvs6.sourceforge.net:/tmp/cvs-serv24562/libjpeg Modified Files: jpeg-data.c Log Message: Cleaned up more consistently at exit. Improved out of memory handling. Added ENABLE_GLIBC_MEMDEBUG macro to allow some glibc memory checking features to be manually enabled. Index: jpeg-data.c =================================================================== RCS file: /cvsroot/libexif/exif/libjpeg/jpeg-data.c,v retrieving revision 1.19 retrieving revision 1.20 diff -u -p -d -r1.19 -r1.20 --- jpeg-data.c 21 May 2007 16:09:27 -0000 1.19 +++ jpeg-data.c 10 Feb 2008 05:25:07 -0000 1.20 @@ -30,6 +30,13 @@ */ #include "exif/exif-i18n.h" +/* realloc that cleans up on memory failure and returns to caller */ +#define CLEANUP_REALLOC(p,s) { \ + unsigned char *cleanup_ptr = realloc((p),(s)); \ + if (!cleanup_ptr) { free(p); (p) = NULL; return; } \ + (p) = cleanup_ptr; \ +} + struct _JPEGDataPrivate { unsigned int ref_count; @@ -125,7 +132,7 @@ jpeg_data_save_data (JPEGData *data, uns s = data->sections[i]; /* Write the marker */ - *d = realloc (*d, sizeof (char) * (*ds + 2)); + CLEANUP_REALLOC (*d, sizeof (char) * (*ds + 2)); (*d)[*ds + 0] = 0xff; (*d)[*ds + 1] = s.marker; *ds += 2; @@ -137,17 +144,17 @@ jpeg_data_save_data (JPEGData *data, uns case JPEG_MARKER_APP1: exif_data_save_data (s.content.app1, &ed, &eds); if (!ed) break; - *d = realloc (*d, sizeof (char) * (*ds + 2)); + CLEANUP_REALLOC (*d, sizeof (char) * (*ds + 2)); (*d)[*ds + 0] = (eds + 2) >> 8; (*d)[*ds + 1] = (eds + 2) >> 0; *ds += 2; - *d = realloc (*d, sizeof (char) * (*ds + eds)); + CLEANUP_REALLOC (*d, sizeof (char) * (*ds + eds)); memcpy (*d + *ds, ed, eds); *ds += eds; free (ed); break; default: - *d = realloc (*d, sizeof (char) * + CLEANUP_REALLOC (*d, sizeof (char) * (*ds + s.content.generic.size + 2)); (*d)[*ds + 0] = (s.content.generic.size + 2) >> 8; (*d)[*ds + 1] = (s.content.generic.size + 2) >> 0; @@ -158,7 +165,7 @@ jpeg_data_save_data (JPEGData *data, uns /* In case of SOS, we need to write the data. */ if (s.marker == JPEG_MARKER_SOS) { - *d = realloc (*d, *ds + data->size); + CLEANUP_REALLOC (*d, *ds + data->size); memcpy (*d + *ds, data->data, data->size); *ds += data->size; } @@ -230,9 +237,10 @@ jpeg_data_load_data (JPEGData *data, con d + o - 4, len + 4); break; default: - s->content.generic.size = len; s->content.generic.data = malloc (sizeof (char) * len); + if (!s->content.generic.data) return; + s->content.generic.size = len; memcpy (s->content.generic.data, &d[o], len); /* In case of SOS, image data will follow. */ @@ -248,6 +256,7 @@ jpeg_data_load_data (JPEGData *data, con } data->data = malloc ( sizeof (char) * data->size); + if (!data->data) return; memcpy (data->data, d + o + len, data->size); o += data->size; |