diff options
author | J. Bruce Fields <bfields@redhat.com> | 2012-12-03 16:30:42 -0500 |
---|---|---|
committer | J. Bruce Fields <bfields@redhat.com> | 2012-12-04 07:47:58 -0500 |
commit | ad46ccf09440975618e8fc1ead53d0a27b9bcf4c (patch) | |
tree | 8f37c936d4753dc815fdc6d47f0ee240621b9736 /net | |
parent | cc248d4b1ddf05fefc1373d9d7a4dd1df71b6190 (diff) |
svcrpc: delay minimum-rpc-size check till later
Soon we want to support multiple fragments, in which case it may be
legal for a single fragment to be smaller than 8 bytes, so we'll want to
delay this check till we've reached the last fragment.
Also fix an outdated comment.
Signed-off-by: J. Bruce Fields <bfields@redhat.com>
Diffstat (limited to 'net')
-rw-r--r-- | net/sunrpc/svcsock.c | 16 |
1 files changed, 7 insertions, 9 deletions
diff --git a/net/sunrpc/svcsock.c b/net/sunrpc/svcsock.c index d50de2b95036..15571790dc9e 100644 --- a/net/sunrpc/svcsock.c +++ b/net/sunrpc/svcsock.c | |||
@@ -921,10 +921,8 @@ out: | |||
921 | } | 921 | } |
922 | 922 | ||
923 | /* | 923 | /* |
924 | * Receive data. | 924 | * Receive fragment record header. |
925 | * If we haven't gotten the record length yet, get the next four bytes. | 925 | * If we haven't gotten the record length yet, get the next four bytes. |
926 | * Otherwise try to gobble up as much as possible up to the complete | ||
927 | * record length. | ||
928 | */ | 926 | */ |
929 | static int svc_tcp_recv_record(struct svc_sock *svsk, struct svc_rqst *rqstp) | 927 | static int svc_tcp_recv_record(struct svc_sock *svsk, struct svc_rqst *rqstp) |
930 | { | 928 | { |
@@ -968,9 +966,6 @@ static int svc_tcp_recv_record(struct svc_sock *svsk, struct svc_rqst *rqstp) | |||
968 | } | 966 | } |
969 | } | 967 | } |
970 | 968 | ||
971 | if (svc_sock_reclen(svsk) < 8) | ||
972 | goto err_delete; /* client is nuts. */ | ||
973 | |||
974 | return svc_sock_reclen(svsk); | 969 | return svc_sock_reclen(svsk); |
975 | error: | 970 | error: |
976 | dprintk("RPC: TCP recv_record got %d\n", len); | 971 | dprintk("RPC: TCP recv_record got %d\n", len); |
@@ -1076,12 +1071,15 @@ static int svc_tcp_recvfrom(struct svc_rqst *rqstp) | |||
1076 | if (len != want) { | 1071 | if (len != want) { |
1077 | svc_tcp_save_pages(svsk, rqstp); | 1072 | svc_tcp_save_pages(svsk, rqstp); |
1078 | if (len < 0 && len != -EAGAIN) | 1073 | if (len < 0 && len != -EAGAIN) |
1079 | goto err_other; | 1074 | goto err_delete; |
1080 | dprintk("svc: incomplete TCP record (%d of %d)\n", | 1075 | dprintk("svc: incomplete TCP record (%d of %d)\n", |
1081 | svsk->sk_tcplen, svc_sock_reclen(svsk)); | 1076 | svsk->sk_tcplen, svc_sock_reclen(svsk)); |
1082 | goto err_noclose; | 1077 | goto err_noclose; |
1083 | } | 1078 | } |
1084 | 1079 | ||
1080 | if (svc_sock_reclen(svsk) < 8) | ||
1081 | goto err_delete; /* client is nuts. */ | ||
1082 | |||
1085 | rqstp->rq_arg.len = svc_sock_reclen(svsk); | 1083 | rqstp->rq_arg.len = svc_sock_reclen(svsk); |
1086 | rqstp->rq_arg.page_base = 0; | 1084 | rqstp->rq_arg.page_base = 0; |
1087 | if (rqstp->rq_arg.len <= rqstp->rq_arg.head[0].iov_len) { | 1085 | if (rqstp->rq_arg.len <= rqstp->rq_arg.head[0].iov_len) { |
@@ -1117,10 +1115,10 @@ static int svc_tcp_recvfrom(struct svc_rqst *rqstp) | |||
1117 | 1115 | ||
1118 | error: | 1116 | error: |
1119 | if (len != -EAGAIN) | 1117 | if (len != -EAGAIN) |
1120 | goto err_other; | 1118 | goto err_delete; |
1121 | dprintk("RPC: TCP recvfrom got EAGAIN\n"); | 1119 | dprintk("RPC: TCP recvfrom got EAGAIN\n"); |
1122 | return 0; | 1120 | return 0; |
1123 | err_other: | 1121 | err_delete: |
1124 | printk(KERN_NOTICE "%s: recvfrom returned errno %d\n", | 1122 | printk(KERN_NOTICE "%s: recvfrom returned errno %d\n", |
1125 | svsk->sk_xprt.xpt_server->sv_name, -len); | 1123 | svsk->sk_xprt.xpt_server->sv_name, -len); |
1126 | set_bit(XPT_CLOSE, &svsk->sk_xprt.xpt_flags); | 1124 | set_bit(XPT_CLOSE, &svsk->sk_xprt.xpt_flags); |