cherokee / webserver

Cherokee Web Server
GNU General Public License v2.0
568 stars 105 forks source link

A potential error due to the unreleased lock #1266

Open ycaibb opened 3 years ago

ycaibb commented 3 years ago

Dear developers: thank you for your checking. It seems there is a lock resource leak on the lock thread->starting_lock. I think the lock should be released at the end of thread_routine?

#ifdef HAVE_PTHREAD
static NORETURN void *
thread_routine (void *data)
{
    cherokee_thread_t *thread = THREAD(data);

    ...;
    CHEROKEE_MUTEX_LOCK (&thread->starting_lock); // the lock is not released

    thread_update_bogo_now (thread);

    while (likely (thread->exit == false)) {
        cherokee_thread_step_MULTI_THREAD (thread, false);
    }

    thread->ended = true;
    pthread_detach (thread->thread);
    pthread_exit (NULL);
}
#endif

ret_t
cherokee_thread_new  (cherokee_thread_t      **thd,
                      void                   *server,
                      cherokee_thread_type_t  type,
                      cherokee_poll_type_t    fdpoll_type,
                      cint_t                  system_fd_num,
                      cint_t                  fd_num,
                      cint_t                  conns_max,
                      cint_t                  keepalive_max)
{
re = pthread_create (&n->thread, &attr, thread_routine, n);
}

Best,