21ab4e
From e751460fca51649d26117e42e04ffb67e7495810 Mon Sep 17 00:00:00 2001
3604df
From: Atin Mukherjee <amukherj@redhat.com>
3604df
Date: Sat, 18 Mar 2017 16:29:10 +0530
21ab4e
Subject: [PATCH 353/361] rpc: bump up conn->cleanup_gen in
3604df
 rpc_clnt_reconnect_cleanup
3604df
3604df
Commit 086436a introduced generation number (cleanup_gen) to ensure that
3604df
rpc layer doesn't end up cleaning up the connection object if
3604df
application layer has already destroyed it. Bumping up cleanup_gen was
3604df
done only in rpc_clnt_connection_cleanup (). However the same is needed
3604df
in rpc_clnt_reconnect_cleanup () too as with out it if the object gets destroyed
3604df
through the reconnect event in the application layer, rpc layer will
3604df
still end up in trying to delete the object resulting into double free
3604df
and crash.
3604df
3604df
Peer probing an invalid host/IP was the basic test to catch this issue.
3604df
3604df
>Reviewed-on: https://review.gluster.org/16914
3604df
>Smoke: Gluster Build System <jenkins@build.gluster.org>
3604df
>NetBSD-regression: NetBSD Build System <jenkins@build.gluster.org>
3604df
>Reviewed-by: Milind Changire <mchangir@redhat.com>
3604df
>CentOS-regression: Gluster Build System <jenkins@build.gluster.org>
3604df
>Reviewed-by: Jeff Darcy <jeff@pl.atyp.us>
3604df
3604df
Change-Id: Id5332f3239cb324cead34eb51cf73d426733bd46
21ab4e
BUG: 1433276
3604df
Signed-off-by: Atin Mukherjee <amukherj@redhat.com>
21ab4e
Reviewed-on: https://code.engineering.redhat.com/gerrit/101366
3604df
---
3604df
 rpc/rpc-lib/src/rpc-clnt.c                                 |  4 +++-
3604df
 .../glusterd/bug-1433578-invalid-peer-glusterd-crash.t     | 14 ++++++++++++++
3604df
 2 files changed, 17 insertions(+), 1 deletion(-)
3604df
 create mode 100644 tests/bugs/glusterd/bug-1433578-invalid-peer-glusterd-crash.t
3604df
3604df
diff --git a/rpc/rpc-lib/src/rpc-clnt.c b/rpc/rpc-lib/src/rpc-clnt.c
3604df
index 7bd4495..02045e1 100644
3604df
--- a/rpc/rpc-lib/src/rpc-clnt.c
3604df
+++ b/rpc/rpc-lib/src/rpc-clnt.c
3604df
@@ -495,8 +495,10 @@ rpc_clnt_reconnect_cleanup (rpc_clnt_connection_t *conn)
3604df
 
3604df
                 if (conn->reconnect) {
3604df
                         ret = gf_timer_call_cancel (clnt->ctx, conn->reconnect);
3604df
-                        if (!ret)
3604df
+                        if (!ret) {
3604df
                                 reconnect_unref = _gf_true;
3604df
+                                conn->cleanup_gen++;
3604df
+                        }
3604df
                         conn->reconnect = NULL;
3604df
                 }
3604df
 
3604df
diff --git a/tests/bugs/glusterd/bug-1433578-invalid-peer-glusterd-crash.t b/tests/bugs/glusterd/bug-1433578-invalid-peer-glusterd-crash.t
3604df
new file mode 100644
3604df
index 0000000..1aea8bc
3604df
--- /dev/null
3604df
+++ b/tests/bugs/glusterd/bug-1433578-invalid-peer-glusterd-crash.t
3604df
@@ -0,0 +1,14 @@
3604df
+#!/bin/bash
3604df
+
3604df
+. $(dirname $0)/../../include.rc
3604df
+
3604df
+cleanup;
3604df
+
3604df
+## Start glusterd
3604df
+TEST glusterd;
3604df
+TEST pidof glusterd;
3604df
+
3604df
+TEST ! $CLI peer probe invalid-peer
3604df
+
3604df
+TEST pidof glusterd;
3604df
+cleanup;
3604df
-- 
3604df
1.8.3.1
3604df