소스 검색

Merge branch 'tor-github/pr/1318'

George Kadianakis 4 년 전
부모
커밋
bdd17da9fd
2개의 변경된 파일23개의 추가작업 그리고 3개의 파일을 삭제
  1. 5 0
      changes/bug31696
  2. 18 3
      src/lib/malloc/map_anon.c

+ 5 - 0
changes/bug31696

@@ -0,0 +1,5 @@
+  o Major bugfixes (crash, Linux):
+    - Tolerate systems (including some Linux installations) where madvise
+      and/or MADV_DONTFORK are available at build-time, but not at run time.
+      Previously, these systems would notice a failed syscall and abort.
+      Fixes bug 31696; bugfix on 0.4.1.1-alpha.

+ 18 - 3
src/lib/malloc/map_anon.c

@@ -149,18 +149,33 @@ noinherit_mem(void *mem, size_t sz, inherit_res_t *inherit_result_out)
     return 0;
   }
 #endif /* defined(FLAG_ZERO) */
+
 #ifdef FLAG_NOINHERIT
   int r2 = MINHERIT(mem, sz, FLAG_NOINHERIT);
   if (r2 == 0) {
     *inherit_result_out = INHERIT_RES_DROP;
+    return 0;
+  }
+#endif /* defined(FLAG_NOINHERIT) */
+
+#if defined(FLAG_ZERO) || defined(FLAG_NOINHERIT)
+  /* At least one operation was tried, and neither succeeded. */
+
+  if (errno == ENOSYS || errno == EINVAL) {
+    /* Syscall not supported, or flag not supported. */
+    return 0;
+  } else {
+    tor_log_err_sigsafe("Unexpected error from minherit: ",
+                        strerror(errno),
+                        NULL);
+    return -1;
   }
-  return r2;
-#else /* !(defined(FLAG_NOINHERIT)) */
+#else
   (void)inherit_result_out;
   (void)mem;
   (void)sz;
   return 0;
-#endif /* defined(FLAG_NOINHERIT) */
+#endif
 }
 
 /**