[OE-core] [denzil 06/18] Security Advisory - libexif - CVE-2012-2837
Mark Hatle
mark.hatle at windriver.com
Thu Feb 7 23:56:33 UTC 2013
From: Yue Tao <Yue.Tao at windriver.com>
[ CQID: WIND00366798 ]
The mnote_olympus_entry_get_value function in olympus/mnote-olympus-entry.c
in the EXIF Tag Parsing Library (aka libexif) before 0.6.21 allows remote
attackers to cause a denial of service (divide-by-zero error) via an image
with crafted EXIF tags that are not properly handled during the formatting
of EXIF maker note tags.
Signed-off-by: Yue Tao <Yue.Tao at windriver.com>
Signed-off-by: Robert Yang <liezhi.yang at windriver.com>
Signed-off-by: Mark Hatle <mark.hatle at windriver.com>
---
.../libexif/0005-libexif-CVE-2012-2837.patch | 114 +++++++++++++++++++++
meta/recipes-support/libexif/libexif_0.6.20.bb | 3 +-
2 files changed, 116 insertions(+), 1 deletion(-)
create mode 100644 meta/recipes-support/libexif/libexif/0005-libexif-CVE-2012-2837.patch
diff --git a/meta/recipes-support/libexif/libexif/0005-libexif-CVE-2012-2837.patch b/meta/recipes-support/libexif/libexif/0005-libexif-CVE-2012-2837.patch
new file mode 100644
index 0000000..7a6dd24
--- /dev/null
+++ b/meta/recipes-support/libexif/libexif/0005-libexif-CVE-2012-2837.patch
@@ -0,0 +1,114 @@
+Index: libexif/olympus/mnote-olympus-entry.c
+===================================================================
+RCS file: /cvsroot/libexif/libexif/libexif/olympus/mnote-olympus-entry.c,v
+retrieving revision 1.54
+retrieving revision 1.55
+diff -c -u -r1.54 -r1.55
+--- a/libexif/olympus/mnote-olympus-entry.c 18 Apr 2011 23:46:33 -0000 1.54
++++ b/libexif/olympus/mnote-olympus-entry.c 12 Jul 2012 17:29:05 -0000 1.55
+@@ -76,6 +76,9 @@
+ } \
+ }
+
++#define R2L(n) ((n).denominator ? (long)(n).numerator/(n).denominator : 0L)
++#define R2D(n) ((n).denominator ? (double)(n).numerator/(n).denominator : 0.0)
++
+ static const struct {
+ ExifTag tag;
+ ExifFormat fmt;
+@@ -372,20 +375,20 @@
+ CF (entry->format, EXIF_FORMAT_RATIONAL, v, maxlen);
+ CC (entry->components, 4, v, maxlen);
+ vr = exif_get_rational (entry->data, entry->order);
+- r = (double)vr.numerator / vr.denominator;
++ r = R2D(vr);
+ vr = exif_get_rational (entry->data+8, entry->order);
+- b = (double)vr.numerator / vr.denominator;
++ b = R2D(vr);
+ snprintf (v, maxlen, _("Red Correction %f, blue Correction %f"), r,b);
+ break;
+ case MNOTE_NIKON_TAG_MANUALFOCUSDISTANCE:
+ CF (entry->format, EXIF_FORMAT_RATIONAL, v, maxlen);
+ CC (entry->components, 1, v, maxlen);
+ vr = exif_get_rational (entry->data, entry->order);
+- if (vr.numerator) {
+- r = (double)vr.numerator / vr.denominator;
+- snprintf (v, maxlen, _("%2.2f meters"), r);
+- } else {
++ if (!vr.numerator || !vr.denominator) {
+ strncpy (v, _("No manual focus selection"), maxlen);
++ } else {
++ r = R2D(vr);
++ snprintf (v, maxlen, _("%2.2f meters"), r);
+ }
+ break;
+ case MNOTE_NIKON_TAG_SENSORPIXELSIZE:
+@@ -393,8 +396,8 @@
+ CC (entry->components, 2, v, maxlen);
+ vr = exif_get_rational (entry->data, entry->order);
+ vr2 = exif_get_rational (entry->data+8, entry->order);
+- r = (double)vr.numerator / vr.denominator;
+- b = (double)vr2.numerator / vr2.denominator;
++ r = R2D(vr);
++ b = R2D(vr2);
+ snprintf (v, maxlen, "%2.2f x %2.2f um", r, b);
+ break;
+ case MNOTE_NIKON_TAG_BRACKETING:
+@@ -450,10 +453,10 @@
+ if (entry->format == EXIF_FORMAT_RATIONAL) {
+ CC (entry->components, 1, v, maxlen);
+ vr = exif_get_rational (entry->data, entry->order);
+- if (!vr.numerator) {
++ if (!vr.numerator || !vr.denominator) {
+ strncpy (v, _("None"), maxlen);
+ } else {
+- r = (double)vr.numerator / vr.denominator;
++ r = R2D(vr);
+ snprintf (v, maxlen, "%2.2f", r);
+ }
+ break;
+@@ -568,13 +571,13 @@
+ double c,d;
+ unsigned long a,b;
+ vr = exif_get_rational (entry->data, entry->order);
+- a = vr.numerator / vr.denominator;
++ a = R2L(vr);
+ vr = exif_get_rational (entry->data+8, entry->order);
+- b = vr.numerator / vr.denominator;
++ b = R2L(vr);
+ vr = exif_get_rational (entry->data+16, entry->order);
+- c = (double)vr.numerator / vr.denominator;
++ c = R2D(vr);
+ vr = exif_get_rational (entry->data+24, entry->order);
+- d = (double)vr.numerator / vr.denominator;
++ d = R2D(vr);
+ snprintf (v, maxlen, "%ld-%ldmm 1:%3.1f - %3.1f",a,b,c,d);
+ }
+ break;
+@@ -682,7 +685,7 @@
+ CF (entry->format, EXIF_FORMAT_RATIONAL, v, maxlen);
+ CC (entry->components, 1, v, maxlen);
+ vr = exif_get_rational (entry->data, entry->order);
+- if (vr.numerator == 0) {
++ if (!vr.numerator || !vr.denominator) {
+ strncpy (v, _("Unknown"), maxlen);
+ }
+ else {
+@@ -793,7 +796,7 @@
+ if (!vr.denominator) {
+ strncpy (v, _("Infinite"), maxlen);
+ } else {
+- r = (double)vr.numerator / vr.denominator;
++ r = R2D(vr);
+ snprintf (v, maxlen, "%2.3f", r);
+ }
+ break;
+@@ -803,7 +806,7 @@
+ if (!vsr.denominator) {
+ strncpy (v, _("Infinite"), maxlen);
+ } else {
+- r = (double)vsr.numerator / vsr.denominator;
++ r = R2D(vsr);
+ snprintf (v, maxlen, "%2.3f", r);
+ }
+ break;
diff --git a/meta/recipes-support/libexif/libexif_0.6.20.bb b/meta/recipes-support/libexif/libexif_0.6.20.bb
index 25de763..6affc9e 100644
--- a/meta/recipes-support/libexif/libexif_0.6.20.bb
+++ b/meta/recipes-support/libexif/libexif_0.6.20.bb
@@ -10,7 +10,8 @@ SRC_URI = "${SOURCEFORGE_MIRROR}/libexif/libexif-${PV}.tar.bz2 \
file://0001-libexif-CVE-2012-2813.patch \
file://0002-libexif-CVE-2012-2812.patch \
file://0003-libexif-CVE-2012-2841.patch \
- file://0004-libexif-CVE-2012-2836.patch"
+ file://0004-libexif-CVE-2012-2836.patch \
+ file://0005-libexif-CVE-2012-2837.patch"
SRC_URI[md5sum] = "19844ce6b5d075af16f0d45de1e8a6a3"
SRC_URI[sha256sum] = "a772d20bd8fb9802d7f0d70fde6ac8872f87d0c66c52b0d14026dafcaa83d715"
--
1.8.1.2.545.g2f19ada
More information about the Openembedded-core
mailing list