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