Jelajahi Sumber

Fixed a potential memory double free.

Marco Bambini 8 tahun lalu
induk
melakukan
f9d84522d8
2 mengubah file dengan 6 tambahan dan 1 penghapusan
  1. 4 1
      src/compiler/gravity_parser.c
  2. 2 0
      src/shared/gravity_hash.c

+ 4 - 1
src/compiler/gravity_parser.c

@@ -1998,6 +1998,7 @@ static gnode_t *parse_meta_macro (gravity_parser_t *parser) {
     DECLARE_LEXER;
     
     gravity_hash_t *htable = parser_getmeta(parser, false);
+    bool is_local = !htable;
     if (!htable) htable = gravity_hash_create(0, gravity_value_hash, gravity_value_equals, gravity_hash_keyvaluefree, NULL);
     
     parse_required(parser, TOK_OP_OPEN_PARENTHESIS);
@@ -2040,12 +2041,14 @@ static gnode_t *parse_meta_macro (gravity_parser_t *parser) {
     parse_semicolon(parser);
   
     // set parser meta
+    is_local = false;
     parser_setmeta(parser, htable, false);
     
     return NULL;
     
 handle_error:
-    gravity_hash_free(htable);
+    if (is_local) gravity_hash_free(htable);
+    else parser_setmeta(parser, NULL, true);
     return NULL;
 }
 

+ 2 - 0
src/shared/gravity_hash.c

@@ -180,6 +180,7 @@ void gravity_hash_free (gravity_hash_t *hashtable) {
 	
 	for (uint32_t n = 0; n < hashtable->size; ++n) {
 		hash_node_t *node = hashtable->nodes[n];
+        hashtable->nodes[n] = NULL;
 		while (node) {
 			if (free_fn) free_fn(hashtable, node->key, node->value, hashtable->data);
 			hash_node_t *old_node = node;
@@ -189,6 +190,7 @@ void gravity_hash_free (gravity_hash_t *hashtable) {
 	}
 	mem_free(hashtable->nodes);
 	mem_free(hashtable);
+    hashtable = NULL;
 }
 
 uint32_t gravity_hash_memsize (gravity_hash_t *hashtable) {