]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - net/sctp/socket.c
Merge branch 'upstream-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jgarzi...
[karo-tx-linux.git] / net / sctp / socket.c
index 9f5fe23773a9e3ac55b4b12812e02282a49977d1..ff0a8f88de04bd275f3b16b921ed88d846407ca4 100644 (file)
@@ -2717,7 +2717,7 @@ static int sctp_setsockopt_associnfo(struct sock *sk, char __user *optval, int o
                                paths++;
                        }
 
-                       /* Only validate asocmaxrxt if we have more then
+                       /* Only validate asocmaxrxt if we have more than
                         * one path/transport.  We do this because path
                         * retransmissions are only counted when we have more
                         * then one path.
@@ -3010,14 +3010,21 @@ static int sctp_setsockopt_fragment_interleave(struct sock *sk,
 }
 
 /*
- * 7.1.25.  Set or Get the sctp partial delivery point
+ * 8.1.21.  Set or Get the SCTP Partial Delivery Point
  *       (SCTP_PARTIAL_DELIVERY_POINT)
+ *
  * This option will set or get the SCTP partial delivery point.  This
  * point is the size of a message where the partial delivery API will be
  * invoked to help free up rwnd space for the peer.  Setting this to a
- * lower value will cause partial delivery's to happen more often.  The
+ * lower value will cause partial deliveries to happen more often.  The
  * calls argument is an integer that sets or gets the partial delivery
- * point.
+ * point.  Note also that the call will fail if the user attempts to set
+ * this value larger than the socket receive buffer size.
+ *
+ * Note that any single message having a length smaller than or equal to
+ * the SCTP partial delivery point will be delivered in one single read
+ * call as long as the user provided buffer is large enough to hold the
+ * message.
  */
 static int sctp_setsockopt_partial_delivery_point(struct sock *sk,
                                                  char __user *optval,
@@ -3030,6 +3037,12 @@ static int sctp_setsockopt_partial_delivery_point(struct sock *sk,
        if (get_user(val, (int __user *)optval))
                return -EFAULT;
 
+       /* Note: We double the receive buffer from what the user sets
+        * it to be, also initial rwnd is based on rcvbuf/2.
+        */
+       if (val > (sk->sk_rcvbuf >> 1))
+               return -EINVAL;
+
        sctp_sk(sk)->pd_point = val;
 
        return 0; /* is this the right error code? */