goto next;
}
+ /* If the value is unquoted, certain strings in YAML represent NULL. */
+ if ((inseq || state == CONF_VAL) &&
+ event.data.scalar.style == YAML_PLAIN_SCALAR_STYLE) {
+ if (strlen(value) == 0 || strcmp(value, "~") == 0 || strcmp(value, "null") == 0 ||
+ strcmp(value, "Null") == 0 || strcmp(value, "NULL") == 0) {
+ value = NULL;
+ }
+ }
+
if (inseq) {
char sequence_node_name[DEFAULT_NAME_LEN];
snprintf(sequence_node_name, DEFAULT_NAME_LEN, "%d", seq_idx++);
SCFree(seq_node);
goto fail;
}
- seq_node->val = SCStrdup(value);
- if (unlikely(seq_node->val == NULL)) {
- SCFree(seq_node->name);
- goto fail;
+ if (value != NULL) {
+ seq_node->val = SCStrdup(value);
+ if (unlikely(seq_node->val == NULL)) {
+ SCFree(seq_node->name);
+ goto fail;
+ }
+ } else {
+ seq_node->val = NULL;
}
}
TAILQ_INSERT_TAIL(&parent->head, seq_node, next);
state = CONF_VAL;
}
else {
- if ((tag != NULL) && (strcmp(tag, "!include") == 0)) {
+ if (value != NULL && (tag != NULL) && (strcmp(tag, "!include") == 0)) {
SCLogInfo("Including configuration file %s at "
"parent node %s.", value, node->name);
if (ConfYamlHandleInclude(node, value) != 0)
goto fail;
- }
- else if (!node->final) {
+ } else if (!node->final && value != NULL) {
if (node->val != NULL)
SCFree(node->val);
node->val = SCStrdup(value);
PASS;
}
+static int ConfYamlNull(void)
+{
+ ConfCreateContextBackup();
+ ConfInit();
+
+ char config[] = "%YAML 1.1\n"
+ "---\n"
+ "quoted-tilde: \"~\"\n"
+ "unquoted-tilde: ~\n"
+ "quoted-null: \"null\"\n"
+ "unquoted-null: null\n"
+ "quoted-Null: \"Null\"\n"
+ "unquoted-Null: Null\n"
+ "quoted-NULL: \"NULL\"\n"
+ "unquoted-NULL: NULL\n"
+ "empty-quoted: \"\"\n"
+ "empty-unquoted: \n"
+ "list: [\"null\", null, \"Null\", Null, \"NULL\", NULL, \"~\", ~]\n";
+ FAIL_IF(ConfYamlLoadString(config, strlen(config)) != 0);
+
+ const char *val;
+
+ FAIL_IF_NOT(ConfGet("quoted-tilde", &val));
+ FAIL_IF_NULL(val);
+ FAIL_IF_NOT(ConfGet("unquoted-tilde", &val));
+ FAIL_IF_NOT_NULL(val);
+
+ FAIL_IF_NOT(ConfGet("quoted-null", &val));
+ FAIL_IF_NULL(val);
+ FAIL_IF_NOT(ConfGet("unquoted-null", &val));
+ FAIL_IF_NOT_NULL(val);
+
+ FAIL_IF_NOT(ConfGet("quoted-Null", &val));
+ FAIL_IF_NULL(val);
+ FAIL_IF_NOT(ConfGet("unquoted-Null", &val));
+ FAIL_IF_NOT_NULL(val);
+
+ FAIL_IF_NOT(ConfGet("quoted-NULL", &val));
+ FAIL_IF_NULL(val);
+ FAIL_IF_NOT(ConfGet("unquoted-NULL", &val));
+ FAIL_IF_NOT_NULL(val);
+
+ FAIL_IF_NOT(ConfGet("empty-quoted", &val));
+ FAIL_IF_NULL(val);
+ FAIL_IF_NOT(ConfGet("empty-unquoted", &val));
+ FAIL_IF_NOT_NULL(val);
+
+ FAIL_IF_NOT(ConfGet("list.0", &val));
+ FAIL_IF_NULL(val);
+ FAIL_IF_NOT(ConfGet("list.1", &val));
+ FAIL_IF_NOT_NULL(val);
+
+ FAIL_IF_NOT(ConfGet("list.2", &val));
+ FAIL_IF_NULL(val);
+ FAIL_IF_NOT(ConfGet("list.3", &val));
+ FAIL_IF_NOT_NULL(val);
+
+ FAIL_IF_NOT(ConfGet("list.4", &val));
+ FAIL_IF_NULL(val);
+ FAIL_IF_NOT(ConfGet("list.5", &val));
+ FAIL_IF_NOT_NULL(val);
+
+ FAIL_IF_NOT(ConfGet("list.6", &val));
+ FAIL_IF_NULL(val);
+ FAIL_IF_NOT(ConfGet("list.7", &val));
+ FAIL_IF_NOT_NULL(val);
+
+ ConfDeInit();
+ ConfRestoreContextBackup();
+
+ PASS;
+}
+
#endif /* UNITTESTS */
void
UtRegisterTest("ConfYamlFileIncludeTest", ConfYamlFileIncludeTest);
UtRegisterTest("ConfYamlOverrideTest", ConfYamlOverrideTest);
UtRegisterTest("ConfYamlOverrideFinalTest", ConfYamlOverrideFinalTest);
+ UtRegisterTest("ConfYamlNull", ConfYamlNull);
#endif /* UNITTESTS */
}