Update of /cvsroot/libexif/libexif/libexif
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv8756/libexif
Modified Files:
exif-content.c
Log Message:
handle the case where we realloc to 0 entries,
triggered for instance by GIMP or EOG which clean their data.
Index: exif-content.c
===================================================================
RCS file: /cvsroot/libexif/libexif/libexif/exif-content.c,v
retrieving revision 1.25
retrieving revision 1.26
diff -u -p -d -r1.25 -r1.26
--- exif-content.c 17 Feb 2008 18:31:55 -0000 1.25
+++ exif-content.c 25 Jul 2008 21:25:58 -0000 1.26
@@ -157,7 +157,7 @@ void
exif_content_remove_entry (ExifContent *c, ExifEntry *e)
{
unsigned int i;
- ExifEntry **t;
+ ExifEntry **t, *temp;
if (!c || !c->priv || !e || (e->parent != c)) return;
@@ -166,15 +166,25 @@ exif_content_remove_entry (ExifContent *
if (i == c->count) return;
/* Remove the entry */
- memmove (&c->entries[i], &c->entries[i + 1],
+ temp = c->entries[i];
+ memcpy (&c->entries[i], &c->entries[i + 1],
sizeof (ExifEntry*) * (c->count - i - 1));
e->parent = NULL;
exif_entry_unref (e);
- t = exif_mem_realloc (c->priv->mem, c->entries,
- sizeof(ExifEntry*) * (c->count - 1));
- if (t) {
- c->entries = t;
- c->count--;
+ if (c->count > 1) {
+ t = exif_mem_realloc (c->priv->mem, c->entries,
+ sizeof(ExifEntry*) * (c->count - 1));
+ if (t) {
+ c->entries = t;
+ c->count--;
+ } else {
+ /* We overwrote one entry, restore it now. */
+ c->entries[c->count-1] = temp;
+ }
+ } else {
+ exif_mem_free (c->priv->mem, c->entries);
+ c->entries = NULL;
+ c->count = 0;
}
}
|