summaryrefslogtreecommitdiffstats
path: root/rpc/rpc-transport/socket/src/socket.c
diff options
context:
space:
mode:
authorXavier Hernandez <xhernandez@datalab.es>2016-05-09 12:50:39 +0200
committerRaghavendra G <rgowdapp@redhat.com>2016-05-11 04:02:12 -0700
commit3286e31509f20fa6e36d5b393a12eaf7ef3a226e (patch)
tree63a1435c915a8ba737aa743c6d6475be78793214 /rpc/rpc-transport/socket/src/socket.c
parentb2f09e531029f573772a09572cee0f8e1855481b (diff)
socket: Fix incorrect handling of partial reads
The usage of function local variables in the protocol state machine caused an incorrect behaviour when a partial read from the socket forced the function to return and restart later when more data was available. At this point the local variables contained incorrect data. Change-Id: I4db1f4ef5c46a3d2d7f7c5328e906188c3af49e6 BUG: 1334285 Signed-off-by: Xavier Hernandez <xhernandez@datalab.es> Reviewed-on: http://review.gluster.org/14270 Reviewed-by: Raghavendra G <rgowdapp@redhat.com> Smoke: Gluster Build System <jenkins@build.gluster.com> NetBSD-regression: NetBSD Build System <jenkins@build.gluster.org> Tested-by: Raghavendra G <rgowdapp@redhat.com> CentOS-regression: Gluster Build System <jenkins@build.gluster.com>
Diffstat (limited to 'rpc/rpc-transport/socket/src/socket.c')
-rw-r--r--rpc/rpc-transport/socket/src/socket.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/rpc/rpc-transport/socket/src/socket.c b/rpc/rpc-transport/socket/src/socket.c
index 8cdec00f642..209d89a225b 100644
--- a/rpc/rpc-transport/socket/src/socket.c
+++ b/rpc/rpc-transport/socket/src/socket.c
@@ -1644,7 +1644,6 @@ __socket_read_accepted_successful_reply (rpc_transport_t *this)
gfs3_read_rsp read_rsp = {0, };
ssize_t size = 0;
ssize_t default_read_size = 0;
- char *proghdr_buf = NULL;
XDR xdr;
struct gf_sock_incoming *in = NULL;
struct gf_sock_incoming_frag *frag = NULL;
@@ -1664,7 +1663,9 @@ __socket_read_accepted_successful_reply (rpc_transport_t *this)
default_read_size = xdr_sizeof ((xdrproc_t) xdr_gfs3_read_rsp,
&read_rsp);
- proghdr_buf = frag->fragcurrent;
+ /* We need to store the current base address because we will
+ * need it after a partial read. */
+ in->proghdr_base_addr = frag->fragcurrent;
__socket_proto_init_pending (priv, default_read_size);
@@ -1677,7 +1678,8 @@ __socket_read_accepted_successful_reply (rpc_transport_t *this)
__socket_proto_read (priv, ret);
/* there can be 'xdata' in read response, figure it out */
- xdrmem_create (&xdr, proghdr_buf, default_read_size,
+ default_read_size = frag->fragcurrent - in->proghdr_base_addr;
+ xdrmem_create (&xdr, in->proghdr_base_addr, default_read_size,
XDR_DECODE);
/* This will fail if there is xdata sent from server, if not,