From: Willy Tarreau Date: Tue, 29 Nov 2022 16:43:10 +0000 (+0100) Subject: CLEANUP: peers: factor out the key len calculation in received updates X-Git-Tag: v2.7.0~10 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b12be7c1bb7703830b3dff221f770d7c4df3c5a9;p=thirdparty%2Fhaproxy.git CLEANUP: peers: factor out the key len calculation in received updates 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. --- diff --git a/src/peers.c b/src/peers.c index fcfa05d71a..5245bb7155 100644 --- a/src/peers.c +++ b/src/peers.c @@ -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 */