Sanity check time structures passed in, return EINVAL like the system
calls do to avoid corrupting the thread library's concept of wakeup time. PR: kern/12141 Reviewed by: deischen, eivind
This commit is contained in:
parent
d3c6699913
commit
91518882e0
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=50065
@ -29,7 +29,7 @@
|
|||||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
* SUCH DAMAGE.
|
* SUCH DAMAGE.
|
||||||
*
|
*
|
||||||
* $Id$
|
* $Id: uthread_cond.c,v 1.15 1999/06/20 08:28:13 jb Exp $
|
||||||
*/
|
*/
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
@ -261,6 +261,10 @@ pthread_cond_timedwait(pthread_cond_t * cond, pthread_mutex_t * mutex,
|
|||||||
int rval = 0;
|
int rval = 0;
|
||||||
int status;
|
int status;
|
||||||
|
|
||||||
|
if (abstime->tv_sec < 0 ||
|
||||||
|
abstime->tv_nsec < 0 || abstime->tv_nsec >= 1000000000)
|
||||||
|
return (EINVAL);
|
||||||
|
|
||||||
if (cond == NULL)
|
if (cond == NULL)
|
||||||
rval = EINVAL;
|
rval = EINVAL;
|
||||||
|
|
||||||
|
@ -29,7 +29,7 @@
|
|||||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
* SUCH DAMAGE.
|
* SUCH DAMAGE.
|
||||||
*
|
*
|
||||||
* $Id$
|
* $Id: uthread_nanosleep.c,v 1.7 1999/08/05 12:15:18 deischen Exp $
|
||||||
*/
|
*/
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
@ -48,7 +48,8 @@ nanosleep(const struct timespec * time_to_sleep,
|
|||||||
struct timeval tv;
|
struct timeval tv;
|
||||||
|
|
||||||
/* Check if the time to sleep is legal: */
|
/* 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 : */
|
/* Return an EINVAL error : */
|
||||||
errno = EINVAL;
|
errno = EINVAL;
|
||||||
ret = -1;
|
ret = -1;
|
||||||
|
@ -29,7 +29,7 @@
|
|||||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
* SUCH DAMAGE.
|
* SUCH DAMAGE.
|
||||||
*
|
*
|
||||||
* $Id$
|
* $Id: uthread_poll.c,v 1.1 1999/06/20 08:28:36 jb Exp $
|
||||||
*/
|
*/
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
@ -58,13 +58,16 @@ poll(struct pollfd *fds, unsigned int nfds, int timeout)
|
|||||||
if (timeout == INFTIM) {
|
if (timeout == INFTIM) {
|
||||||
/* Wait for ever: */
|
/* Wait for ever: */
|
||||||
_thread_kern_set_timeout(NULL);
|
_thread_kern_set_timeout(NULL);
|
||||||
} else if (timeout != 0) {
|
} else if (timeout > 0) {
|
||||||
/* Convert the timeout in msec to a timespec: */
|
/* Convert the timeout in msec to a timespec: */
|
||||||
ts.tv_sec = timeout / 1000;
|
ts.tv_sec = timeout / 1000;
|
||||||
ts.tv_nsec = (timeout % 1000) * 1000;
|
ts.tv_nsec = (timeout % 1000) * 1000;
|
||||||
|
|
||||||
/* Set the wake up time: */
|
/* Set the wake up time: */
|
||||||
_thread_kern_set_timeout(&ts);
|
_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)) {
|
if (((ret = _thread_sys_poll(fds, numfds, 0)) == 0) && (timeout != 0)) {
|
||||||
|
@ -29,7 +29,7 @@
|
|||||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
* SUCH DAMAGE.
|
* SUCH DAMAGE.
|
||||||
*
|
*
|
||||||
* $Id: uthread_select.c,v 1.8 1999/06/23 15:01:22 dt Exp $
|
* $Id: uthread_select.c,v 1.9 1999/08/05 12:15:21 deischen Exp $
|
||||||
*/
|
*/
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
@ -53,6 +53,10 @@ select(int numfds, fd_set * readfds, fd_set * writefds,
|
|||||||
int pfd_index, got_one = 0, fd_count = 0;
|
int pfd_index, got_one = 0, fd_count = 0;
|
||||||
struct pthread_poll_data data;
|
struct pthread_poll_data data;
|
||||||
|
|
||||||
|
if (timeout->tv_sec < 0 ||
|
||||||
|
timeout->tv_usec < 0 || timeout->tv_usec >= 1000000)
|
||||||
|
return (EINVAL);
|
||||||
|
|
||||||
if (numfds > _thread_dtablesize) {
|
if (numfds > _thread_dtablesize) {
|
||||||
numfds = _thread_dtablesize;
|
numfds = _thread_dtablesize;
|
||||||
}
|
}
|
||||||
|
@ -29,7 +29,7 @@
|
|||||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
* SUCH DAMAGE.
|
* SUCH DAMAGE.
|
||||||
*
|
*
|
||||||
* $Id$
|
* $Id: uthread_cond.c,v 1.15 1999/06/20 08:28:13 jb Exp $
|
||||||
*/
|
*/
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
@ -261,6 +261,10 @@ pthread_cond_timedwait(pthread_cond_t * cond, pthread_mutex_t * mutex,
|
|||||||
int rval = 0;
|
int rval = 0;
|
||||||
int status;
|
int status;
|
||||||
|
|
||||||
|
if (abstime->tv_sec < 0 ||
|
||||||
|
abstime->tv_nsec < 0 || abstime->tv_nsec >= 1000000000)
|
||||||
|
return (EINVAL);
|
||||||
|
|
||||||
if (cond == NULL)
|
if (cond == NULL)
|
||||||
rval = EINVAL;
|
rval = EINVAL;
|
||||||
|
|
||||||
|
@ -29,7 +29,7 @@
|
|||||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
* SUCH DAMAGE.
|
* SUCH DAMAGE.
|
||||||
*
|
*
|
||||||
* $Id$
|
* $Id: uthread_nanosleep.c,v 1.7 1999/08/05 12:15:18 deischen Exp $
|
||||||
*/
|
*/
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
@ -48,7 +48,8 @@ nanosleep(const struct timespec * time_to_sleep,
|
|||||||
struct timeval tv;
|
struct timeval tv;
|
||||||
|
|
||||||
/* Check if the time to sleep is legal: */
|
/* 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 : */
|
/* Return an EINVAL error : */
|
||||||
errno = EINVAL;
|
errno = EINVAL;
|
||||||
ret = -1;
|
ret = -1;
|
||||||
|
@ -29,7 +29,7 @@
|
|||||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
* SUCH DAMAGE.
|
* SUCH DAMAGE.
|
||||||
*
|
*
|
||||||
* $Id$
|
* $Id: uthread_poll.c,v 1.1 1999/06/20 08:28:36 jb Exp $
|
||||||
*/
|
*/
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
@ -58,13 +58,16 @@ poll(struct pollfd *fds, unsigned int nfds, int timeout)
|
|||||||
if (timeout == INFTIM) {
|
if (timeout == INFTIM) {
|
||||||
/* Wait for ever: */
|
/* Wait for ever: */
|
||||||
_thread_kern_set_timeout(NULL);
|
_thread_kern_set_timeout(NULL);
|
||||||
} else if (timeout != 0) {
|
} else if (timeout > 0) {
|
||||||
/* Convert the timeout in msec to a timespec: */
|
/* Convert the timeout in msec to a timespec: */
|
||||||
ts.tv_sec = timeout / 1000;
|
ts.tv_sec = timeout / 1000;
|
||||||
ts.tv_nsec = (timeout % 1000) * 1000;
|
ts.tv_nsec = (timeout % 1000) * 1000;
|
||||||
|
|
||||||
/* Set the wake up time: */
|
/* Set the wake up time: */
|
||||||
_thread_kern_set_timeout(&ts);
|
_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)) {
|
if (((ret = _thread_sys_poll(fds, numfds, 0)) == 0) && (timeout != 0)) {
|
||||||
|
@ -29,7 +29,7 @@
|
|||||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
* SUCH DAMAGE.
|
* SUCH DAMAGE.
|
||||||
*
|
*
|
||||||
* $Id: uthread_select.c,v 1.8 1999/06/23 15:01:22 dt Exp $
|
* $Id: uthread_select.c,v 1.9 1999/08/05 12:15:21 deischen Exp $
|
||||||
*/
|
*/
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
@ -53,6 +53,10 @@ select(int numfds, fd_set * readfds, fd_set * writefds,
|
|||||||
int pfd_index, got_one = 0, fd_count = 0;
|
int pfd_index, got_one = 0, fd_count = 0;
|
||||||
struct pthread_poll_data data;
|
struct pthread_poll_data data;
|
||||||
|
|
||||||
|
if (timeout->tv_sec < 0 ||
|
||||||
|
timeout->tv_usec < 0 || timeout->tv_usec >= 1000000)
|
||||||
|
return (EINVAL);
|
||||||
|
|
||||||
if (numfds > _thread_dtablesize) {
|
if (numfds > _thread_dtablesize) {
|
||||||
numfds = _thread_dtablesize;
|
numfds = _thread_dtablesize;
|
||||||
}
|
}
|
||||||
|
@ -29,7 +29,7 @@
|
|||||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
* SUCH DAMAGE.
|
* SUCH DAMAGE.
|
||||||
*
|
*
|
||||||
* $Id$
|
* $Id: uthread_cond.c,v 1.15 1999/06/20 08:28:13 jb Exp $
|
||||||
*/
|
*/
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
@ -261,6 +261,10 @@ pthread_cond_timedwait(pthread_cond_t * cond, pthread_mutex_t * mutex,
|
|||||||
int rval = 0;
|
int rval = 0;
|
||||||
int status;
|
int status;
|
||||||
|
|
||||||
|
if (abstime->tv_sec < 0 ||
|
||||||
|
abstime->tv_nsec < 0 || abstime->tv_nsec >= 1000000000)
|
||||||
|
return (EINVAL);
|
||||||
|
|
||||||
if (cond == NULL)
|
if (cond == NULL)
|
||||||
rval = EINVAL;
|
rval = EINVAL;
|
||||||
|
|
||||||
|
@ -29,7 +29,7 @@
|
|||||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
* SUCH DAMAGE.
|
* SUCH DAMAGE.
|
||||||
*
|
*
|
||||||
* $Id$
|
* $Id: uthread_nanosleep.c,v 1.7 1999/08/05 12:15:18 deischen Exp $
|
||||||
*/
|
*/
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
@ -48,7 +48,8 @@ nanosleep(const struct timespec * time_to_sleep,
|
|||||||
struct timeval tv;
|
struct timeval tv;
|
||||||
|
|
||||||
/* Check if the time to sleep is legal: */
|
/* 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 : */
|
/* Return an EINVAL error : */
|
||||||
errno = EINVAL;
|
errno = EINVAL;
|
||||||
ret = -1;
|
ret = -1;
|
||||||
|
@ -29,7 +29,7 @@
|
|||||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
* SUCH DAMAGE.
|
* SUCH DAMAGE.
|
||||||
*
|
*
|
||||||
* $Id$
|
* $Id: uthread_poll.c,v 1.1 1999/06/20 08:28:36 jb Exp $
|
||||||
*/
|
*/
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
@ -58,13 +58,16 @@ poll(struct pollfd *fds, unsigned int nfds, int timeout)
|
|||||||
if (timeout == INFTIM) {
|
if (timeout == INFTIM) {
|
||||||
/* Wait for ever: */
|
/* Wait for ever: */
|
||||||
_thread_kern_set_timeout(NULL);
|
_thread_kern_set_timeout(NULL);
|
||||||
} else if (timeout != 0) {
|
} else if (timeout > 0) {
|
||||||
/* Convert the timeout in msec to a timespec: */
|
/* Convert the timeout in msec to a timespec: */
|
||||||
ts.tv_sec = timeout / 1000;
|
ts.tv_sec = timeout / 1000;
|
||||||
ts.tv_nsec = (timeout % 1000) * 1000;
|
ts.tv_nsec = (timeout % 1000) * 1000;
|
||||||
|
|
||||||
/* Set the wake up time: */
|
/* Set the wake up time: */
|
||||||
_thread_kern_set_timeout(&ts);
|
_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)) {
|
if (((ret = _thread_sys_poll(fds, numfds, 0)) == 0) && (timeout != 0)) {
|
||||||
|
@ -29,7 +29,7 @@
|
|||||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
* SUCH DAMAGE.
|
* SUCH DAMAGE.
|
||||||
*
|
*
|
||||||
* $Id: uthread_select.c,v 1.8 1999/06/23 15:01:22 dt Exp $
|
* $Id: uthread_select.c,v 1.9 1999/08/05 12:15:21 deischen Exp $
|
||||||
*/
|
*/
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
@ -53,6 +53,10 @@ select(int numfds, fd_set * readfds, fd_set * writefds,
|
|||||||
int pfd_index, got_one = 0, fd_count = 0;
|
int pfd_index, got_one = 0, fd_count = 0;
|
||||||
struct pthread_poll_data data;
|
struct pthread_poll_data data;
|
||||||
|
|
||||||
|
if (timeout->tv_sec < 0 ||
|
||||||
|
timeout->tv_usec < 0 || timeout->tv_usec >= 1000000)
|
||||||
|
return (EINVAL);
|
||||||
|
|
||||||
if (numfds > _thread_dtablesize) {
|
if (numfds > _thread_dtablesize) {
|
||||||
numfds = _thread_dtablesize;
|
numfds = _thread_dtablesize;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user