From: Willy Tarreau Date: Tue, 11 Oct 2022 13:13:46 +0000 (+0200) Subject: MEDIUM: stick-table: free newly allocated stkess if it couldn't be inserted X-Git-Tag: v2.7-dev8~43 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=175aa0623284f9ee247bd301a4bbb441013dcf9a;p=thirdparty%2Fhaproxy.git MEDIUM: stick-table: free newly allocated stkess if it couldn't be inserted In __stktable_get_entry() now we're planning for the possibility that the call to __stktable_store() doesn't add the newly allocated entry and instead finds a previously inserted one. At the moment this doesn't exist because the lookup + insert passes are made under the same lock. But it will soon change. --- diff --git a/src/stick_table.c b/src/stick_table.c index 6f5e6c8999..95913b1256 100644 --- a/src/stick_table.c +++ b/src/stick_table.c @@ -523,7 +523,7 @@ struct stksess *__stktable_store(struct stktable *t, struct stksess *ts) */ struct stksess *__stktable_get_entry(struct stktable *table, struct stktable_key *key) { - struct stksess *ts; + struct stksess *ts, *ts2; if (!key) return NULL; @@ -534,7 +534,14 @@ struct stksess *__stktable_get_entry(struct stktable *table, struct stktable_key ts = __stksess_new(table, key); if (!ts) return NULL; - __stktable_store(table, ts); + ts2 = __stktable_store(table, ts); + if (unlikely(ts2 != ts)) { + /* another entry was added in the mean time, let's + * switch to it. + */ + __stksess_free(table, ts); + ts = ts2; + } } return ts; }