소스 검색

Dan Dedrick wrote:

If pthread_create fails for some reason we need to not access the
thread pointer as it will not be valid. Without this check a failed
return code from pthread_create would cause a SIGSEGV to occur.

An instance that pthread_create could fail is if enough connections were
established that we ran out of space in our mapping to create another
thread stack. Specifically I have seen this occur with
systemd-journal-gatewayd where there was a bug with not releasing
connections after they had disconnected. I submitted a fix for that
here: https://github.com/systemd/systemd/pull/2287 but it would really
be best if libmicrohttpd didn't SIGSEGV under these conditions.
Christian Grothoff 10 년 전
부모
커밋
c39414cdc7
3개의 변경된 파일6개의 추가작업 그리고 2개의 파일을 삭제
  1. 3 0
      ChangeLog
  2. 1 1
      src/include/microhttpd.h
  3. 2 1
      src/microhttpd/daemon.c

+ 3 - 0
ChangeLog

@@ -1,3 +1,6 @@
+Tue Mar 15 21:52:27 CET 2016
+	Do not crash if pthread_create() fails. -DD
+
 Tue Mar 15 20:29:34 CET 2016
 	Do not use eready DLL data structure unless
 	we are actually using epoll(). -DD/CG

+ 1 - 1
src/include/microhttpd.h

@@ -130,7 +130,7 @@ typedef intptr_t ssize_t;
  * Current version of the library.
  * 0x01093001 = 1.9.30-1.
  */
-#define MHD_VERSION 0x00094803
+#define MHD_VERSION 0x00094804
 
 /**
  * MHD-internal return code for "YES".

+ 2 - 1
src/microhttpd/daemon.c

@@ -1283,7 +1283,8 @@ create_thread (MHD_thread_handle_ *thread,
   ret = pthread_create (thread, pattr,
 			start_routine, arg);
 #ifdef HAVE_PTHREAD_SETNAME_NP
-  (void) pthread_setname_np (*thread, "libmicrohttpd");
+  if (0 == ret)
+    (void) pthread_setname_np (*thread, "libmicrohttpd");
 #endif /* HAVE_PTHREAD_SETNAME_NP */
   if (0 != daemon->thread_stack_size)
     pthread_attr_destroy (&attr);