fix handling of empty exif jpeg data
am: 95ebb389aa
Change-Id: Ibc99ba1b94f0f7217becce6eedcf11ca630c0ba3
diff --git a/libexif/exif-loader.c b/libexif/exif-loader.c
index 317b86b..7aebf1e 100644
--- a/libexif/exif-loader.c
+++ b/libexif/exif-loader.c
@@ -225,7 +225,7 @@
break;
}
- for (i = 0; i < sizeof (eld->b); i++)
+ for (i = 0; i < sizeof (eld->b); i++) {
switch (eld->state) {
case EL_EXIF_FOUND:
if (!exif_loader_copy (eld, eld->b + i,
@@ -233,9 +233,19 @@
return 0;
return exif_loader_copy (eld, buf, len);
case EL_SKIP_BYTES:
- eld->size--;
- if (!eld->size)
- eld->state = EL_READ;
+ switch (eld->size) {
+ case 0:
+ eld->state = EL_READ;
+ i--; // reprocess this byte
+ break;
+ case 1:
+ eld->size = 0;
+ eld->state = EL_READ;
+ break;
+ default:
+ eld->size--;
+ break;
+ }
break;
case EL_READ_SIZE_BYTE_24:
@@ -255,12 +265,20 @@
switch (eld->data_format) {
case EL_DATA_FORMAT_JPEG:
eld->state = EL_SKIP_BYTES;
- eld->size -= 2;
+ if (eld->size < 2) {
+ // Actually it's malformed...
+ eld->size = 0;
+ } else
+ eld->size -= 2;
break;
case EL_DATA_FORMAT_FUJI_RAW:
eld->data_format = EL_DATA_FORMAT_EXIF;
eld->state = EL_SKIP_BYTES;
- eld->size -= 86;
+ if (eld->size < 86) {
+ // Actually it's malformed...
+ eld->size = 0;
+ } else
+ eld->size -= 86; // and put this in an else
break;
case EL_DATA_FORMAT_EXIF:
eld->state = EL_EXIF_FOUND;
@@ -304,6 +322,7 @@
return 0;
}
}
+ }
/*
* If we reach this point, the buffer has not been big enough