wireless: fix use-after-free bug
[project/netifd.git] / handler.c
index f5db438..f4e27e1 100644 (file)
--- a/handler.c
+++ b/handler.c
@@ -16,7 +16,6 @@
 #include <glob.h>
 #include <fcntl.h>
 #include <stdio.h>
 #include <glob.h>
 #include <fcntl.h>
 #include <stdio.h>
-#include <unistd.h>
 
 #include "netifd.h"
 #include "system.h"
 
 #include "netifd.h"
 #include "system.h"
@@ -60,7 +59,24 @@ out:
 }
 
 static void
 }
 
 static void
-netifd_init_script_handler(const char *name, script_dump_cb cb)
+netifd_init_script_handler(const char *script, json_object *obj, script_dump_cb cb)
+{
+       json_object *tmp;
+       const char *name;
+
+       if (!json_check_type(obj, json_type_object))
+               return;
+
+       tmp = json_get_field(obj, "name", json_type_string);
+       if (!tmp)
+               return;
+
+       name = json_object_get_string(tmp);
+       cb(script, name, obj);
+}
+
+static void
+netifd_parse_script_handler(const char *name, script_dump_cb cb)
 {
        struct json_tokener *tok = NULL;
        json_object *obj;
 {
        struct json_tokener *tok = NULL;
        json_object *obj;
@@ -90,7 +106,7 @@ netifd_init_script_handler(const char *name, script_dump_cb cb)
 
                obj = json_tokener_parse_ex(tok, start, len);
                if (!is_error(obj)) {
 
                obj = json_tokener_parse_ex(tok, start, len);
                if (!is_error(obj)) {
-                       cb(name, obj);
+                       netifd_init_script_handler(name, obj, cb);
                        json_object_put(obj);
                        json_tokener_free(tok);
                        tok = NULL;
                        json_object_put(obj);
                        json_tokener_free(tok);
                        tok = NULL;
@@ -114,7 +130,7 @@ void netifd_init_script_handlers(int dir_fd, script_dump_cb cb)
        prev_fd = netifd_dir_push(dir_fd);
        glob("./*.sh", 0, NULL, &g);
        for (i = 0; i < g.gl_pathc; i++)
        prev_fd = netifd_dir_push(dir_fd);
        glob("./*.sh", 0, NULL, &g);
        for (i = 0; i < g.gl_pathc; i++)
-               netifd_init_script_handler(g.gl_pathv[i], cb);
+               netifd_parse_script_handler(g.gl_pathv[i], cb);
        netifd_dir_pop(prev_fd);
 }
 
        netifd_dir_pop(prev_fd);
 }