Index: libexif/sources/libexif/exif-entry.c |
=================================================================== |
--- libexif/sources/libexif/exif-entry.c (revision 143189) |
+++ libexif/sources/libexif/exif-entry.c (working copy) |
@@ -1351,11 +1351,24 @@ |
case EXIF_TAG_XP_AUTHOR: |
case EXIF_TAG_XP_KEYWORDS: |
case EXIF_TAG_XP_SUBJECT: |
- /* Warning! The texts are converted from UTF16 to UTF8 */ |
- /* FIXME: use iconv to convert into the locale encoding */ |
- exif_convert_utf16_to_utf8(val, (unsigned short*)e->data, MIN(maxlen, e->size)); |
- break; |
+ { |
+ /* Sanity check the size to prevent overflow */ |
+ if (e->size+sizeof(unsigned short) < e->size) break; |
+ |
+ /* The tag may not be U+0000-terminated , so make a local |
+ U+0000-terminated copy before converting it */ |
+ unsigned short *utf16 = exif_mem_alloc (e->priv->mem, e->size+sizeof(unsigned short)); |
+ if (!utf16) break; |
+ memcpy(utf16, e->data, e->size); |
+ utf16[e->size/sizeof(unsigned short)] = 0; |
+ /* Warning! The texts are converted from UTF16 to UTF8 */ |
+ /* FIXME: use iconv to convert into the locale encoding */ |
+ exif_convert_utf16_to_utf8(val, utf16, maxlen); |
+ exif_mem_free(e->priv->mem, utf16); |
+ break; |
+ } |
+ |
default: |
/* Use a generic value formatting */ |
exif_entry_format_value(e, val, maxlen); |