make SOCKET-RECEIVE work correctly when receiving overly-long UDP packets
authorNathan Froyd <froydnj@gmail.com>
Wed, 5 Sep 2012 02:45:03 +0000 (22:45 -0400)
committerNathan Froyd <froydnj@gmail.com>
Wed, 5 Sep 2012 02:45:03 +0000 (22:45 -0400)
Only copy as much data as the provided buffer can hold.  Continue to return
the length provided from recvfrom as per documentation.

Fixes lp#1023438.  Thanks to Robert Uhl for the fix.

NEWS
contrib/sb-bsd-sockets/sockets.lisp

diff --git a/NEWS b/NEWS
index 47be00e..a858d46 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -6,6 +6,9 @@ changes relative to sbcl-1.0.58:
     comparisons, particularly on almost-sorted inputs.
   * bug fix: Reading floats with large exponents no longer takes too much time
     before reporting that the exponent is too large.
+  * bug fix: SB-BSD-SOCKETS:SOCKET-RECEIVE with a UDP socket now works
+    correctly when the received datagram is larger than the provided buffer.
+    (lp#1023438, thanks to Robert Uhl)
   * documentation: a section on random number generation has been added to the
     manual. (lp#656839)
 
index 9118a6a..5d09d65 100644 (file)
@@ -229,7 +229,7 @@ buffer was too small."))
                                 (list sockint::EAGAIN sockint::EINTR)))
                    nil)
                   ((= len -1) (socket-error "recvfrom"))
-                  (t (loop for i from 0 below len
+                  (t (loop for i from 0 below (min len length)
                            do (setf (elt buffer i)
                                     (cond
                                       ((or (eql element-type 'character) (eql element-type 'base-char))