diff options
Diffstat (limited to 'net')
-rw-r--r-- | net/netrom/af_netrom.c | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/net/netrom/af_netrom.c b/net/netrom/af_netrom.c index cba7849de98e..6d9c58ec56ac 100644 --- a/net/netrom/af_netrom.c +++ b/net/netrom/af_netrom.c | |||
@@ -1037,6 +1037,10 @@ static int nr_sendmsg(struct kiocb *iocb, struct socket *sock, | |||
1037 | unsigned char *asmptr; | 1037 | unsigned char *asmptr; |
1038 | int size; | 1038 | int size; |
1039 | 1039 | ||
1040 | /* Netrom empty data frame has no meaning : don't send */ | ||
1041 | if (len == 0) | ||
1042 | return 0; | ||
1043 | |||
1040 | if (msg->msg_flags & ~(MSG_DONTWAIT|MSG_EOR|MSG_CMSG_COMPAT)) | 1044 | if (msg->msg_flags & ~(MSG_DONTWAIT|MSG_EOR|MSG_CMSG_COMPAT)) |
1041 | return -EINVAL; | 1045 | return -EINVAL; |
1042 | 1046 | ||
@@ -1167,6 +1171,11 @@ static int nr_recvmsg(struct kiocb *iocb, struct socket *sock, | |||
1167 | skb_reset_transport_header(skb); | 1171 | skb_reset_transport_header(skb); |
1168 | copied = skb->len; | 1172 | copied = skb->len; |
1169 | 1173 | ||
1174 | /* NetRom empty data frame has no meaning : ignore it */ | ||
1175 | if (copied == 0) { | ||
1176 | goto out; | ||
1177 | } | ||
1178 | |||
1170 | if (copied > size) { | 1179 | if (copied > size) { |
1171 | copied = size; | 1180 | copied = size; |
1172 | msg->msg_flags |= MSG_TRUNC; | 1181 | msg->msg_flags |= MSG_TRUNC; |
@@ -1182,7 +1191,7 @@ static int nr_recvmsg(struct kiocb *iocb, struct socket *sock, | |||
1182 | 1191 | ||
1183 | msg->msg_namelen = sizeof(*sax); | 1192 | msg->msg_namelen = sizeof(*sax); |
1184 | 1193 | ||
1185 | skb_free_datagram(sk, skb); | 1194 | out: skb_free_datagram(sk, skb); |
1186 | 1195 | ||
1187 | release_sock(sk); | 1196 | release_sock(sk); |
1188 | return copied; | 1197 | return copied; |