jpegparse: Warn only malformed data in APP data.
authorVíctor Manuel Jáquez Leal <vjaquez@igalia.com>
Sun, 19 Feb 2023 09:41:51 +0000 (10:41 +0100)
committerTim-Philipp Müller <tim@centricular.com>
Tue, 18 Jul 2023 10:30:57 +0000 (12:30 +0200)
It's only malformed data in APP when its length is less than 6 chars,
because it should have at least an id string. Otherwise, if the id string
is not handled, no warning is raised, only a debug message noticing it.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5053>

subprojects/gst-plugins-bad/gst/jpegformat/gstjpegparse.c

index 8286718..6be24a2 100644 (file)
@@ -368,7 +368,7 @@ gst_jpeg_parse_app0 (GstJpegParse * parse, GstJpegSegment * seg)
   guint16 xd, yd;
   guint8 unit, xt, yt;
 
-  if (seg->size < 14)           /* length of interesting data in APP0 */
+  if (seg->size < 6)            /* less than 6 means no id string */
     return FALSE;
 
   gst_byte_reader_init (&reader, seg->data + seg->offset, seg->size);
@@ -449,7 +449,9 @@ gst_jpeg_parse_app0 (GstJpegParse * parse, GstJpegSegment * seg)
     return TRUE;
   }
 
-  return FALSE;
+  GST_DEBUG_OBJECT (parse, "Unhandled app0: %s", id_str);
+
+  return TRUE;
 }
 
 /* *INDENT-OFF* */
@@ -473,6 +475,9 @@ gst_jpeg_parse_app1 (GstJpegParse * parse, GstJpegSegment * seg)
   const guint8 *data;
   gint i;
 
+  if (seg->size < 6)            /* less than 6 means no id string */
+    return FALSE;
+
   gst_byte_reader_init (&reader, seg->data + seg->offset, seg->size);
   gst_byte_reader_skip_unchecked (&reader, 2);
 
@@ -510,12 +515,15 @@ gst_jpeg_parse_app1 (GstJpegParse * parse, GstJpegSegment * seg)
         gst_tag_list_unref (tags);
       } else {
         GST_INFO_OBJECT (parse, "failed to parse %s: %s", id_str, data);
+        return FALSE;
       }
     }
 
     return TRUE;
   }
 
+  GST_DEBUG_OBJECT (parse, "Unhandled app1: %s", id_str);
+
   return TRUE;
 }
 
@@ -526,7 +534,7 @@ gst_jpeg_parse_app14 (GstJpegParse * parse, GstJpegSegment * seg)
   const gchar *id_str;
   guint8 transform;
 
-  if (seg->size < 12)           /* length of interesting data in APP14 */
+  if (seg->size < 6)            /* less than 6 means no id string */
     return FALSE;
 
   gst_byte_reader_init (&reader, seg->data + seg->offset, seg->size);
@@ -535,8 +543,10 @@ gst_jpeg_parse_app14 (GstJpegParse * parse, GstJpegSegment * seg)
   if (!gst_byte_reader_get_string_utf8 (&reader, &id_str))
     return FALSE;
 
-  if (!g_str_has_prefix (id_str, "Adobe"))
-    return FALSE;
+  if (!g_str_has_prefix (id_str, "Adobe")) {
+    GST_DEBUG_OBJECT (parse, "Unhandled app14: %s", id_str);
+    return TRUE;
+  }
 
   /* skip version and flags */
   if (!gst_byte_reader_skip (&reader, 6))
@@ -581,13 +591,13 @@ gst_jpeg_parse_com (GstJpegParse * parse, GstJpegSegment * seg)
     return FALSE;
 
   comment = get_utf8_from_data (data, size);
+  if (!comment)
+    return FALSE;
 
-  if (comment) {
-    GST_INFO_OBJECT (parse, "comment found: %s", comment);
-    gst_tag_list_add (get_tag_list (parse), GST_TAG_MERGE_REPLACE,
-        GST_TAG_COMMENT, comment, NULL);
-    g_free (comment);
-  }
+  GST_INFO_OBJECT (parse, "comment found: %s", comment);
+  gst_tag_list_add (get_tag_list (parse), GST_TAG_MERGE_REPLACE,
+      GST_TAG_COMMENT, comment, NULL);
+  g_free (comment);
 
   return TRUE;
 }
@@ -786,25 +796,25 @@ gst_jpeg_parse_handle_frame (GstBaseParse * bparse, GstBaseParseFrame * frame,
       case GST_JPEG_MARKER_COM:
         if (!gst_jpeg_parse_com (parse, &seg)) {
           GST_ELEMENT_WARNING (parse, STREAM, FORMAT,
-              ("Failed to parse com segment"), (NULL));
+              ("Failed to parse com segment"), ("Invalid data"));
         }
         break;
       case GST_JPEG_MARKER_APP0:
         if (!gst_jpeg_parse_app0 (parse, &seg)) {
           GST_ELEMENT_WARNING (parse, STREAM, FORMAT,
-              ("Failed to parse app0 segment"), (NULL));
+              ("Failed to parse app0 segment"), ("Invalid data"));
         }
         break;
       case GST_JPEG_MARKER_APP1:
         if (!gst_jpeg_parse_app1 (parse, &seg)) {
           GST_ELEMENT_WARNING (parse, STREAM, FORMAT,
-              ("Failed to parse app1 segment"), (NULL));
+              ("Failed to parse app1 segment"), ("Invalid data"));
         }
         break;
       case GST_JPEG_MARKER_APP14:
         if (!gst_jpeg_parse_app14 (parse, &seg)) {
           GST_ELEMENT_WARNING (parse, STREAM, FORMAT,
-              ("Failed to parse app14 segment"), (NULL));
+              ("Failed to parse app14 segment"), ("Invalid data"));
         }
         break;
       case GST_JPEG_MARKER_DHT: