From: Ben Pfaff Date: Fri, 11 Jan 2013 01:16:01 +0000 (-0800) Subject: worker: Make worker_request_iovec() verify that it is not being reentered. X-Git-Tag: sliver-openvswitch-1.9.90-3~10^2~10 X-Git-Url: http://git.onelab.eu/?p=sliver-openvswitch.git;a=commitdiff_plain;h=0857cc59286606da5883291118482e8f5a4c19ed worker: Make worker_request_iovec() verify that it is not being reentered. This function cannot easily be reentrant because the inner call would interrupt and corrupt the data being sent by the outer call. Signed-off-by: Ben Pfaff Acked-by: Kyle Mestery --- diff --git a/lib/worker.c b/lib/worker.c index b281d70b7..eceac3d9e 100644 --- a/lib/worker.c +++ b/lib/worker.c @@ -237,11 +237,14 @@ worker_request_iovec(const struct iovec iovs[], size_t n_iovs, worker_request_func *request_cb, worker_reply_func *reply_cb, void *aux) { + static bool recursing = false; struct worker_request rq; struct iovec *all_iovs; int error; assert(worker_is_running()); + assert(!recursing); + recursing = true; rq.request_len = iovec_len(iovs, n_iovs); rq.request_cb = request_cb; @@ -255,6 +258,8 @@ worker_request_iovec(const struct iovec iovs[], size_t n_iovs, VLOG_ABORT("send failed (%s)", strerror(error)); } free(all_iovs); + + recursing = false; } /* Closes the client socket, if any, so that worker_is_running() will return