From: Yue Tao <yue....@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....@windriver.com>
Signed-off-by: Robert Yang <liezhi.y...@windriver.com>
Signed-off-by: Mark Hatle <mark.ha...@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


_______________________________________________
Openembedded-core mailing list
Openembedded-core@lists.openembedded.org
http://lists.linuxtogo.org/cgi-bin/mailman/listinfo/openembedded-core

Reply via email to