Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 19 Aug 1999 13:45:07 +0000 (GMT)
From:      Alfred Perlstein <bright@wintelcom.net>
To:        Daniel Eischen <eischen@vigrid.com>
Cc:        chris@calldei.com, alfred@FreeBSD.org, cvs-all@FreeBSD.org, cvs-committers@FreeBSD.org, eivind@FreeBSD.org, jb@FreeBSD.org
Subject:   Re: cvs commit: src/lib/libc_r/uthread uthread_kern.c
Message-ID:  <Pine.BSF.4.05.9908191317020.6392-100000@fw.wintelcom.net>
In-Reply-To: <199908191945.PAA08513@pcnet1.pcnet.com>

next in thread | previous in thread | raw e-mail | index | archive | help

On Thu, 19 Aug 1999, Daniel Eischen wrote:

> > ok, this should be it, does this look right to everyone:
> > 
> > Index: uthread_cond.c
> > ===================================================================
> > RCS file: /home/ncvs/src/lib/libc_r/uthread/uthread_cond.c,v
> > retrieving revision 1.15
> > diff -u -r1.15 uthread_cond.c
> > --- uthread_cond.c      1999/06/20 08:28:13     1.15
> > +++ uthread_cond.c      1999/08/19 23:22:31
> > @@ -261,6 +261,10 @@
> >         int             rval = 0;
> >         int             status;
> >  
> > +       if (abstime->tv_sec < 0 || 
> > +               abstime->tv_nsec < 0 || abstime->tv_nsec >= 1000000000)
> > +               return (EINVAL);
> > +
> >         if (cond == NULL)
> >                 rval = EINVAL;
> 
> You should also check for tv_nsec < 0.  uthread_select.c also
> needs to validate the timeval passed in a similar fashion.

sorry for that half-baked diff, :) this should catch
incorrect values for time passed in to the various timeout 
functions.

the person experiancing the bug is following up by adding debug
code to verify that the correct values are being passed into his
select calls for a timeout.

thank you for the time and patience.

Index: uthread_cond.c
===================================================================
RCS file: /home/ncvs/src/lib/libc_r/uthread/uthread_cond.c,v
retrieving revision 1.15
diff -u -r1.15 uthread_cond.c
--- uthread_cond.c	1999/06/20 08:28:13	1.15
+++ uthread_cond.c	1999/08/19 23:22:31
@@ -261,6 +261,10 @@
 	int             rval = 0;
 	int             status;
 
+	if (abstime->tv_sec < 0 || 
+		abstime->tv_nsec < 0 || abstime->tv_nsec >= 1000000000)
+		return (EINVAL);
+
 	if (cond == NULL)
 		rval = EINVAL;
 
Index: uthread_nanosleep.c
===================================================================
RCS file: /home/ncvs/src/lib/libc_r/uthread/uthread_nanosleep.c,v
retrieving revision 1.7
diff -u -r1.7 uthread_nanosleep.c
--- uthread_nanosleep.c	1999/08/05 12:15:18	1.7
+++ uthread_nanosleep.c	1999/08/19 23:57:15
@@ -48,7 +48,8 @@
 	struct timeval  tv;
 
 	/* Check if the time to sleep is legal: */
-	if (time_to_sleep == NULL || time_to_sleep->tv_nsec < 0 || time_to_sleep->tv_nsec > 1000000000) {
+	if (time_to_sleep == NULL || time_to_sleep->tv_sec < 0 ||
+		time_to_sleep->tv_nsec < 0 || time_to_sleep->tv_nsec > 1000000000) {
 		/* Return an EINVAL error : */
 		errno = EINVAL;
 		ret = -1;
Index: uthread_poll.c
===================================================================
RCS file: /home/ncvs/src/lib/libc_r/uthread/uthread_poll.c,v
retrieving revision 1.1
diff -u -r1.1 uthread_poll.c
--- uthread_poll.c	1999/06/20 08:28:36	1.1
+++ uthread_poll.c	1999/08/20 00:28:23
@@ -58,13 +58,16 @@
 	if (timeout == INFTIM) {
 		/* Wait for ever: */
 		_thread_kern_set_timeout(NULL);
-	} else if (timeout != 0) {
+	} else if (timeout > 0) {
 		/* Convert the timeout in msec to a timespec: */
 		ts.tv_sec = timeout / 1000;
 		ts.tv_nsec = (timeout % 1000) * 1000;
 
 		/* Set the wake up time: */
 		_thread_kern_set_timeout(&ts);
+	} else if (timeout < 0) {
+		/* a timeout less than zero but not == INFTIM is invalid */
+		return (EINVAL);
 	}
 
 	if (((ret = _thread_sys_poll(fds, numfds, 0)) == 0) && (timeout != 0)) {
Index: uthread_select.c
===================================================================
RCS file: /home/ncvs/src/lib/libc_r/uthread/uthread_select.c,v
retrieving revision 1.9
diff -u -r1.9 uthread_select.c
--- uthread_select.c	1999/08/05 12:15:21	1.9
+++ uthread_select.c	1999/08/19 23:55:32
@@ -53,6 +53,10 @@
 	int		pfd_index, got_one = 0, fd_count = 0;
 	struct pthread_poll_data data;
 
+	if (timeout->tv_sec < 0 ||
+		timeout->tv_usec < 0 || timeout->tv_usec >= 1000000)
+		return (EINVAL); 
+
 	if (numfds > _thread_dtablesize) {
 		numfds = _thread_dtablesize;
 	}




To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe cvs-all" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?Pine.BSF.4.05.9908191317020.6392-100000>