Subject: pthreads, ENOMEM and glib
To: None <current-users@netbsd.org>
From: Patrick Welche <prlw1@newn.cam.ac.uk>
List: current-users
Date: 11/16/2006 19:41:25
Running gmake check on glib cvs-head, I see 2 failed tests in gthread,
essentially due to pthread_create returning ENOMEM. The only place
I can see is src/lib/libpthread/pthread.c:

    /* Fetch misc. attributes from the attr structure. */ 
    name = NULL;
    if ((p = nattr.pta_private) != NULL)
        if (p->ptap_name[0] != '\0')
            if ((name = strdup(p->ptap_name)) == NULL)
                return ENOMEM;

BTW pthread_create(3) says:

ERRORS
     pthread_create() shall fail if:

     [EAGAIN]           The system lacks the necessary resources to create
                        another thread, or the system-imposed limit on the
                        total number of threads in a process
                        PTHREAD_THREADS_MAX would be exceeded.

     [EINVAL]           The value specified by attr is invalid.


Any thoughts on how a strdup could fail? Espcially as

struct pthread_attr_private {
    char ptap_name[PTHREAD_MAX_NAMELEN_NP];

#define       PTHREAD_MAX_NAMELEN_NP  32

32 bytes doesn't seem like a huge amount of memory - ah ptap_name might
not be '\0' terminated... how...

Cheers,

Patrick