h265parser: Do not allocate too large size of memory for registered user data SEI
authorSeungha Yang <seungha@centricular.com>
Sat, 21 Mar 2020 09:25:25 +0000 (18:25 +0900)
committerGStreamer Merge Bot <gitlab-merge-bot@gstreamer-foundation.org>
Mon, 23 Mar 2020 15:21:42 +0000 (15:21 +0000)
Don't be confused by the unit of payload size (i.e., bits and bytes)
Also this need a documentation with Since mark

gst-libs/gst/codecparsers/gsth265parser.c
gst-libs/gst/codecparsers/gsth265parser.h

index 8297035..092e49e 100644 (file)
@@ -1201,8 +1201,10 @@ gst_h265_parser_parse_registered_user_data (GstH265Parser * parser,
   rud->data = NULL;
   rud->size = 0;
 
-  if (payload_size < 2)
-    return GST_H265_PARSER_ERROR;
+  if (payload_size < 2) {
+    GST_WARNING ("Too small payload size %d", payload_size);
+    return GST_H265_PARSER_BROKEN_DATA;
+  }
 
   READ_UINT8 (nr, rud->country_code, 8);
   --payload_size;
@@ -1214,15 +1216,17 @@ gst_h265_parser_parse_registered_user_data (GstH265Parser * parser,
     rud->country_code_extension = 0;
   }
 
-  if (payload_size < 8)
-    return GST_H265_PARSER_ERROR;
+  if (payload_size < 1) {
+    GST_WARNING ("No more remaining payload data to store");
+    return GST_H265_PARSER_BROKEN_DATA;
+  }
 
   data = g_malloc (payload_size);
-  for (i = 0; i < payload_size / 8; ++i) {
+  for (i = 0; i < payload_size; ++i) {
     READ_UINT8 (nr, data[i], 8);
   }
 
-  GST_MEMDUMP ("SEI user data", data, payload_size / 8);
+  GST_MEMDUMP ("SEI user data", data, payload_size);
 
   rud->data = data;
   rud->size = payload_size;
@@ -2574,7 +2578,7 @@ gst_h265_parser_parse_sei_message (GstH265Parser * parser,
 
   payload_start_pos_bit = nal_reader_get_pos (nr);
   GST_DEBUG
-      ("SEI message received: payloadType  %u, payloadSize = %u bytes",
+      ("SEI message received: payloadType  %u, payloadSize = %u bits",
       sei->payloadType, payload_size);
 
   if (nal_type == GST_H265_NAL_PREFIX_SEI) {
@@ -2591,7 +2595,7 @@ gst_h265_parser_parse_sei_message (GstH265Parser * parser,
         break;
       case GST_H265_SEI_REGISTERED_USER_DATA:
         res = gst_h265_parser_parse_registered_user_data (parser,
-            &sei->payload.registered_user_data, nr, payloadSize);
+            &sei->payload.registered_user_data, nr, payload_size >> 3);
         break;
       case GST_H265_SEI_RECOVERY_POINT:
         res = gst_h265_parser_parse_recovery_point (parser,
index 43c319f..2efa959 100644 (file)
@@ -1406,6 +1406,18 @@ struct _GstH265RecoveryPoint
   guint8 broken_link_flag;
 };
 
+/**
+ * GstH265RegisteredUserData:
+ * The User data registered by Rec. ITU-T T.35 SEI messag.
+ * @country_code: an itu_t_t35_country_code.
+ * @country_code_extension: an itu_t_t35_country_code_extension_byte.
+ *   Should be ignored when @country_code is not 0xff
+ * @data: the data of itu_t_t35_payload_byte
+ *   excluding @country_code and @country_code_extension
+ * @size: the size of @data in bytes
+ *
+ * Since: 1.18
+ */
 struct _GstH265RegisteredUserData
 {
   guint8 country_code;