From: Volker Lendecke Date: Mon, 7 May 2018 14:53:00 +0000 (+0200) Subject: lib: Hold at most 10 outstanding paged result cookies X-Git-Tag: samba-4.7.11~6 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=629466ec5662248ffeba1faf7b7e6c9dbf46512f;p=thirdparty%2Fsamba.git lib: Hold at most 10 outstanding paged result cookies Bug: https://bugzilla.samba.org/show_bug.cgi?id=13362 Signed-off-by: Volker Lendecke Reviewed-by: Jeremy Allison Autobuild-User(master): Jeremy Allison Autobuild-Date(master): Tue May 15 09:37:21 CEST 2018 on sn-devel-144 (cherry picked from commit 9fbd4672b06de5333a9c44fc126b8edac0b9d31a) Autobuild-User(v4-7-test): Karolin Seeger Autobuild-Date(v4-7-test): Fri Sep 28 13:55:34 CEST 2018 on sn-devel-144 --- diff --git a/lib/ldb/modules/paged_results.c b/lib/ldb/modules/paged_results.c index aafbcbf4483..ecb22271d28 100644 --- a/lib/ldb/modules/paged_results.c +++ b/lib/ldb/modules/paged_results.c @@ -36,6 +36,7 @@ #include "system/filesys.h" #include "system/time.h" #include "dlinklist.h" +#include #include "ldb_module.h" struct message_store { @@ -68,6 +69,7 @@ struct results_store { struct private_data { uint32_t next_free_id; + size_t num_stores; struct results_store *store; }; @@ -76,6 +78,10 @@ static int store_destructor(struct results_store *del) { struct private_data *priv = del->priv; DLIST_REMOVE(priv->store, del); + + assert(priv->num_stores > 0); + priv->num_stores -= 1; + return 0; } @@ -108,8 +114,21 @@ static struct results_store *new_store(struct private_data *priv) DLIST_ADD(priv->store, newr); + assert(priv->num_stores < SIZE_MAX); + priv->num_stores += 1; + talloc_set_destructor(newr, store_destructor); + if (priv->num_stores > 10) { + struct results_store *last; + /* + * 10 is the default for MaxResultSetsPerConn -- + * possibly need to parameterize it. + */ + last = DLIST_TAIL(priv->store); + TALLOC_FREE(last); + } + return newr; } @@ -366,6 +385,8 @@ static int paged_search(struct ldb_module *module, struct ldb_request *req) return LDB_ERR_UNWILLING_TO_PERFORM; } + DLIST_PROMOTE(private_data->store, current); + ac->store = current; /* check if it is an abandon */ @@ -397,6 +418,7 @@ static int paged_request_init(struct ldb_module *module) } data->next_free_id = 1; + data->num_stores = 0; data->store = NULL; ldb_module_set_private(module, data);