From 175aa0623284f9ee247bd301a4bbb441013dcf9a Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Tue, 11 Oct 2022 15:13:46 +0200 Subject: [PATCH] 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. --- src/stick_table.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/stick_table.c b/src/stick_table.c index 6f5e6c899..95913b125 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; }