You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by ac...@apache.org on 2018/02/26 23:05:46 UTC
qpid-proton git commit: PROTON-1773: [epoll-proactor] Invalid read in
pn_proactor_disconnect
Repository: qpid-proton
Updated Branches:
refs/heads/master 13fb06ed5 -> 9a2954a94
PROTON-1773: [epoll-proactor] Invalid read in pn_proactor_disconnect
The problem was a loop using a pointer to memory that could be deleted while the
loop was running.
Project: http://git-wip-us.apache.org/repos/asf/qpid-proton/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-proton/commit/9a2954a9
Tree: http://git-wip-us.apache.org/repos/asf/qpid-proton/tree/9a2954a9
Diff: http://git-wip-us.apache.org/repos/asf/qpid-proton/diff/9a2954a9
Branch: refs/heads/master
Commit: 9a2954a94aa795ceceabacb7a717dcb8f9bf15f3
Parents: 13fb06e
Author: Alan Conway <ac...@redhat.com>
Authored: Mon Feb 26 17:51:37 2018 -0500
Committer: Alan Conway <ac...@redhat.com>
Committed: Mon Feb 26 17:51:37 2018 -0500
----------------------------------------------------------------------
proton-c/bindings/cpp/src/container_test.cpp | 7 +++++++
proton-c/src/proactor/epoll.c | 5 ++++-
2 files changed, 11 insertions(+), 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/9a2954a9/proton-c/bindings/cpp/src/container_test.cpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/src/container_test.cpp b/proton-c/bindings/cpp/src/container_test.cpp
index 3afb340..8f9075f 100644
--- a/proton-c/bindings/cpp/src/container_test.cpp
+++ b/proton-c/bindings/cpp/src/container_test.cpp
@@ -302,6 +302,7 @@ class test_mt_handler : public proton::messaging_handler {
std::mutex lock_;
std::condition_variable cond_;
std::string str_;
+ proton::error_condition err_;
void set(const std::string& s) {
std::lock_guard<std::mutex> l(lock_);
@@ -317,8 +318,12 @@ class test_mt_handler : public proton::messaging_handler {
return s;
}
+ proton::error_condition error() const { return err_; }
void on_container_start(proton::container &) PN_CPP_OVERRIDE { set("start"); }
void on_connection_open(proton::connection &) PN_CPP_OVERRIDE { set("open"); }
+
+ // Catch errors and save.
+ void on_error(const proton::error_condition& e) PN_CPP_OVERRIDE { err_ = e; }
};
class container_runner {
@@ -339,6 +344,7 @@ int test_container_mt_stop_empty() {
ASSERT_EQUAL("start", th.wait());
c.stop();
t.join();
+ ASSERT_EQUAL("", th.error().name());
return 0;
}
@@ -354,6 +360,7 @@ int test_container_mt_stop() {
ASSERT_EQUAL("open", th.wait());
c.stop();
t.join();
+ // It is possible to get sporadic connection errors from this test depending on timing of stop()
return 0;
}
http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/9a2954a9/proton-c/src/proactor/epoll.c
----------------------------------------------------------------------
diff --git a/proton-c/src/proactor/epoll.c b/proton-c/src/proactor/epoll.c
index 4ad2506..efe2a82 100644
--- a/proton-c/src/proactor/epoll.c
+++ b/proton-c/src/proactor/epoll.c
@@ -2125,7 +2125,10 @@ void pn_proactor_disconnect(pn_proactor_t *p, pn_condition_t *cond) {
}
// Second pass: different locking, close the pcontexts, free them if !disconnect_ops
- for (ctx = disconnecting_pcontexts; ctx; ctx = ctx->next) {
+ pcontext_t *next = disconnecting_pcontexts;
+ while (next) {
+ ctx = next;
+ next = ctx->next; /* Save next pointer in case we free ctx */
bool do_free = false;
bool ctx_notify = true;
pmutex *ctx_mutex = NULL;
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org