]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
sd-dhcp6-client: make state transition stricter
authorYu Watanabe <watanabe.yu+github@gmail.com>
Sun, 6 Feb 2022 16:24:01 +0000 (01:24 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Mon, 14 Feb 2022 05:45:14 +0000 (14:45 +0900)
src/libsystemd-network/sd-dhcp6-client.c

index 0ca1be86b6bdd0c0be0a9bb2bf35ab86a06cdea6..25091e1b604d812cf0c67593595e8cf0adac674c 100644 (file)
@@ -1328,7 +1328,26 @@ static int client_set_state(sd_dhcp6_client *client, DHCP6State state) {
         assert_return(client, -EINVAL);
         assert_return(client->event, -EINVAL);
         assert_return(client->ifindex > 0, -EINVAL);
-        assert_return(client->state != state, -EINVAL);
+
+        switch (state) {
+        case DHCP6_STATE_INFORMATION_REQUEST:
+        case DHCP6_STATE_SOLICITATION:
+                assert(client->state == DHCP6_STATE_STOPPED);
+                break;
+        case DHCP6_STATE_REQUEST:
+                assert(client->state == DHCP6_STATE_SOLICITATION);
+                break;
+        case DHCP6_STATE_RENEW:
+                assert(client->state == DHCP6_STATE_BOUND);
+                break;
+        case DHCP6_STATE_REBIND:
+                assert(IN_SET(client->state, DHCP6_STATE_BOUND, DHCP6_STATE_RENEW));
+                break;
+        case DHCP6_STATE_STOPPED:
+        case DHCP6_STATE_BOUND:
+        default:
+                assert_not_reached();
+        }
 
         (void) event_source_disable(client->timeout_resend_expire);
         (void) event_source_disable(client->timeout_resend);
@@ -1357,27 +1376,7 @@ static int client_set_state(sd_dhcp6_client *client, DHCP6State state) {
                         goto error;
         }
 
-        switch (state) {
-        case DHCP6_STATE_SOLICITATION:
-                client->state = DHCP6_STATE_SOLICITATION;
-
-                break;
-
-        case DHCP6_STATE_INFORMATION_REQUEST:
-        case DHCP6_STATE_REQUEST:
-        case DHCP6_STATE_RENEW:
-        case DHCP6_STATE_REBIND:
-
-                client->state = state;
-
-                break;
-
-        case DHCP6_STATE_STOPPED:
-        case DHCP6_STATE_BOUND:
-        default:
-                assert_not_reached();
-        }
-
+        client->state = state;
         client->transaction_id = random_u32() & htobe32(0x00ffffff);
         client->transaction_start = time_now;