diff options
Diffstat (limited to 'net/rds/send.c')
-rw-r--r-- | net/rds/send.c | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/net/rds/send.c b/net/rds/send.c index 38567f3ee7e8..69ab1040d02d 100644 --- a/net/rds/send.c +++ b/net/rds/send.c | |||
@@ -846,6 +846,7 @@ static int rds_rm_size(struct msghdr *msg, int data_len) | |||
846 | { | 846 | { |
847 | struct cmsghdr *cmsg; | 847 | struct cmsghdr *cmsg; |
848 | int size = 0; | 848 | int size = 0; |
849 | int cmsg_groups = 0; | ||
849 | int retval; | 850 | int retval; |
850 | 851 | ||
851 | for (cmsg = CMSG_FIRSTHDR(msg); cmsg; cmsg = CMSG_NXTHDR(msg, cmsg)) { | 852 | for (cmsg = CMSG_FIRSTHDR(msg); cmsg; cmsg = CMSG_NXTHDR(msg, cmsg)) { |
@@ -857,19 +858,23 @@ static int rds_rm_size(struct msghdr *msg, int data_len) | |||
857 | 858 | ||
858 | switch (cmsg->cmsg_type) { | 859 | switch (cmsg->cmsg_type) { |
859 | case RDS_CMSG_RDMA_ARGS: | 860 | case RDS_CMSG_RDMA_ARGS: |
861 | cmsg_groups |= 1; | ||
860 | retval = rds_rdma_extra_size(CMSG_DATA(cmsg)); | 862 | retval = rds_rdma_extra_size(CMSG_DATA(cmsg)); |
861 | if (retval < 0) | 863 | if (retval < 0) |
862 | return retval; | 864 | return retval; |
863 | size += retval; | 865 | size += retval; |
866 | |||
864 | break; | 867 | break; |
865 | 868 | ||
866 | case RDS_CMSG_RDMA_DEST: | 869 | case RDS_CMSG_RDMA_DEST: |
867 | case RDS_CMSG_RDMA_MAP: | 870 | case RDS_CMSG_RDMA_MAP: |
871 | cmsg_groups |= 2; | ||
868 | /* these are valid but do no add any size */ | 872 | /* these are valid but do no add any size */ |
869 | break; | 873 | break; |
870 | 874 | ||
871 | case RDS_CMSG_ATOMIC_CSWP: | 875 | case RDS_CMSG_ATOMIC_CSWP: |
872 | case RDS_CMSG_ATOMIC_FADD: | 876 | case RDS_CMSG_ATOMIC_FADD: |
877 | cmsg_groups |= 1; | ||
873 | size += sizeof(struct scatterlist); | 878 | size += sizeof(struct scatterlist); |
874 | break; | 879 | break; |
875 | 880 | ||
@@ -881,6 +886,10 @@ static int rds_rm_size(struct msghdr *msg, int data_len) | |||
881 | 886 | ||
882 | size += ceil(data_len, PAGE_SIZE) * sizeof(struct scatterlist); | 887 | size += ceil(data_len, PAGE_SIZE) * sizeof(struct scatterlist); |
883 | 888 | ||
889 | /* Ensure (DEST, MAP) are never used with (ARGS, ATOMIC) */ | ||
890 | if (cmsg_groups == 3) | ||
891 | return -EINVAL; | ||
892 | |||
884 | return size; | 893 | return size; |
885 | } | 894 | } |
886 | 895 | ||