[SSSD] [PATCH] Fixes for client communication

Sumit Bose sbose at redhat.com
Wed Mar 17 12:16:24 UTC 2010


Hi,

this patch fixes some issues in the client communication code of the
responders.

The man pages of send() and recv() tell to following:

EAGAIN or EWOULDBLOCK
The socket is marked non-blocking and the requested operation would
block. POSIX.1-2001 allows either error to be returned for this case,
and does not require these constants to have the same value, so a
portable application should check for both possibilities.

So I added a check for EWOULDBLOCK after the calls to send() and recv()
and return EAGAIN to the caller.

The other issues are mentioned in the commit message.

bye,
Sumit
-------------- next part --------------
From b3a32bc1e9d4b5e572e29504f749ba78f0e10c8a Mon Sep 17 00:00:00 2001
From: Sumit Bose <sbose at redhat.com>
Date: Wed, 17 Mar 2010 12:52:54 +0100
Subject: [PATCH] Fixes for client communication

- catch all errors of send() and recv(), not only EAGAIN
- check if send() or recv() return EWOULDBLOCK
- remove unused parameter from client_send() and client_recv()
- fix a debugging message
---
 src/responder/common/responder_common.c |   10 +++++-----
 src/responder/common/responder_packet.c |   16 ++++++++++++----
 2 files changed, 17 insertions(+), 9 deletions(-)

diff --git a/src/responder/common/responder_common.c b/src/responder/common/responder_common.c
index f524afb..48ec4bd 100644
--- a/src/responder/common/responder_common.c
+++ b/src/responder/common/responder_common.c
@@ -61,7 +61,7 @@ static int client_destructor(struct cli_ctx *ctx)
     return 0;
 }
 
-static void client_send(struct tevent_context *ev, struct cli_ctx *cctx)
+static void client_send(struct cli_ctx *cctx)
 {
     int ret;
 
@@ -71,7 +71,7 @@ static void client_send(struct tevent_context *ev, struct cli_ctx *cctx)
         return;
     }
     if (ret != EOK) {
-        DEBUG(0, ("Failed to read request, aborting client!\n"));
+        DEBUG(0, ("Failed to send data, aborting client!\n"));
         talloc_free(cctx);
         return;
     }
@@ -84,7 +84,7 @@ static void client_send(struct tevent_context *ev, struct cli_ctx *cctx)
     return;
 }
 
-static void client_recv(struct tevent_context *ev, struct cli_ctx *cctx)
+static void client_recv(struct cli_ctx *cctx)
 {
     int ret;
 
@@ -151,11 +151,11 @@ static void client_fd_handler(struct tevent_context *ev,
     struct cli_ctx *cctx = talloc_get_type(ptr, struct cli_ctx);
 
     if (flags & TEVENT_FD_READ) {
-        client_recv(ev, cctx);
+        client_recv(cctx);
         return;
     }
     if (flags & TEVENT_FD_WRITE) {
-        client_send(ev, cctx);
+        client_send(cctx);
         return;
     }
 }
diff --git a/src/responder/common/responder_packet.c b/src/responder/common/responder_packet.c
index 6e581a3..4692002 100644
--- a/src/responder/common/responder_packet.c
+++ b/src/responder/common/responder_packet.c
@@ -183,8 +183,12 @@ int sss_packet_recv(struct sss_packet *packet, int fd)
     errno = 0;
     rb = recv(fd, buf, len, 0);
 
-    if (rb == -1 && errno == EAGAIN) {
-        return EAGAIN;
+    if (rb == -1) {
+        if (errno == EAGAIN || errno == EWOULDBLOCK) {
+            return EAGAIN;
+        } else {
+            return errno;
+        }
     }
 
     if (rb == 0) {
@@ -219,8 +223,12 @@ int sss_packet_send(struct sss_packet *packet, int fd)
     errno = 0;
     rb = send(fd, buf, len, 0);
 
-    if (rb == -1 && errno == EAGAIN) {
-        return EAGAIN;
+    if (rb == -1) {
+        if (errno == EAGAIN || errno == EWOULDBLOCK) {
+            return EAGAIN;
+        } else {
+            return errno;
+        }
     }
 
     if (rb == 0) {
-- 
1.6.6.1



More information about the sssd-devel mailing list