From 838ae8758929cee840e7fe64ed702e91d5ef8e3c Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Wed, 4 May 2005 07:07:35 +0000 Subject: [PATCH] set OOBINLINE socket option now --- CHANGES.txt | 6 ++++++ TODO.FACTOR.txt | 1 + library/unix/sockets.factor | 13 ++++++++----- library/unix/syscalls-freebsd.factor | 24 +++++++++++++----------- library/unix/syscalls-linux.factor | 1 + library/unix/syscalls-macosx.factor | 16 +++++++++------- version.factor | 2 +- 7 files changed, 39 insertions(+), 24 deletions(-) diff --git a/CHANGES.txt b/CHANGES.txt index 02c85982b7..be6488167e 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,3 +1,9 @@ +Factor 0.75: +------------ + +The SO_OOBINLINE socket flag is now set. In 0.74, sending out-of-band +data could fill up the buffer and cause a denial-of-service attack. + Factor 0.74: ------------ diff --git a/TODO.FACTOR.txt b/TODO.FACTOR.txt index b50f4d59a0..862c6a0025 100644 --- a/TODO.FACTOR.txt +++ b/TODO.FACTOR.txt @@ -90,6 +90,7 @@ + i/o: +- if two tasks write to a unix stream, the buffer can overflow - faster stream-copy - rename prettyprint to pprint - reading and writing byte arrays diff --git a/library/unix/sockets.factor b/library/unix/sockets.factor index ebd02751e2..98976df0db 100644 --- a/library/unix/sockets.factor +++ b/library/unix/sockets.factor @@ -38,13 +38,12 @@ USING: alien generic kernel math unix-internals ; : server-sockaddr ( port -- sockaddr ) init-sockaddr INADDR_ANY htonl over set-sockaddr-in-addr ; -: reuse-addr ( fd -- ) - SOL_SOCKET SO_REUSEADDR 1 box-int "int" c-size setsockopt - io-error ; +: sockopt ( fd opt -- ) + SOL_SOCKET swap 1 box-int "int" c-size setsockopt io-error ; : server-socket ( port -- fd ) server-sockaddr [ - dup reuse-addr + dup SO_REUSEADDR sockopt swap dupd "sockaddr-in" c-size bind dup 0 >= [ drop 1 listen ] [ ( fd n - n) nip ] ifte ] with-socket-fd ; @@ -81,7 +80,11 @@ IN: streams C: client-stream ( fd host port -- stream ) [ set-client-stream-port ] keep [ set-client-stream-host ] keep - [ >r dup f r> set-delegate ] keep ; + [ + >r + dup SO_OOBINLINE sockopt + dup f r> set-delegate + ] keep ; : ( host port -- stream ) #! Connect to a port number on a TCP/IP host. diff --git a/library/unix/syscalls-freebsd.factor b/library/unix/syscalls-freebsd.factor index 7cf4bad24f..bf270fbc58 100644 --- a/library/unix/syscalls-freebsd.factor +++ b/library/unix/syscalls-freebsd.factor @@ -9,18 +9,20 @@ IN: unix-internals : O_RDWR HEX: 0002 ; : O_CREAT HEX: 0200 ; : O_TRUNC HEX: 0400 ; + +: POLLIN HEX: 0001 ; +: POLLPRI HEX: 0002 ; +: POLLOUT HEX: 0004 ; +: POLLRDNORM HEX: 0040 ; +: POLLWRNORM POLLOUT ; +: POLLRDBAND HEX: 0080 ; +: POLLWRBAND HEX: 0100 ; -: POLLIN HEX: 0001 ; ! any readable data available -: POLLPRI HEX: 0002 ; ! OOB/Urgent readable data -: POLLOUT HEX: 0004 ; ! file descriptor is writeable -: POLLRDNORM HEX: 0040 ; ! non-OOB/URG data available -: POLLWRNORM POLLOUT ; ! no write type differentiation -: POLLRDBAND HEX: 0080 ; ! OOB/Urgent readable data -: POLLWRBAND HEX: 0100 ; ! OOB/Urgent data can be written +: SOL_SOCKET HEX: ffff ; +: SO_REUSEADDR HEX: 4 ; +: SO_OOBINLINE HEX: ff ; -: SOL_SOCKET HEX: ffff ; ! options for socket level -: SO_REUSEADDR HEX: 4 ; ! allow local address reuse : INADDR_ANY 0 ; -: F_SETFL 4 ; ! set file status flags -: O_NONBLOCK 4 ; ! no delay +: F_SETFL 4 ; +: O_NONBLOCK 4 ; diff --git a/library/unix/syscalls-linux.factor b/library/unix/syscalls-linux.factor index 510677ad47..e4ebe2f8af 100644 --- a/library/unix/syscalls-linux.factor +++ b/library/unix/syscalls-linux.factor @@ -20,6 +20,7 @@ IN: unix-internals : SOL_SOCKET 1 ; : SO_REUSEADDR 2 ; +: SO_OOBINLINE 10 ; : INADDR_ANY 0 ; : F_SETFL 4 ; ! set file status flags diff --git a/library/unix/syscalls-macosx.factor b/library/unix/syscalls-macosx.factor index 169ff9e296..251d594a08 100644 --- a/library/unix/syscalls-macosx.factor +++ b/library/unix/syscalls-macosx.factor @@ -10,13 +10,15 @@ IN: unix-internals : O_CREAT HEX: 0200 ; : O_TRUNC HEX: 0400 ; -: POLLIN HEX: 0001 ; ! any readable data available -: POLLPRI HEX: 0002 ; ! OOB/Urgent readable data -: POLLOUT HEX: 0004 ; ! file descriptor is writeable +: POLLIN HEX: 0001 ; +: POLLPRI HEX: 0002 ; +: POLLOUT HEX: 0004 ; + +: SOL_SOCKET HEX: ffff ; +: SO_REUSEADDR HEX: 4 ; +: SO_OOBINLINE HEX: ff ; -: SOL_SOCKET HEX: ffff ; ! options for socket level -: SO_REUSEADDR HEX: 4 ; ! allow local address reuse : INADDR_ANY 0 ; -: F_SETFL 4 ; ! set file status flags -: O_NONBLOCK 4 ; ! no delay +: F_SETFL 4 ; +: O_NONBLOCK 4 ; diff --git a/version.factor b/version.factor index 55b808a046..b7bfd1f049 100644 --- a/version.factor +++ b/version.factor @@ -1,2 +1,2 @@ IN: kernel -: version "0.74" ; +: version "0.75" ;