]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
CLEANUP: peers: factor out the key len calculation in received updates
authorWilly Tarreau <w@1wt.eu>
Tue, 29 Nov 2022 16:43:10 +0000 (17:43 +0100)
committerWilly Tarreau <w@1wt.eu>
Tue, 29 Nov 2022 17:06:42 +0000 (18:06 +0100)
In peer_treat_updatemsg(), the lower layers of the stick-table code are
reimplemented, and the key length is never really known for an entry
being processed, it depends on the type being parsed and the moment
where it's done. This makes it quite difficult to stuff some shard
number calculation there.

This patch adds a keylen local variable that is always set to the length
of the current key depending on its type. It takes this opportunity for
reducing redudant expressions involving this length and always using the
new variable instead, limiting the risk of errors. Arguably that code
would have been way simpler by creating a dummy stktable_key and passing
it to stksess_new() as done anywhere else, but let's not change all that
a few days before the release.

src/peers.c

index fcfa05d71ac4771a065506e91f006458b4fdecc6..5245bb71558e131af7639c9a8f2d5073e5ab85af 100644 (file)
@@ -1710,6 +1710,7 @@ static int peer_treat_updatemsg(struct appctx *appctx, struct peer *p, int updt,
        uint32_t update;
        int expire;
        unsigned int data_type;
+       size_t keylen;
        void *data_ptr;
 
        TRACE_ENTER(PEERS_EV_UPDTMSG, NULL, p);
@@ -1771,8 +1772,9 @@ static int peer_treat_updatemsg(struct appctx *appctx, struct peer *p, int updt,
                        goto malformed_free_newts;
                }
 
-               memcpy(newts->key.key, *msg_cur, to_store);
-               newts->key.key[to_store] = 0;
+               keylen = to_store;
+               memcpy(newts->key.key, *msg_cur, keylen);
+               newts->key.key[keylen] = 0;
                *msg_cur += to_read;
        }
        else if (st->table->type == SMP_T_SINT) {
@@ -1786,10 +1788,11 @@ static int peer_treat_updatemsg(struct appctx *appctx, struct peer *p, int updt,
                        goto malformed_free_newts;
                }
 
-               memcpy(&netinteger, *msg_cur, sizeof(netinteger));
+               keylen = sizeof(netinteger);
+               memcpy(&netinteger, *msg_cur, keylen);
                netinteger = ntohl(netinteger);
-               memcpy(newts->key.key, &netinteger, sizeof(netinteger));
-               *msg_cur += sizeof(netinteger);
+               memcpy(newts->key.key, &netinteger, keylen);
+               *msg_cur += keylen;
        }
        else {
                if (*msg_cur + st->table->key_size > msg_end) {
@@ -1800,8 +1803,9 @@ static int peer_treat_updatemsg(struct appctx *appctx, struct peer *p, int updt,
                        goto malformed_free_newts;
                }
 
-               memcpy(newts->key.key, *msg_cur, st->table->key_size);
-               *msg_cur += st->table->key_size;
+               keylen = st->table->key_size;
+               memcpy(newts->key.key, *msg_cur, keylen);
+               *msg_cur += keylen;
        }
 
        /* lookup for existing entry */