]> git.alsa-project.org Git - alsa-gobject.git/commitdiff
ctl: card: add error path when generating name list at element addition
authorTakashi Sakamoto <o-takashi@sakamocchi.jp>
Thu, 2 Jun 2022 09:26:26 +0000 (18:26 +0900)
committer坂本 貴史 <o-takashi@sakamocchi.jp>
Thu, 2 Jun 2022 09:32:52 +0000 (18:32 +0900)
Current implementation of ALSA control core has limitation of name list
when adding or replacing element set.

This commit adds error path when being over the limitation

Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
src/ctl/card.c

index 1dc0edc8fa0561f8d58cddc64096e00fce723959..56ce39ed661185477d82aaeecf209862f97aaeea 100644 (file)
@@ -743,7 +743,7 @@ gboolean alsactl_card_command_elem_tlv(ALSACtlCard *self, const ALSACtlElemId *e
     return TRUE;
 }
 
-static void prepare_enum_names(struct snd_ctl_elem_info *info, const gchar **labels)
+static gboolean prepare_enum_names(struct snd_ctl_elem_info *info, const gchar **labels)
 {
     unsigned int count;
     unsigned int length;
@@ -753,12 +753,12 @@ static void prepare_enum_names(struct snd_ctl_elem_info *info, const gchar **lab
     for (count = 0; labels[count] != NULL; ++count) {
         const gchar *label = labels[count];
 
-        g_return_if_fail(strlen(label) < 64);
+        g_return_val_if_fail(strlen(label) < 64, FALSE);
 
         length += strlen(label) + 1;
     }
 
-    g_return_if_fail(length <= 64 * 1024);
+    g_return_val_if_fail(length <= 64 * 1024, FALSE);
 
     pos = g_malloc0(length);
 
@@ -772,6 +772,8 @@ static void prepare_enum_names(struct snd_ctl_elem_info *info, const gchar **lab
         pos += strlen(label) + 1;
     }
     info->value.enumerated.items = count;
+
+    return TRUE;
 }
 
 static gboolean add_or_replace_elems(int fd, const ALSACtlElemId *elem_id, guint elem_count,
@@ -800,7 +802,8 @@ static gboolean add_or_replace_elems(int fd, const ALSACtlElemId *elem_id, guint
         if (!alsactl_elem_info_get_enum_data(elem_info, &labels, error))
             return FALSE;
 
-        prepare_enum_names(info, labels);
+        if (!prepare_enum_names(info, labels))
+            return FALSE;
 
         break;
     }