On Sat, 2009-11-07 at 09:47 +0100, Martin Nagy wrote:
> Simo Sorce wrote:
> >      if (tevent_req_is_error(req, &tstate, &err)) {
> > -        return -1;
> > +        if (err) return err;
> > +        return EIO;
> >      }
> 
> Nack, err is not initialized here. I would recommend initializing it to
> EIO and replace return -1 with return err.

Right,
attached patch that fixes this.

Simo.

-- 
Simo Sorce * Red Hat, Inc * New York
>From 0962a6594d10939372e15e1bbc420eb60d7db430 Mon Sep 17 00:00:00 2001
From: Simo Sorce <[email protected]>
Date: Fri, 6 Nov 2009 18:20:26 -0500
Subject: [PATCH] Check return, zero free hostent, adhere to style

---
 server/providers/fail_over.c |   19 +++++++++++--------
 server/resolv/async_resolv.c |   15 +++++++++------
 server/resolv/async_resolv.h |    4 ++--
 server/tests/resolv-tests.c  |   10 ++++++----
 4 files changed, 28 insertions(+), 20 deletions(-)

diff --git a/server/providers/fail_over.c b/server/providers/fail_over.c
index ce94ac3..796fc90 100644
--- a/server/providers/fail_over.c
+++ b/server/providers/fail_over.c
@@ -456,16 +456,18 @@ fo_resolve_service_done(struct tevent_req *subreq)
     int resolv_status;
     struct resolve_service_request *request;
     struct server_common *common;
+    int ret;
 
     common = tevent_req_callback_data(subreq, struct server_common);
 
-    if (common->hostent != NULL)
-        talloc_free(common->hostent);
-    resolv_gethostbyname_recv(common, subreq, &resolv_status, NULL,
-                              &common->hostent);
-    talloc_free(subreq);
+    if (common->hostent != NULL) {
+        talloc_zfree(common->hostent);
+    }
 
-    if (common->hostent == NULL) {
+    ret = resolv_gethostbyname_recv(subreq, common,
+                                    &resolv_status, NULL, &common->hostent);
+    talloc_free(subreq);
+    if (ret != EOK) {
         DEBUG(1, ("Failed to resolve %s: %s\n", common->name,
               resolv_strerror(resolv_status)));
     }
@@ -473,10 +475,11 @@ fo_resolve_service_done(struct tevent_req *subreq)
     /* Take care of all requests for this server. */
     while ((request = common->request_list) != NULL) {
         DLIST_REMOVE(common->request_list, request);
-        if (resolv_status)
+        if (resolv_status) {
             tevent_req_error(request->req, resolv_status);
-        else
+        } else {
             tevent_req_done(request->req);
+        }
     }
 }
 
diff --git a/server/resolv/async_resolv.c b/server/resolv/async_resolv.c
index f567a39..f6ed202 100644
--- a/server/resolv/async_resolv.c
+++ b/server/resolv/async_resolv.c
@@ -395,25 +395,28 @@ resolv_gethostbyname_done(void *arg, int status, int timeouts, struct hostent *h
 }
 
 int
-resolv_gethostbyname_recv(TALLOC_CTX *mem_ctx, struct tevent_req *req,
+resolv_gethostbyname_recv(struct tevent_req *req, TALLOC_CTX *mem_ctx,
                           int *status, int *timeouts,
                           struct hostent **hostent)
 {
     struct gethostbyname_state *state = tevent_req_data(req, struct gethostbyname_state);
     enum tevent_req_state tstate;
-    uint64_t err;
+    uint64_t err = EIO;
 
     /* Fill in even in case of error as status contains the
      * c-ares return code */
-    if (status)
+    if (status) {
         *status = state->status;
-    if (timeouts)
+    }
+    if (timeouts) {
         *timeouts = state->timeouts;
-    if (hostent)
+    }
+    if (hostent) {
         *hostent = talloc_steal(mem_ctx, state->hostent);
+    }
 
     if (tevent_req_is_error(req, &tstate, &err)) {
-        return -1;
+        return err;
     }
 
     return EOK;
diff --git a/server/resolv/async_resolv.h b/server/resolv/async_resolv.h
index fcea6b8..702d4dd 100644
--- a/server/resolv/async_resolv.h
+++ b/server/resolv/async_resolv.h
@@ -61,8 +61,8 @@ struct tevent_req *resolv_gethostbyname_send(TALLOC_CTX *mem_ctx,
                                             const char *name,
                                             int family);
 
-int resolv_gethostbyname_recv(TALLOC_CTX *mem_ctx,
-                              struct tevent_req *req,
+int resolv_gethostbyname_recv(struct tevent_req *req,
+                              TALLOC_CTX *mem_ctx,
                               int *status,
                               int *timeouts,
                               struct hostent **hostent);
diff --git a/server/tests/resolv-tests.c b/server/tests/resolv-tests.c
index 71a4931..ea1ac9f 100644
--- a/server/tests/resolv-tests.c
+++ b/server/tests/resolv-tests.c
@@ -141,7 +141,8 @@ static void test_localhost(struct tevent_req *req)
 
     test_ctx->done = true;
 
-    recv_status = resolv_gethostbyname_recv(test_ctx, req, &status, NULL, &hostent);
+    recv_status = resolv_gethostbyname_recv(req, test_ctx,
+                                            &status, NULL, &hostent);
     talloc_zfree(req);
     if (recv_status != EOK) {
         DEBUG(2, ("resolv_gethostbyname_recv failed: %d\n", recv_status));
@@ -205,7 +206,8 @@ static void test_negative(struct tevent_req *req)
      test_ctx = tevent_req_callback_data(req, struct resolv_test_ctx);
      test_ctx->done = true;
 
-     recv_status = resolv_gethostbyname_recv(test_ctx, req, &status, NULL, &hostent);
+     recv_status = resolv_gethostbyname_recv(req, test_ctx,
+                                             &status, NULL, &hostent);
      talloc_zfree(req);
      if (recv_status == EOK) {
          DEBUG(7, ("resolv_gethostbyname_recv succeeded in a negative test"));
@@ -270,8 +272,8 @@ static void test_internet(struct tevent_req *req)
 
     switch (test_ctx->tested_function) {
     case TESTING_HOSTNAME:
-        recv_status = resolv_gethostbyname_recv(tmp_ctx, req, &status, NULL,
-                                                &hostent);
+        recv_status = resolv_gethostbyname_recv(req, tmp_ctx,
+                                                &status, NULL, &hostent);
         test_ctx->error = (hostent->h_length == 0) ? ENOENT : EOK;
         break;
     case TESTING_TXT:
-- 
1.6.2.5

_______________________________________________
sssd-devel mailing list
[email protected]
https://fedorahosted.org/mailman/listinfo/sssd-devel

Reply via email to