SCLogDebug("event.type=YAML_SCALAR_EVENT; state=%d; value=%s; "
"tag=%s; inseq=%d", state, value, tag, inseq);
if (inseq) {
- ConfNode *seq_node = ConfNodeNew();
- seq_node->name = SCCalloc(1, DEFAULT_NAME_LEN);
- if (seq_node->name == NULL)
- return -1;
- snprintf(seq_node->name, DEFAULT_NAME_LEN, "%d", seq_idx++);
- seq_node->val = SCStrdup(value);
- if (unlikely(seq_node->val == NULL)) {
- SCFree(seq_node->name);
- return -1;
+ char sequence_node_name[DEFAULT_NAME_LEN];
+ snprintf(sequence_node_name, DEFAULT_NAME_LEN, "%d", seq_idx++);
+ ConfNode *seq_node = ConfNodeLookupChild(parent,
+ sequence_node_name);
+ if (seq_node != NULL) {
+ /* The sequence node has already been set, probably
+ * from the command line. Remove it so it gets
+ * re-added in the expected order for iteration.
+ */
+ TAILQ_REMOVE(&parent->head, seq_node, next);
+ }
+ else {
+ seq_node = ConfNodeNew();
+ if (unlikely(seq_node == NULL)) {
+ return -1;
+ }
+ seq_node->name = SCStrdup(sequence_node_name);
+ if (unlikely(seq_node->name == NULL)) {
+ SCFree(seq_node);
+ return -1;
+ }
+ seq_node->val = SCStrdup(value);
+ if (unlikely(seq_node->val == NULL)) {
+ SCFree(seq_node->name);
+ return -1;
+ }
}
TAILQ_INSERT_TAIL(&parent->head, seq_node, next);
}
else if (event.type == YAML_MAPPING_START_EVENT) {
SCLogDebug("event.type=YAML_MAPPING_START_EVENT; state=%d", state);
if (inseq) {
- ConfNode *seq_node = ConfNodeNew();
- seq_node->is_seq = 1;
- seq_node->name = SCCalloc(1, DEFAULT_NAME_LEN);
- if (seq_node->name == NULL)
- return -1;
- snprintf(seq_node->name, DEFAULT_NAME_LEN, "%d", seq_idx++);
+ char sequence_node_name[DEFAULT_NAME_LEN];
+ snprintf(sequence_node_name, DEFAULT_NAME_LEN, "%d", seq_idx++);
+ ConfNode *seq_node = ConfNodeLookupChild(node,
+ sequence_node_name);
+ if (seq_node != NULL) {
+ /* The sequence node has already been set, probably
+ * from the command line. Remove it so it gets
+ * re-added in the expected order for iteration.
+ */
+ TAILQ_REMOVE(&node->head, seq_node, next);
+ }
+ else {
+ seq_node = ConfNodeNew();
+ if (unlikely(seq_node == NULL)) {
+ return -1;
+ }
+ seq_node->name = SCStrdup(sequence_node_name);
+ if (unlikely(seq_node->name == NULL)) {
+ SCFree(seq_node);
+ return -1;
+ }
+ seq_node->is_seq = 1;
+ }
TAILQ_INSERT_TAIL(&node->head, seq_node, next);
if (ConfYamlParse(parser, seq_node, 0) != 0)
goto fail;