From 0c55e971f46229a23f4d87eadcd1bd44e61f37dd Mon Sep 17 00:00:00 2001 From: Takashi Sakamoto Date: Fri, 13 Nov 2020 16:26:26 +0900 Subject: [PATCH] ctl: check whether method argument for GError is available In Rules for use of GError, the check of arguments for GError may be preferable to avoid to unexpected function call. This commit adds the check. Reference: https://developer.gnome.org/glib/stable/glib-Error-Reporting.html Signed-off-by: Takashi Sakamoto --- src/ctl/card.c | 33 +++++++++++++++++++++++++++++++-- src/ctl/elem-info.c | 14 ++++++++++++++ src/ctl/query.c | 4 ++++ 3 files changed, 49 insertions(+), 2 deletions(-) diff --git a/src/ctl/card.c b/src/ctl/card.c index 42534a2..32c277d 100644 --- a/src/ctl/card.c +++ b/src/ctl/card.c @@ -185,6 +185,8 @@ void alsactl_card_open(ALSACtlCard *self, guint card_id, gint open_flag, g_return_if_fail(ALSACTL_IS_CARD(self)); priv = alsactl_card_get_instance_private(self); + g_return_if_fail(error == NULL || *error == NULL); + alsactl_get_control_devnode(card_id, &devnode, error); if (*error != NULL) return; @@ -233,6 +235,8 @@ void alsactl_card_get_protocol_version(ALSACtlCard *self, g_return_if_fail(ALSACTL_IS_CARD(self)); priv = alsactl_card_get_instance_private(self); + g_return_if_fail(error == NULL || *error == NULL); + if (priv->fd < 0) { generate_error(error, ENXIO); return; @@ -261,6 +265,8 @@ void alsactl_card_get_info(ALSACtlCard *self, ALSACtlCardInfo **card_info, g_return_if_fail(ALSACTL_IS_CARD(self)); priv = alsactl_card_get_instance_private(self); + g_return_if_fail(error == NULL || *error == NULL); + *card_info = g_object_new(ALSACTL_TYPE_CARD_INFO, NULL); ctl_card_info_refer_private(*card_info, &info); @@ -341,6 +347,8 @@ void alsactl_card_get_elem_id_list(ALSACtlCard *self, GList **entries, g_return_if_fail(ALSACTL_IS_CARD(self)); priv = alsactl_card_get_instance_private(self); + g_return_if_fail(error == NULL || *error == NULL); + allocate_elem_ids(priv->fd, &list, error); if (*error != NULL) return; @@ -376,6 +384,8 @@ void alsactl_card_lock_elem(ALSACtlCard *self, const ALSACtlElemId *elem_id, g_return_if_fail(ALSACTL_IS_CARD(self)); priv = alsactl_card_get_instance_private(self); + g_return_if_fail(error == NULL || *error == NULL); + if (lock) ret = ioctl(priv->fd, SNDRV_CTL_IOCTL_ELEM_LOCK, elem_id); else @@ -433,6 +443,8 @@ void alsactl_card_get_elem_info(ALSACtlCard *self, const ALSACtlElemId *elem_id, g_return_if_fail(elem_id != NULL); priv = alsactl_card_get_instance_private(self); + g_return_if_fail(error == NULL || *error == NULL); + *elem_info = g_object_new(ALSACTL_TYPE_ELEM_INFO, NULL); ctl_elem_info_refer_private(*elem_info, &info); @@ -501,6 +513,8 @@ void alsactl_card_write_elem_tlv(ALSACtlCard *self, g_return_if_fail(elem_id != NULL); priv = alsactl_card_get_instance_private(self); + g_return_if_fail(error == NULL || *error == NULL); + // At least two quadlets should be included for type and length. if (container == NULL || container_count < 2) { generate_error(error, EINVAL); @@ -547,6 +561,8 @@ void alsactl_card_read_elem_tlv(ALSACtlCard *self, const ALSACtlElemId *elem_id, g_return_if_fail(elem_id != NULL); priv = alsactl_card_get_instance_private(self); + g_return_if_fail(error == NULL || *error == NULL); + // At least two quadlets should be included for type and length. if (*container == NULL || *container_count < 2) { generate_error(error, EINVAL); @@ -596,6 +612,8 @@ void alsactl_card_command_elem_tlv(ALSACtlCard *self, g_return_if_fail(elem_id != NULL); priv = alsactl_card_get_instance_private(self); + g_return_if_fail(error == NULL || *error == NULL); + // At least two quadlets should be included for type and length. if (*container == NULL || *container_count < 2) { generate_error(error, EINVAL); @@ -689,8 +707,7 @@ static void add_or_replace_elems(int fd, const ALSACtlElemId *elem_id, break; } default: - generate_error(error, ENXIO); - return; + g_return_if_reached(); } info->id = *elem_id; @@ -741,6 +758,8 @@ void alsactl_card_add_elems(ALSACtlCard *self, const ALSACtlElemId *elem_id, g_return_if_fail(ALSACTL_IS_ELEM_INFO(elem_info)); priv = alsactl_card_get_instance_private(self); + g_return_if_fail(error == NULL || *error == NULL); + add_or_replace_elems(priv->fd, elem_id, elem_count, elem_info, FALSE, entries, error); } @@ -770,6 +789,8 @@ void alsactl_card_replace_elems(ALSACtlCard *self, const ALSACtlElemId *elem_id, g_return_if_fail(ALSACTL_IS_ELEM_INFO(elem_info)); priv = alsactl_card_get_instance_private(self); + g_return_if_fail(error == NULL || *error == NULL); + add_or_replace_elems(priv->fd, elem_id, elem_count, elem_info, TRUE, entries, error); } @@ -794,6 +815,8 @@ void alsactl_card_remove_elems(ALSACtlCard *self, const ALSACtlElemId *elem_id, g_return_if_fail(elem_id != NULL); priv = alsactl_card_get_instance_private(self); + g_return_if_fail(error == NULL || *error == NULL); + if (ioctl(priv->fd, SNDRV_CTL_IOCTL_ELEM_REMOVE, elem_id) < 0) generate_error(error, errno); } @@ -822,6 +845,8 @@ void alsactl_card_write_elem_value(ALSACtlCard *self, g_return_if_fail(elem_id != NULL); g_return_if_fail(ALSACTL_IS_ELEM_VALUE(elem_value)); + g_return_if_fail(error == NULL || *error == NULL); + ctl_elem_value_refer_private((ALSACtlElemValue *)elem_value, &value); value->id = *elem_id; @@ -854,6 +879,8 @@ void alsactl_card_read_elem_value(ALSACtlCard *self, g_return_if_fail(elem_id != NULL); g_return_if_fail(ALSACTL_IS_ELEM_VALUE(*elem_value)); + g_return_if_fail(error == NULL || *error == NULL); + ctl_elem_value_refer_private(*elem_value, &value); value->id = *elem_id; @@ -975,6 +1002,8 @@ void alsactl_card_create_source(ALSACtlCard *self, GSource **gsrc, g_return_if_fail(ALSACTL_IS_CARD(self)); priv = alsactl_card_get_instance_private(self); + g_return_if_fail(error == NULL || *error == NULL); + if (priv->fd < 0) { generate_error(error, ENXIO); return; diff --git a/src/ctl/elem-info.c b/src/ctl/elem-info.c index 4576443..60aee6d 100644 --- a/src/ctl/elem-info.c +++ b/src/ctl/elem-info.c @@ -164,6 +164,8 @@ static void alsactl_elem_info_init(ALSACtlElemInfo *self) */ ALSACtlElemInfo *alsactl_elem_info_new(ALSACtlElemType elem_type, GError **error) { + g_return_val_if_fail(error == NULL || *error == NULL, NULL); + switch (elem_type) { case ALSACTL_ELEM_TYPE_BOOLEAN: case ALSACTL_ELEM_TYPE_INTEGER: @@ -200,6 +202,8 @@ void alsactl_elem_info_get_int_data(ALSACtlElemInfo *self, g_return_if_fail(ALSACTL_IS_ELEM_INFO(self)); priv = alsactl_elem_info_get_instance_private(self); + g_return_if_fail(error == NULL || *error == NULL); + if (priv->info.type != SNDRV_CTL_ELEM_TYPE_INTEGER) { generate_error(error, ENXIO); return; @@ -232,6 +236,8 @@ void alsactl_elem_info_set_int_data(ALSACtlElemInfo *self, g_return_if_fail(ALSACTL_IS_ELEM_INFO(self)); priv = alsactl_elem_info_get_instance_private(self); + g_return_if_fail(error == NULL || *error == NULL); + if (priv->info.type != SNDRV_CTL_ELEM_TYPE_INTEGER) { generate_error(error, ENXIO); return; @@ -262,6 +268,8 @@ void alsactl_elem_info_get_int64_data(ALSACtlElemInfo *self, g_return_if_fail(ALSACTL_IS_ELEM_INFO(self)); priv = alsactl_elem_info_get_instance_private(self); + g_return_if_fail(error == NULL || *error == NULL); + if (priv->info.type != SNDRV_CTL_ELEM_TYPE_INTEGER64) { generate_error(error, ENXIO); return; @@ -294,6 +302,8 @@ void alsactl_elem_info_set_int64_data(ALSACtlElemInfo *self, g_return_if_fail(ALSACTL_IS_ELEM_INFO(self)); priv = alsactl_elem_info_get_instance_private(self); + g_return_if_fail(error == NULL || *error == NULL); + if (priv->info.type != SNDRV_CTL_ELEM_TYPE_INTEGER64) { generate_error(error, ENXIO); return; @@ -323,6 +333,8 @@ void alsactl_elem_info_get_enum_data(ALSACtlElemInfo *self, g_return_if_fail(ALSACTL_IS_ELEM_INFO(self)); priv = alsactl_elem_info_get_instance_private(self); + g_return_if_fail(error == NULL || *error == NULL); + if (priv->info.type != SNDRV_CTL_ELEM_TYPE_ENUMERATED) { generate_error(error, ENXIO); return; @@ -350,6 +362,8 @@ void alsactl_elem_info_set_enum_data(ALSACtlElemInfo *self, g_return_if_fail(ALSACTL_IS_ELEM_INFO(self)); priv = alsactl_elem_info_get_instance_private(self); + g_return_if_fail(error == NULL || *error == NULL); + if (priv->info.type != SNDRV_CTL_ELEM_TYPE_ENUMERATED) { generate_error(error, ENXIO); return; diff --git a/src/ctl/query.c b/src/ctl/query.c index 4bec20d..2d9db7c 100644 --- a/src/ctl/query.c +++ b/src/ctl/query.c @@ -127,6 +127,7 @@ void alsactl_get_card_id_list(guint **entries, gsize *entry_count, generate_error(error, EINVAL); return; } + g_return_if_fail(error == NULL || *error == NULL); prepare_udev_enum(&enumerator, error); if (enumerator == NULL) @@ -240,6 +241,7 @@ void alsactl_get_card_sysname(guint card_id, char **sysname, GError **error) char *name; g_return_if_fail(sysname != NULL); + g_return_if_fail(error == NULL || *error == NULL); allocate_sysname(&name, CARD_SYSNAME_TEMPLATE, card_id, error); if (*error != NULL) @@ -269,6 +271,7 @@ void alsactl_get_control_sysname(guint card_id, char **sysname, GError **error) char *name; g_return_if_fail(sysname != NULL); + g_return_if_fail(error == NULL || *error == NULL); allocate_sysname(&name, CONTROL_SYSNAME_TEMPLATE, card_id, error); if (*error != NULL) @@ -301,6 +304,7 @@ void alsactl_get_control_devnode(guint card_id, char **devnode, GError **error) const char *node; g_return_if_fail(devnode != NULL); + g_return_if_fail(error == NULL || *error == NULL); allocate_sysname(&sysname, CONTROL_SYSNAME_TEMPLATE, card_id, error); if (*error != NULL) -- 2.47.3