From: Yu Watanabe Date: Thu, 11 Jan 2024 07:53:42 +0000 (+0900) Subject: sd-dhcp-client-id/duid: do not trigger assertion when invalid size is passed X-Git-Tag: v256-rc1~1194^2~2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=cf9b4257491e2706399089ea5e31db732d083d55;p=thirdparty%2Fsystemd.git sd-dhcp-client-id/duid: do not trigger assertion when invalid size is passed The data may be from user input or file. We usually use assertion for programming error. Hence, using assert is not a good choise there. Preparation for later commits. --- diff --git a/src/libsystemd-network/sd-dhcp-client-id.c b/src/libsystemd-network/sd-dhcp-client-id.c index da5fcaa450b..5752a44e8a6 100644 --- a/src/libsystemd-network/sd-dhcp-client-id.c +++ b/src/libsystemd-network/sd-dhcp-client-id.c @@ -51,7 +51,9 @@ int sd_dhcp_client_id_set( assert_return(client_id, -EINVAL); assert_return(data, -EINVAL); - assert_return(client_id_data_size_is_valid(data_size), -EINVAL); + + if (!client_id_data_size_is_valid(data_size)) + return -EINVAL; client_id->id.type = type; memcpy(client_id->id.data, data, data_size); @@ -67,10 +69,12 @@ int sd_dhcp_client_id_set_raw( assert_return(client_id, -EINVAL); assert_return(data, -EINVAL); - assert_return(client_id_size_is_valid(data_size), -EINVAL); /* Unlike sd_dhcp_client_id_set(), this takes whole client ID including its type. */ + if (!client_id_size_is_valid(data_size)) + return -EINVAL; + memcpy(client_id->raw, data, data_size); client_id->size = data_size; @@ -150,7 +154,6 @@ int sd_dhcp_client_id_to_string_from_raw(const void *data, size_t data_size, cha int r; assert_return(data, -EINVAL); - assert_return(client_id_size_is_valid(data_size), -EINVAL); assert_return(ret, -EINVAL); r = sd_dhcp_client_id_set_raw(&client_id, data, data_size); diff --git a/src/libsystemd-network/sd-dhcp-duid.c b/src/libsystemd-network/sd-dhcp-duid.c index 297deb8a5d6..4782ec62d7a 100644 --- a/src/libsystemd-network/sd-dhcp-duid.c +++ b/src/libsystemd-network/sd-dhcp-duid.c @@ -71,7 +71,9 @@ int sd_dhcp_duid_set( assert_return(duid, -EINVAL); assert_return(data, -EINVAL); - assert_return(duid_data_size_is_valid(data_size), -EINVAL); + + if (!duid_data_size_is_valid(data_size)) + return -EINVAL; unaligned_write_be16(&duid->duid.type, duid_type); memcpy(duid->duid.data, data, data_size); @@ -87,10 +89,12 @@ int sd_dhcp_duid_set_raw( assert_return(duid, -EINVAL); assert_return(data, -EINVAL); - assert_return(duid_size_is_valid(data_size), -EINVAL); /* Unlike sd_dhcp_duid_set(), this takes whole DUID including its type. */ + if (!duid_size_is_valid(data_size)) + return -EINVAL; + memcpy(duid->raw, data, data_size); duid->size = data_size; @@ -209,9 +213,11 @@ int dhcp_duid_to_string_internal(uint16_t type, const void *data, size_t data_si const char *t; assert(data); - assert(duid_data_size_is_valid(data_size)); assert(ret); + if (!duid_data_size_is_valid(data_size)) + return -EINVAL; + x = hexmem(data, data_size); if (!x) return -ENOMEM;