]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
sd-dhcp-client-id/duid: do not trigger assertion when invalid size is passed
authorYu Watanabe <watanabe.yu+github@gmail.com>
Thu, 11 Jan 2024 07:53:42 +0000 (16:53 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Thu, 11 Jan 2024 08:03:25 +0000 (17:03 +0900)
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.

src/libsystemd-network/sd-dhcp-client-id.c
src/libsystemd-network/sd-dhcp-duid.c

index da5fcaa450b635c9ec7d6fb6b48e5a524955f4bb..5752a44e8a629e2e6d90b93c64e5d03cbbe68d17 100644 (file)
@@ -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);
index 297deb8a5d60e38a01715f8559587dd8b3403bbb..4782ec62d7af28d02f25041aaaa688fbd716ee41 100644 (file)
@@ -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;