]> andersk Git - libyaml.git/commitdiff
Fix some leaks, segfaults and warnings.
authorKirill Simonov <xi@resolvent.net>
Fri, 21 Jul 2006 18:29:00 +0000 (18:29 +0000)
committerKirill Simonov <xi@resolvent.net>
Fri, 21 Jul 2006 18:29:00 +0000 (18:29 +0000)
src/api.c
src/parser.c
src/reader.c
src/scanner.c
tests/run-parser.c
tests/run-scanner.c

index 0dd3c4247514e50d3acf69672c6be6098b025622..23f4ff20c4f23eeadf1f8318c109dc712b3433ed 100644 (file)
--- a/src/api.c
+++ b/src/api.c
@@ -368,6 +368,9 @@ yaml_token_delete(yaml_token_t *token)
         case YAML_SCALAR_TOKEN:
             yaml_free(token->data.scalar.value);
             break;
+
+        default:
+            break;
     }
 
     memset(token, 0, sizeof(yaml_token_t));
@@ -416,6 +419,9 @@ yaml_event_delete(yaml_event_t *event)
             yaml_free(event->data.mapping_start.anchor);
             yaml_free(event->data.mapping_start.tag);
             break;
+
+        default:
+            break;
     }
 
     memset(event, 0, sizeof(yaml_event_t));
index fe9e1719150a565756ca72fc6322ad35a981e1c4..2b81b0c21519cc8ca1e95fb973314813c26c603b 100644 (file)
@@ -363,6 +363,8 @@ yaml_parser_state_machine(yaml_parser_t *parser, yaml_event_t *event)
         default:
             assert(1);      /* Invalid state. */
     }
+
+    return 0;
 }
 
 /*
@@ -1358,12 +1360,16 @@ yaml_parser_process_directives(yaml_parser_t *parser,
     if (tag_directives_start_ref) {
         if (STACK_EMPTY(parser, tag_directives)) {
             *tag_directives_start_ref = *tag_directives_end_ref = NULL;
+            STACK_DEL(parser, tag_directives);
         }
         else {
             *tag_directives_start_ref = tag_directives.start;
-            *tag_directives_end_ref = tag_directives.end;
+            *tag_directives_end_ref = tag_directives.top;
         }
     }
+    else {
+        STACK_DEL(parser, tag_directives);
+    }
 
     return 1;
 
@@ -1384,7 +1390,6 @@ yaml_parser_append_tag_directive(yaml_parser_t *parser,
 {
     yaml_tag_directive_t *tag_directive;
     yaml_tag_directive_t copy = { NULL, NULL };
-    int length;
 
     for (tag_directive = parser->tag_directives.start;
             tag_directive != parser->tag_directives.top; tag_directive ++) {
index 99a51db0f46ca666be5362407d0ef4bf41d9e054..ea189c26eb4afd9d2a53c295da309e5798b22281 100644 (file)
@@ -186,10 +186,10 @@ yaml_parser_update_buffer(yaml_parser_t *parser, size_t length)
 
         while (parser->raw_buffer.pointer != parser->raw_buffer.last)
         {
-            unsigned int value, value2;
+            unsigned int value = 0, value2 = 0;
             int incomplete = 0;
             unsigned char octet;
-            unsigned int width;
+            unsigned int width = 0;
             int k, low, high;
             int raw_unread = parser->raw_buffer.last - parser->raw_buffer.pointer;
 
@@ -366,7 +366,7 @@ yaml_parser_update_buffer(yaml_parser_t *parser, size_t length)
 
                         /* Get the next character. */
 
-                        unsigned int value2 = parser->raw_buffer.pointer[low+2]
+                        value2 = parser->raw_buffer.pointer[low+2]
                             + (parser->raw_buffer.pointer[high+2] << 8);
 
                         /* Check for a low surrogate area. */
@@ -386,6 +386,9 @@ yaml_parser_update_buffer(yaml_parser_t *parser, size_t length)
                     }
 
                     break;
+
+                default:
+                    assert(1);      /* Impossible. */
             }
 
             /* Check if the raw buffer contains enough bytes to form a character. */
index 90a8979f437893aab8f24a09de492df92d520db1..a9b78ff13393d0a51fe40136bdb8c9273c028fb0 100644 (file)
@@ -3601,7 +3601,7 @@ yaml_parser_scan_plain_scalar(yaml_parser_t *parser, yaml_token_t *token)
     if (!STRING_INIT(parser, trailing_breaks, INITIAL_STRING_SIZE)) goto error;
     if (!STRING_INIT(parser, whitespaces, INITIAL_STRING_SIZE)) goto error;
 
-    start_mark = parser->mark;
+    start_mark = end_mark = parser->mark;
 
     /* Consume the content of the plain scalar. */
 
index 16f4ce15cc73a482306a0af7b6dc75ba12d05ce0..8c1a5dbc395cbc9713957282a28315089279a665 100644 (file)
@@ -7,39 +7,52 @@
 int
 main(int argc, char *argv[])
 {
-    FILE *file;
-    yaml_parser_t parser;
-    yaml_event_t event;
-    int done = 0;
-    int count = 0;
-
-    if (argc != 2) {
-        printf("Usage: %s file.yaml\n", argv[0]);
+    int number;
+
+    if (argc < 2) {
+        printf("Usage: %s file1.yaml ...\n", argv[0]);
         return 0;
     }
-    file = fopen(argv[1], "rb");
-    assert(file);
 
-    assert(yaml_parser_initialize(&parser));
+    for (number = 1; number < argc; number ++)
+    {
+        FILE *file;
+        yaml_parser_t parser;
+        yaml_event_t event;
+        int done = 0;
+        int count = 0;
+        int error = 0;
 
-    yaml_parser_set_input_file(&parser, file);
+        printf("[%d] Parsing '%s': ", number, argv[number]);
+        fflush(stdout);
 
-    while (!done)
-    {
-        assert(yaml_parser_parse(&parser, &event));
+        file = fopen(argv[number], "rb");
+        assert(file);
 
-        done = (event.type == YAML_STREAM_END_EVENT);
+        assert(yaml_parser_initialize(&parser));
 
-        yaml_event_delete(&event);
+        yaml_parser_set_input_file(&parser, file);
 
-        count ++;
-    }
+        while (!done)
+        {
+            if (!yaml_parser_parse(&parser, &event)) {
+                error = 1;
+                break;
+            }
 
-    yaml_parser_delete(&parser);
+            done = (event.type == YAML_STREAM_END_EVENT);
 
-    fclose(file);
+            yaml_event_delete(&event);
 
-    printf("Parsing the file '%s': %d events\n", argv[1], count);
+            count ++;
+        }
+
+        yaml_parser_delete(&parser);
+
+        assert(!fclose(file));
+
+        printf("%s (%d events)\n", (error ? "FAILURE" : "SUCCESS"), count);
+    }
 
     return 0;
 }
index e3a67f29cecbab0c2cc89308658f816fec39cf56..2c8d33e5b68aade683b58aeeccad1f7c031c0586 100644 (file)
@@ -7,39 +7,52 @@
 int
 main(int argc, char *argv[])
 {
-    FILE *file;
-    yaml_parser_t parser;
-    yaml_token_t token;
-    int done = 0;
-    int count = 0;
-
-    if (argc != 2) {
-        printf("Usage: %s file.yaml\n", argv[0]);
+    int number;
+
+    if (argc < 2) {
+        printf("Usage: %s file1.yaml ...\n", argv[0]);
         return 0;
     }
-    file = fopen(argv[1], "rb");
-    assert(file);
 
-    assert(yaml_parser_initialize(&parser));
+    for (number = 1; number < argc; number ++)
+    {
+        FILE *file;
+        yaml_parser_t parser;
+        yaml_token_t token;
+        int done = 0;
+        int count = 0;
+        int error = 0;
 
-    yaml_parser_set_input_file(&parser, file);
+        printf("[%d] Scanning '%s': ", number, argv[number]);
+        fflush(stdout);
 
-    while (!done)
-    {
-        assert(yaml_parser_scan(&parser, &token));
+        file = fopen(argv[number], "rb");
+        assert(file);
 
-        done = (token.type == YAML_STREAM_END_TOKEN);
+        assert(yaml_parser_initialize(&parser));
 
-        yaml_token_delete(&token);
+        yaml_parser_set_input_file(&parser, file);
 
-        count ++;
-    }
+        while (!done)
+        {
+            if (!yaml_parser_scan(&parser, &token)) {
+                error = 1;
+                break;
+            }
 
-    yaml_parser_delete(&parser);
+            done = (token.type == YAML_STREAM_END_TOKEN);
 
-    fclose(file);
+            yaml_token_delete(&token);
 
-    printf("Parsing the file '%s': %d tokens\n", argv[1], count);
+            count ++;
+        }
+
+        yaml_parser_delete(&parser);
+
+        assert(!fclose(file));
+
+        printf("%s (%d tokens)\n", (error ? "FAILURE" : "SUCCESS"), count);
+    }
 
     return 0;
 }
This page took 0.135099 seconds and 5 git commands to generate.