aboutsummaryrefslogtreecommitdiff
path: root/sys/kern/uipc_socket.c
diff options
context:
space:
mode:
authorAndrey A. Chernov <ache@FreeBSD.org>1999-05-21 15:54:40 +0000
committerAndrey A. Chernov <ache@FreeBSD.org>1999-05-21 15:54:40 +0000
commit925fa5c3f50d1be47d51704cd3fb2b4cd07d969f (patch)
tree58d766f5fd43fc27506c0a8ea60d8def3f4b8493 /sys/kern/uipc_socket.c
parent13c655ab1a94072465374cf25552f0234ec7ce92 (diff)
downloadsrc-925fa5c3f50d1be47d51704cd3fb2b4cd07d969f.tar.gz
src-925fa5c3f50d1be47d51704cd3fb2b4cd07d969f.zip
Realy fix overflow on SO_*TIMEO
Submitted by: bde
Notes
Notes: svn path=/head/; revision=47364
Diffstat (limited to 'sys/kern/uipc_socket.c')
-rw-r--r--sys/kern/uipc_socket.c16
1 files changed, 12 insertions, 4 deletions
diff --git a/sys/kern/uipc_socket.c b/sys/kern/uipc_socket.c
index cfae9c131b98..4f2c486463ad 100644
--- a/sys/kern/uipc_socket.c
+++ b/sys/kern/uipc_socket.c
@@ -31,7 +31,7 @@
* SUCH DAMAGE.
*
* @(#)uipc_socket.c 8.3 (Berkeley) 4/15/94
- * $Id: uipc_socket.c,v 1.56 1999/04/24 18:22:34 ache Exp $
+ * $Id: uipc_socket.c,v 1.57 1999/05/03 23:57:23 billf Exp $
*/
#include <sys/param.h>
@@ -955,7 +955,7 @@ sosetopt(so, sopt)
int error, optval;
struct linger l;
struct timeval tv;
- short val;
+ u_long val;
error = 0;
if (sopt->sopt_level != SOL_SOCKET) {
@@ -1049,11 +1049,19 @@ sosetopt(so, sopt)
if (error)
goto bad;
- if (tv.tv_sec * hz + tv.tv_usec / tick > SHRT_MAX) {
+ /* assert(hz > 0); */
+ if (tv.tv_sec < 0 || tv.tv_sec > SHRT_MAX / hz ||
+ tv.tv_usec < 0 || tv.tv_usec >= 1000000) {
+ error = EDOM;
+ goto bad;
+ }
+ /* assert(tick > 0); */
+ /* assert(ULONG_MAX - SHRT_MAX >= 1000000); */
+ val = (u_long)(tv.tv_sec * hz) + tv.tv_usec / tick;
+ if (val > SHRT_MAX) {
error = EDOM;
goto bad;
}
- val = tv.tv_sec * hz + tv.tv_usec / tick;
switch (sopt->sopt_name) {
case SO_SNDTIMEO: