@@ -1760,6 +1760,7 @@ typedef struct {
1760
1760
1761
1761
typedef struct {
1762
1762
int count ;
1763
+ int alloc_count ;
1763
1764
image_info_data * list ;
1764
1765
} image_info_list ;
1765
1766
/* }}} */
@@ -1880,6 +1881,7 @@ typedef struct {
1880
1881
1881
1882
typedef struct {
1882
1883
int count ;
1884
+ int alloc_count ;
1883
1885
file_section * list ;
1884
1886
} file_section_list ;
1885
1887
@@ -2004,11 +2006,14 @@ typedef struct {
2004
2006
*/
2005
2007
static int exif_file_sections_add (image_info_type * ImageInfo , int type , size_t size , uchar * data )
2006
2008
{
2007
- file_section * tmp ;
2008
- int count = ImageInfo -> file .count ;
2009
+ int count = ImageInfo -> file .count ;
2010
+ if (count == ImageInfo -> file .alloc_count ) {
2011
+ int new_alloc_count = ImageInfo -> file .alloc_count ? ImageInfo -> file .alloc_count * 2 : 1 ;
2012
+ ImageInfo -> file .list = safe_erealloc (
2013
+ ImageInfo -> file .list , new_alloc_count , sizeof (file_section ), 0 );
2014
+ ImageInfo -> file .alloc_count = new_alloc_count ;
2015
+ }
2009
2016
2010
- tmp = safe_erealloc (ImageInfo -> file .list , (count + 1 ), sizeof (file_section ), 0 );
2011
- ImageInfo -> file .list = tmp ;
2012
2017
ImageInfo -> file .list [count ].type = 0xFFFF ;
2013
2018
ImageInfo -> file .list [count ].data = NULL ;
2014
2019
ImageInfo -> file .list [count ].size = 0 ;
@@ -2064,6 +2069,16 @@ static int exif_file_sections_free(image_info_type *ImageInfo)
2064
2069
}
2065
2070
/* }}} */
2066
2071
2072
+ static image_info_data * exif_alloc_image_info_data (image_info_list * info_list ) {
2073
+ if (info_list -> count == info_list -> alloc_count ) {
2074
+ int new_alloc_count = info_list -> alloc_count ? info_list -> alloc_count * 2 : 1 ;
2075
+ info_list -> list = safe_erealloc (
2076
+ info_list -> list , new_alloc_count , sizeof (image_info_data ), 0 );
2077
+ info_list -> alloc_count = new_alloc_count ;
2078
+ }
2079
+ return & info_list -> list [info_list -> count ++ ];
2080
+ }
2081
+
2067
2082
/* {{{ exif_iif_add_value
2068
2083
Add a value to image_info
2069
2084
*/
@@ -2073,16 +2088,12 @@ static void exif_iif_add_value(image_info_type *image_info, int section_index, c
2073
2088
void * vptr , * vptr_end ;
2074
2089
image_info_value * info_value ;
2075
2090
image_info_data * info_data ;
2076
- image_info_data * list ;
2077
2091
2078
2092
if (length < 0 ) {
2079
2093
return ;
2080
2094
}
2081
2095
2082
- list = safe_erealloc (image_info -> info_list [section_index ].list , (image_info -> info_list [section_index ].count + 1 ), sizeof (image_info_data ), 0 );
2083
- image_info -> info_list [section_index ].list = list ;
2084
-
2085
- info_data = & image_info -> info_list [section_index ].list [image_info -> info_list [section_index ].count ];
2096
+ info_data = exif_alloc_image_info_data (& image_info -> info_list [section_index ]);
2086
2097
memset (info_data , 0 , sizeof (image_info_data ));
2087
2098
info_data -> tag = tag ;
2088
2099
info_data -> format = format ;
@@ -2205,7 +2216,6 @@ static void exif_iif_add_value(image_info_type *image_info, int section_index, c
2205
2216
}
2206
2217
}
2207
2218
image_info -> sections_found |= 1 <<section_index ;
2208
- image_info -> info_list [section_index ].count ++ ;
2209
2219
}
2210
2220
/* }}} */
2211
2221
@@ -2223,20 +2233,13 @@ static void exif_iif_add_tag(image_info_type *image_info, int section_index, cha
2223
2233
*/
2224
2234
static void exif_iif_add_int (image_info_type * image_info , int section_index , char * name , int value )
2225
2235
{
2226
- image_info_data * info_data ;
2227
- image_info_data * list ;
2228
-
2229
- list = safe_erealloc (image_info -> info_list [section_index ].list , (image_info -> info_list [section_index ].count + 1 ), sizeof (image_info_data ), 0 );
2230
- image_info -> info_list [section_index ].list = list ;
2231
-
2232
- info_data = & image_info -> info_list [section_index ].list [image_info -> info_list [section_index ].count ];
2236
+ image_info_data * info_data = exif_alloc_image_info_data (& image_info -> info_list [section_index ]);
2233
2237
info_data -> tag = TAG_NONE ;
2234
2238
info_data -> format = TAG_FMT_SLONG ;
2235
2239
info_data -> length = 1 ;
2236
2240
info_data -> name = estrdup (name );
2237
2241
info_data -> value .i = value ;
2238
2242
image_info -> sections_found |= 1 <<section_index ;
2239
- image_info -> info_list [section_index ].count ++ ;
2240
2243
}
2241
2244
/* }}} */
2242
2245
@@ -2245,20 +2248,15 @@ static void exif_iif_add_int(image_info_type *image_info, int section_index, cha
2245
2248
*/
2246
2249
static void exif_iif_add_str (image_info_type * image_info , int section_index , char * name , char * value )
2247
2250
{
2248
- image_info_data * info_data ;
2249
- image_info_data * list ;
2250
-
2251
2251
if (value ) {
2252
- list = safe_erealloc (image_info -> info_list [section_index ].list , (image_info -> info_list [section_index ].count + 1 ), sizeof (image_info_data ), 0 );
2253
- image_info -> info_list [section_index ].list = list ;
2254
- info_data = & image_info -> info_list [section_index ].list [image_info -> info_list [section_index ].count ];
2252
+ image_info_data * info_data =
2253
+ exif_alloc_image_info_data (& image_info -> info_list [section_index ]);
2255
2254
info_data -> tag = TAG_NONE ;
2256
2255
info_data -> format = TAG_FMT_STRING ;
2257
2256
info_data -> length = 1 ;
2258
2257
info_data -> name = estrdup (name );
2259
2258
info_data -> value .s = estrdup (value );
2260
2259
image_info -> sections_found |= 1 <<section_index ;
2261
- image_info -> info_list [section_index ].count ++ ;
2262
2260
}
2263
2261
}
2264
2262
/* }}} */
@@ -2286,13 +2284,9 @@ static void exif_iif_add_fmt(image_info_type *image_info, int section_index, cha
2286
2284
*/
2287
2285
static void exif_iif_add_buffer (image_info_type * image_info , int section_index , char * name , int length , char * value )
2288
2286
{
2289
- image_info_data * info_data ;
2290
- image_info_data * list ;
2291
-
2292
2287
if (value ) {
2293
- list = safe_erealloc (image_info -> info_list [section_index ].list , (image_info -> info_list [section_index ].count + 1 ), sizeof (image_info_data ), 0 );
2294
- image_info -> info_list [section_index ].list = list ;
2295
- info_data = & image_info -> info_list [section_index ].list [image_info -> info_list [section_index ].count ];
2288
+ image_info_data * info_data =
2289
+ exif_alloc_image_info_data (& image_info -> info_list [section_index ]);
2296
2290
info_data -> tag = TAG_NONE ;
2297
2291
info_data -> format = TAG_FMT_UNDEFINED ;
2298
2292
info_data -> length = length ;
@@ -2301,7 +2295,6 @@ static void exif_iif_add_buffer(image_info_type *image_info, int section_index,
2301
2295
memcpy (info_data -> value .s , value , length );
2302
2296
info_data -> value .s [length ] = 0 ;
2303
2297
image_info -> sections_found |= 1 <<section_index ;
2304
- image_info -> info_list [section_index ].count ++ ;
2305
2298
}
2306
2299
}
2307
2300
/* }}} */
0 commit comments