]> git.openfabrics.org - ~shefty/librdmacm.git/commitdiff
ucmatose: Fix segfault on address error
authorSagi Grimberg <sagig@mellanox.com>
Wed, 4 Apr 2012 21:36:49 +0000 (14:36 -0700)
committerSean Hefty <sean.hefty@intel.com>
Wed, 4 Apr 2012 21:36:49 +0000 (14:36 -0700)
Client connect_events() shoudl fail if it received some error,
otherwise the program will try to reach a non-existent QP
resource resulting in a segfault.  Return an error from
cma_handler() if we had a connection error.

Signed-off-by: Sagi Grimberg <sagig@mellanox.com>
Signed-off-by: Sean Hefty <sean.hefty@intel.com>
examples/cmatose.c

index 9c3a75e8585d26fb0273e16c8d6c4a96bf552ec1..94fc4cd00d7900454ca1d9b9731260f6a72f46bf 100644 (file)
@@ -332,6 +332,7 @@ static int cma_handler(struct rdma_cm_id *cma_id, struct rdma_cm_event *event)
                printf("cmatose: event: %s, error: %d\n",
                       rdma_event_str(event->event), event->status);
                connect_error();
+               ret = event->status;
                break;
        case RDMA_CM_EVENT_DISCONNECTED:
                rdma_disconnect(cma_id);
@@ -433,12 +434,12 @@ static int poll_cqs(enum CQ_INDEX index)
 static int connect_events(void)
 {
        struct rdma_cm_event *event;
-       int err = 0, ret = 0;
+       int ret = 0;
 
-       while (test.connects_left && !err) {
-               err = rdma_get_cm_event(test.channel, &event);
-               if (!err) {
-                       cma_handler(event->id, event);
+       while (test.connects_left && !ret) {
+               ret = rdma_get_cm_event(test.channel, &event);
+               if (!ret) {
+                       ret = cma_handler(event->id, event);
                        rdma_ack_cm_event(event);
                } else {
                        perror("cmatose: failure in rdma_get_cm_event in connect events");
@@ -452,12 +453,12 @@ static int connect_events(void)
 static int disconnect_events(void)
 {
        struct rdma_cm_event *event;
-       int err = 0, ret = 0;
+       int ret = 0;
 
-       while (test.disconnects_left && !err) {
-               err = rdma_get_cm_event(test.channel, &event);
-               if (!err) {
-                       cma_handler(event->id, event);
+       while (test.disconnects_left && !ret) {
+               ret = rdma_get_cm_event(test.channel, &event);
+               if (!ret) {
+                       ret = cma_handler(event->id, event);
                        rdma_ack_cm_event(event);
                } else {
                        perror("cmatose: failure in rdma_get_cm_event in disconnect events");