From e614da10257304ae45e61675ee89f47120e3c707 Mon Sep 17 00:00:00 2001 From: Sergey Dmitriev Date: Wed, 2 Nov 2022 03:00:01 +0700 Subject: [PATCH] Avoid reading random values for reader options from dangling reference (#300) This patch fixes a problem of reading random values for reader options in pycapnp. The code which adds task to the list captures 'opts' by reference and that causes a problem in case when 'opts' is allocated on on the caller's stack. By the time when task is handled the stack frame holding the 'opts' is gone which leaves dangling reference to 'opts' in lambda's captures. As a result pycapnp reads random values for reader options which sometimes causes unexpected errors (for example an error that nesting level ius negative). --- capnp/helpers/rpcHelper.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/capnp/helpers/rpcHelper.h b/capnp/helpers/rpcHelper.h index 192e16a..6d903e8 100644 --- a/capnp/helpers/rpcHelper.h +++ b/capnp/helpers/rpcHelper.h @@ -40,7 +40,7 @@ struct ServerContext { void acceptLoop(kj::TaskSet & tasks, capnp::Capability::Client client, kj::Own&& listener, capnp::ReaderOptions & opts) { auto ptr = listener.get(); tasks.add(ptr->accept().then(kj::mvCapture(kj::mv(listener), - [&, client](kj::Own&& listener, + [&, client, opts](kj::Own&& listener, kj::Own&& connection) mutable { acceptLoop(tasks, client, kj::mv(listener), opts); @@ -58,7 +58,7 @@ kj::Promise connectServer(kj::TaskSet & tasks, capnp::Capability::Cl tasks.add(context->provider->getNetwork().parseAddress(bindAddress) .then(kj::mvCapture(paf.fulfiller, - [&, client](kj::Own>&& portFulfiller, + [&, client, opts](kj::Own>&& portFulfiller, kj::Own&& addr) mutable { auto listener = addr->listen(); portFulfiller->fulfill(listener->getPort());