From: Marcus M. <mar...@us...> - 2008-07-25 21:26:03
|
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; } } |