diff options
| -rw-r--r-- | rpc/rpc-lib/src/rpcsvc.h | 3 | ||||
| -rw-r--r-- | rpc/rpc-transport/socket/src/socket.c | 6 | ||||
| -rw-r--r-- | xlators/nfs/server/src/nfs3.c | 11 | ||||
| -rw-r--r-- | xlators/protocol/server/src/server3_1-fops.c | 5 | 
4 files changed, 15 insertions, 10 deletions
diff --git a/rpc/rpc-lib/src/rpcsvc.h b/rpc/rpc-lib/src/rpcsvc.h index 95f2c4e84..847ec1b33 100644 --- a/rpc/rpc-lib/src/rpcsvc.h +++ b/rpc/rpc-lib/src/rpcsvc.h @@ -278,7 +278,8 @@ struct rpcsvc_request {  typedef int (*rpcsvc_actor) (rpcsvc_request_t *req);  typedef int (*rpcsvc_vector_actor) (rpcsvc_request_t *req, struct iovec *vec,                                      int count, struct iobref *iobref); -typedef int (*rpcsvc_vector_sizer) (int state, ssize_t *readsize, char *addr); +typedef int (*rpcsvc_vector_sizer) (int state, ssize_t *readsize, +                                    char *base_addr, char *curr_addr);  /* Every protocol actor will also need to specify the function the RPC layer   * will use to serialize or encode the message into XDR format just before diff --git a/rpc/rpc-transport/socket/src/socket.c b/rpc/rpc-transport/socket/src/socket.c index 5e65755d8..2476b13f7 100644 --- a/rpc/rpc-transport/socket/src/socket.c +++ b/rpc/rpc-transport/socket/src/socket.c @@ -875,7 +875,8 @@ sp_state_read_verfbytes:                  proghdr_buf = priv->incoming.frag.fragcurrent;                  priv->incoming.frag.call_body.request.vector_sizer_state =                          vector_sizer (priv->incoming.frag.call_body.request.vector_sizer_state, -                                      &readsize, proghdr_buf); +                                      &readsize, proghdr_buf, +                                      priv->incoming.frag.fragcurrent);                  __socket_proto_init_pending (priv, readsize);                  priv->incoming.frag.call_body.request.vector_state                          = SP_STATE_READING_PROGHDR; @@ -887,7 +888,8 @@ sp_state_read_verfbytes:  sp_state_reading_proghdr:                  priv->incoming.frag.call_body.request.vector_sizer_state =                          vector_sizer (priv->incoming.frag.call_body.request.vector_sizer_state, -                                      &readsize, proghdr_buf); +                                      &readsize, proghdr_buf, +                                      priv->incoming.frag.fragcurrent);                  if (readsize == 0) {                          priv->incoming.frag.call_body.request.vector_state =                                  SP_STATE_READ_PROGHDR; diff --git a/xlators/nfs/server/src/nfs3.c b/xlators/nfs/server/src/nfs3.c index f950b9273..684123958 100644 --- a/xlators/nfs/server/src/nfs3.c +++ b/xlators/nfs/server/src/nfs3.c @@ -2238,17 +2238,18 @@ out:  int -nfs3svc_write_vecsizer (int state, ssize_t *readsize, char *addr) +nfs3svc_write_vecsizer (int state, ssize_t *readsize, char *base_addr, +                        char *curr_addr)  { -        int         ret = 0; -        uint32_t        fhlen = 0; -        uint32_t        fhlen_n = 0; +        int      ret     = 0; +        uint32_t fhlen   = 0; +        uint32_t fhlen_n = 0;          if (state == 0) {                  ret = NFS3_VECWRITE_READFHLEN;                  *readsize = 4;          } else if (state == NFS3_VECWRITE_READFHLEN) { -                fhlen_n = *(uint32_t *)(addr - 4); +                fhlen_n = *(uint32_t *)(curr_addr - 4);                  fhlen = ntohl (fhlen_n);                  *readsize = xdr_length_round_up (fhlen, NFS3_FHSIZE);                  ret = NFS3_VECWRITE_READFH; diff --git a/xlators/protocol/server/src/server3_1-fops.c b/xlators/protocol/server/src/server3_1-fops.c index 06283461d..166f72094 100644 --- a/xlators/protocol/server/src/server3_1-fops.c +++ b/xlators/protocol/server/src/server3_1-fops.c @@ -3431,7 +3431,8 @@ server_writev_vec (rpcsvc_request_t *req, struct iovec *payload,  #define SERVER3_1_VECWRITE_READING_OPAQUE 2  int -server_writev_vecsizer (int state, ssize_t *readsize, char *addr) +server_writev_vecsizer (int state, ssize_t *readsize, char *base_addr, +                        char *curr_addr)  {          ssize_t         size = 0;          int             nextstate = 0; @@ -3449,7 +3450,7 @@ server_writev_vecsizer (int state, ssize_t *readsize, char *addr)                  size = xdr_sizeof ((xdrproc_t) xdr_gfs3_write_req,                                             &write_req); -                xdrmem_create (&xdr, addr, size, XDR_DECODE); +                xdrmem_create (&xdr, base_addr, size, XDR_DECODE);                  /* This will fail if there is xdata sent from client, if not,                     well and good */  | 
