[SSSD] [PATCH] Do not access state after tevent_req_done() is called

Sumit Bose sbose at redhat.com
Fri Jul 1 12:01:20 UTC 2011


Hi,

after calling tevent_req_done() or tevent_req_error() that related
request and the corresponding state might be invalid and should not be
accessed. The attached patch fixed this for the sdap_async_sys_connect
request.

bye,
Sumit
-------------- next part --------------
From ff15a33c79d782735d2c31d1a872317ddf2f622f Mon Sep 17 00:00:00 2001
From: Sumit Bose <sbose at redhat.com>
Date: Fri, 1 Jul 2011 13:01:51 +0200
Subject: [PATCH] Do not access state after tevent_req_done() is called.

---
 src/util/sss_ldap.c |   26 ++++++++++++++++----------
 1 files changed, 16 insertions(+), 10 deletions(-)

diff --git a/src/util/sss_ldap.c b/src/util/sss_ldap.c
index 9f76870..4cbd0b1 100644
--- a/src/util/sss_ldap.c
+++ b/src/util/sss_ldap.c
@@ -123,6 +123,7 @@ static struct tevent_req *sdap_async_sys_connect_send(TALLOC_CTX *mem_ctx,
     struct sdap_async_sys_connect_state *state;
     long flags;
     int ret;
+    int fret;
 
     flags = fcntl(fd, F_GETFL, 0);
     if (flags == -1) {
@@ -150,7 +151,6 @@ static struct tevent_req *sdap_async_sys_connect_send(TALLOC_CTX *mem_ctx,
 
     ret = connect(fd, addr, addr_len);
     if (ret == EOK) {
-        tevent_req_done(req);
         goto done;
     }
 
@@ -175,14 +175,17 @@ static struct tevent_req *sdap_async_sys_connect_send(TALLOC_CTX *mem_ctx,
     }
 
 done:
-    if (ret != EOK) {
-        tevent_req_error(req, ret);
+    fret = fcntl(fd, F_SETFL, flags);
+    if (fret != EOK) {
+        DEBUG(1, ("fcntl F_SETFL failed.\n"));
     }
 
-    ret = fcntl(fd, F_SETFL, flags);
-    if (ret != EOK) {
-        DEBUG(1, ("fcntl F_SETFL failed.\n"));
+    if (ret == EOK) {
+        tevent_req_done(req);
+    } else {
+        tevent_req_error(req, ret);
     }
+
     tevent_req_post(req, ev);
     return req;
 }
@@ -195,6 +198,7 @@ static void sdap_async_sys_connect_done(struct tevent_context *ev,
     struct sdap_async_sys_connect_state *state = tevent_req_data(req,
                                           struct sdap_async_sys_connect_state);
     int ret = EOK;
+    int fret;
 
     /* I found the following comment in samba's lib/async_req/async_sock.c:
      * Stevens, Network Programming says that if there's a
@@ -220,16 +224,18 @@ static void sdap_async_sys_connect_done(struct tevent_context *ev,
 
 done:
     talloc_zfree(fde);
+
+    fret = fcntl(state->fd, F_SETFL, state->old_flags);
+    if (fret != EOK) {
+        DEBUG(1, ("fcntl F_SETFL failed.\n"));
+    }
+
     if (ret == EOK) {
         tevent_req_done(req);
     } else {
         tevent_req_error(req, ret);
     }
 
-    ret = fcntl(state->fd, F_SETFL, state->old_flags);
-    if (ret != EOK) {
-        DEBUG(1, ("fcntl F_SETFL failed.\n"));
-    }
     return;
 }
 
-- 
1.7.5.4



More information about the sssd-devel mailing list