#ifdef HAVE_SYS_PRCTL_H
#include <sys/prctl.h>
#endif
+#include "util-byte.h"
#include "util-debug.h"
#ifdef OS_WIN32
return 0;
}
+void CoredumpConfigRegisterTests(void)
+{
+}
+
#else
static bool unlimited = false;
{
#ifdef HAVE_SYS_RESOURCE_H
/* get core dump configuration settings for suricata */
+ int ret = 0;
+ uint64_t max_dump64 = 0;
+ uint32_t max_dump32 = 0;
const char *dump_size_config = NULL;
size_t rlim_size = sizeof(rlim_t);
SCLogInfo ("Unexpected type for rlim_t");
return 0;
}
- errno = 0;
if (rlim_size == 8) {
- max_dump = (rlim_t) strtoull (dump_size_config, NULL, 10);
+ ret = ByteExtractStringUint64(
+ &max_dump64, 10, strlen(dump_size_config), dump_size_config);
}
else if (rlim_size == 4) {
- max_dump = (rlim_t) strtoul (dump_size_config, NULL, 10);
+ ret = ByteExtractStringUint32(
+ &max_dump32, 10, strlen(dump_size_config), dump_size_config);
}
- if ((errno == ERANGE) || (errno != 0 && max_dump == 0)) {
+ if (ret <= 0) {
SCLogInfo ("Illegal core dump size: %s.", dump_size_config);
return 0;
}
- SCLogInfo ("Max dump is %"PRIu64, (uint64_t) max_dump);
+
+ max_dump = rlim_size == 8 ? (rlim_t)max_dump64 : (rlim_t)max_dump32;
+ if (max_dump == 0) {
+ SCLogInfo("Max dump is 0, disable core dumping.");
+ } else {
+ SCLogInfo("Max dump is %" PRIu64, (uint64_t)max_dump);
+ }
}
CoredumpEnable();
return 0;
}
+#if defined UNITTESTS && defined HAVE_SYS_RESOURCE_H
+#include "conf-yaml-loader.h"
+
+static void ResetCoredumpConfig(void)
+{
+ unlimited = false;
+ max_dump = 0;
+}
+
+/**
+ * \test CoredumpConfigTest01 is a test for the coredump configuration
+ * with unlimited coredump size.
+ */
+static int CoredumpConfigTest01(void)
+{
+ char config[] = "\
+%YAML 1.1\n\
+---\n\
+coredump:\n\
+ max-dump: unlimited\n\
+";
+
+ int ret = 0;
+ ResetCoredumpConfig();
+ SCConfCreateContextBackup();
+ SCConfInit();
+
+ SCConfYamlLoadString(config, strlen(config));
+ ret = CoredumpLoadConfig();
+ FAIL_IF(errno != EPERM && ret != 1);
+
+ FAIL_IF(unlimited != true);
+ FAIL_IF(max_dump != 0);
+
+ SCConfDeInit();
+ SCConfRestoreContextBackup();
+ PASS;
+}
+
+/**
+ * \test CoredumpConfigTest02 is a test for the coredump configuration
+ * with a specific coredump size.
+ */
+static int CoredumpConfigTest02(void)
+{
+ char config[] = "\
+%YAML 1.1\n\
+---\n\
+coredump:\n\
+ max-dump: 1000000\n\
+";
+
+ int ret = 0;
+ ResetCoredumpConfig();
+ SCConfCreateContextBackup();
+ SCConfInit();
+
+ SCConfYamlLoadString(config, strlen(config));
+ ret = CoredumpLoadConfig();
+ FAIL_IF(errno != EPERM && ret != 1);
+
+ FAIL_IF(unlimited != false);
+ FAIL_IF(max_dump != 1000000);
+
+ SCConfDeInit();
+ SCConfRestoreContextBackup();
+ PASS;
+}
+
+/**
+ * \test CoredumpConfigTest03 is a test for the coredump configuration
+ * with an invalid coredump size.
+ */
+static int CoredumpConfigTest03(void)
+{
+ char config[] = "\
+%YAML 1.1\n\
+---\n\
+coredump:\n\
+ max-dump: -1000000\n\
+";
+
+ ResetCoredumpConfig();
+ SCConfCreateContextBackup();
+ SCConfInit();
+
+ SCConfYamlLoadString(config, strlen(config));
+ FAIL_IF(CoredumpLoadConfig() != 0);
+
+ FAIL_IF(unlimited != false);
+ FAIL_IF(max_dump != 0);
+
+ SCConfDeInit();
+ SCConfRestoreContextBackup();
+ PASS;
+}
+
+/**
+ * \test CoredumpConfigTest04 is a test for the coredump configuration
+ * with a non-numeric coredump size.
+ */
+static int CoredumpConfigTest04(void)
+{
+ char config[] = "\
+%YAML 1.1\n\
+---\n\
+coredump:\n\
+ max-dump: a\n\
+";
+
+ ResetCoredumpConfig();
+ SCConfCreateContextBackup();
+ SCConfInit();
+
+ SCConfYamlLoadString(config, strlen(config));
+ FAIL_IF(CoredumpLoadConfig() != 0);
+
+ FAIL_IF(unlimited != false);
+ FAIL_IF(max_dump != 0);
+
+ SCConfDeInit();
+ SCConfRestoreContextBackup();
+ PASS;
+}
+
+/**
+ * \test CoredumpConfigTest05 is a test for the coredump configuration
+ * with a zero coredump size.
+ */
+static int CoredumpConfigTest05(void)
+{
+ char config[] = "\
+%YAML 1.1\n\
+---\n\
+coredump:\n\
+ max-dump: 0\n\
+";
+
+ int ret = 0;
+ ResetCoredumpConfig();
+ SCConfCreateContextBackup();
+ SCConfInit();
+
+ SCConfYamlLoadString(config, strlen(config));
+ ret = CoredumpLoadConfig();
+ /* should return 1 because zero coredump size is allowed. */
+ FAIL_IF(errno != EPERM && ret != 1);
+
+ FAIL_IF(unlimited != false);
+ FAIL_IF(max_dump != 0);
+
+ SCConfDeInit();
+ SCConfRestoreContextBackup();
+ PASS;
+}
+#endif /* UNITTESTS */
+
+void CoredumpConfigRegisterTests(void)
+{
+#if defined UNITTESTS && defined HAVE_SYS_RESOURCE_H
+ UtRegisterTest("CoredumpConfigTest01", CoredumpConfigTest01);
+ UtRegisterTest("CoredumpConfigTest02", CoredumpConfigTest02);
+ UtRegisterTest("CoredumpConfigTest03", CoredumpConfigTest03);
+ UtRegisterTest("CoredumpConfigTest04", CoredumpConfigTest04);
+ UtRegisterTest("CoredumpConfigTest05", CoredumpConfigTest05);
+#endif /* UNITTESTS */
+}
+
#endif /* OS_WIN32 */