NetBSD-Bugs archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

lib/41645: pthread_cond_timedwait(3) doesn't timeout if NULL is given as abstime argument



>Number:         41645
>Category:       lib
>Synopsis:       pthread_cond_timedwait(3) doesn't timeout if NULL is given as 
>abstime argument
>Confidential:   no
>Severity:       serious
>Priority:       low
>Responsible:    lib-bug-people
>State:          open
>Class:          sw-bug
>Submitter-Id:   net
>Arrival-Date:   Sun Jun 28 17:55:00 +0000 2009
>Originator:     Stathis Kamperis
>Release:        NetBSD 5.0_STABLE
>Organization:
Aristotle University of Thessaloniki
>Environment:
NetBSD voyager 5.0_STABLE NetBSD 5.0_STABLE (MYGENERIC) #6: Fri Jun 26 22:50:50 
EEST 2009  root@voyager:/usr/obj/sys/arch/i386/compile/MYGENERIC i386

>Description:
The pthread_cond_timedwait(3) functions waits perpetually if `NULL' is supplied 
as `abstime' argument. POSIX (issue 6) says that if an invalid timeout is 
given, EINVAL should be returned immediately. Issue 7, doesn't talk about 
invalid timeout, it just gives a valid range.

According to my understanding, a programmer using pthread_cond_timedwait(3) 
would want the call to timeout at some point. So if by mistake provides a NULL 
timeout, what's the least surprise thing we could do ? Error or block 
indefinitely ?

I realize that my argument is flammable. So even if you expect the programmer 
to always do the right thing or the current state is a conscious design that I 
miss, could you please document this behavior in pthread_cond_timedwait(3) man 
page ?


Best regards,
Stathis


>How-To-Repeat:


#include <assert.h>
#include <errno.h>
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void)
{
        pthread_cond_t cond;
        pthread_mutex_t mtx;
        struct timespec abstime;

        /* Create a condition variable with default attributes. */
        assert(pthread_cond_init(&cond, NULL) == 0);

        /* Initialize mutex. */
        assert(pthread_mutex_init(&mtx, NULL) == 0);

        /* Acquire lock. */
        assert(pthread_mutex_lock(&mtx) == 0);

        assert(pthread_cond_timedwait(&cond, &mtx, NULL) == EINVAL);

        /* Release lock. */
        assert(pthread_mutex_unlock(&mtx) == 0);

        /* Cleanup. */
        assert(pthread_cond_destroy(&cond) == 0);
        assert(pthread_mutex_destroy(&mtx) == 0);

        printf("passed\n");

        return (EXIT_SUCCESS);
}

>Fix:



Home | Main Index | Thread Index | Old Index