Prechádzať zdrojové kódy

Add error handling for sigaction, signal and strdup

Tatsuhiro Tsujikawa 9 rokov pred
rodič
commit
1ce6ac0b23
2 zmenil súbory, kde vykonal 17 pridanie a 3 odobranie
  1. 7 1
      src/OptionParser.cc
  2. 10 2
      src/util.cc

+ 7 - 1
src/OptionParser.cc

@@ -90,8 +90,14 @@ void putOptions(struct option* longOpts, int* plopt, InputIterator first,
     if (*first && !(*first)->isHidden()) {
 #ifdef HAVE_OPTION_CONST_NAME
       (*longOpts).name = (*first)->getName();
-#else // !HAVE_OPTION_CONST_NAME
+#else  // !HAVE_OPTION_CONST_NAME
       (*longOpts).name = strdup((*first)->getName());
+      if ((*longOpts).name == nullptr) {
+        auto errNum = errno;
+        A2_LOG_ERROR(
+            fmt("strdup() failed: %s", util::safeStrerror(errNum).c_str()));
+        exit(EXIT_FAILURE);
+      }
 #endif // !HAVE_OPTION_CONST_NAME
       switch ((*first)->getArgType()) {
       case OptionHandler::REQ_ARG:

+ 10 - 2
src/util.cc

@@ -1341,9 +1341,17 @@ void setGlobalSignalHandler(int sig, sigset_t* mask, signal_handler_t handler,
   sigact.sa_handler = handler;
   sigact.sa_flags = flags;
   sigact.sa_mask = *mask;
-  sigaction(sig, &sigact, nullptr);
+  if (sigaction(sig, &sigact, nullptr) == -1) {
+    auto errNum = errno;
+    A2_LOG_ERROR(fmt("sigaction() failed for signal %d: %s", sig,
+                     safeStrerror(errNum).c_str()));
+  }
 #else
-  signal(sig, handler);
+  if (signal(sig, handler) == SIG_ERR) {
+    auto errNum = errno;
+    A2_LOG_ERROR(fmt("signal() failed for signal %d: %s", sig,
+                     safeStrerror(errNum).c_str()));
+  }
 #endif // HAVE_SIGACTION
 }