From: Julien Grall Date: Thu, 24 Jun 2021 08:07:30 +0000 (+0100) Subject: tools/xenstored: Limit the number of requests a connection can delay X-Git-Tag: archive/raspbian/4.16.0+51-g0941d6cb-1+rpi1~2^2~42^2~411 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=2aa9e00bd3d0431fc99d4baaee2cddbf40bbee61;p=xen.git tools/xenstored: Limit the number of requests a connection can delay Currently, only liveupdate request can be delayed. The request can only be performed by a privileged connection (e.g. dom0). So it is fine to have no limits. In a follow-up patch we will want to delay request for unprivileged connection as well. So it is best to apply a limit. For now and for simplicity, only a single request can be delayed for a given unprivileged connection. Take the opportunity to tweak the prototype and provide a way to bypass the quota check. This would be useful when the function is called from the restore code. Signed-off-by: Julien Grall Reviewed-by: Luca Fancellu Reviewed-by: Juergen Gross --- diff --git a/tools/xenstore/xenstored_control.c b/tools/xenstore/xenstored_control.c index 7acc2d134f..1c24d4869e 100644 --- a/tools/xenstore/xenstored_control.c +++ b/tools/xenstore/xenstored_control.c @@ -737,7 +737,7 @@ static const char *lu_start(const void *ctx, struct connection *conn, lu_status->timeout = to; lu_status->started_at = time(NULL); - errno = delay_request(conn, conn->in, do_lu_start, NULL); + errno = delay_request(conn, conn->in, do_lu_start, NULL, false); return NULL; } diff --git a/tools/xenstore/xenstored_core.c b/tools/xenstore/xenstored_core.c index 4b6509b90d..268b0187e6 100644 --- a/tools/xenstore/xenstored_core.c +++ b/tools/xenstore/xenstored_core.c @@ -279,10 +279,19 @@ static void call_delayed(struct delayed_request *req) } int delay_request(struct connection *conn, struct buffered_data *in, - bool (*func)(struct delayed_request *), void *data) + bool (*func)(struct delayed_request *), void *data, + bool no_quota_check) { struct delayed_request *req; + /* + * Only allow one request can be delayed for an unprivileged + * connection. + */ + if (!no_quota_check && domain_is_unprivileged(conn) && + !list_empty(&conn->delayed)) + return ENOSPC; + req = talloc(in, struct delayed_request); if (!req) return ENOMEM; diff --git a/tools/xenstore/xenstored_core.h b/tools/xenstore/xenstored_core.h index 89ce155e75..34839b34f6 100644 --- a/tools/xenstore/xenstored_core.h +++ b/tools/xenstore/xenstored_core.h @@ -213,7 +213,8 @@ char *get_parent(const void *ctx, const char *node); /* Delay a request. */ int delay_request(struct connection *conn, struct buffered_data *in, - bool (*func)(struct delayed_request *), void *data); + bool (*func)(struct delayed_request *), void *data, + bool no_quota_check); /* Tracing infrastructure. */ void trace_create(const void *data, const char *type);