OSDN Git Service

ueventd: fix copied string not being freed
authorChih-Wei Huang <cwhuang@linux.org.tw>
Thu, 25 Aug 2016 13:10:32 +0000 (21:10 +0800)
committerChih-Wei Huang <cwhuang@linux.org.tw>
Sat, 6 May 2017 14:54:43 +0000 (22:54 +0800)
Unlike change Id0a5f711e33363082ba201afda6b26043998cb1c,
parse_subsystem and parse_line_subsystem hold points to memory
of the copied string which can't be freed.

To fix the issue, duplicate the strings to be hold.
Then we can parse the std::string data directly without
copying it.

Change-Id: I4dbf543de6880537b419e6c2344ee6a40ce378f1

init/ueventd_parser.cpp

index 09f4638..24a6684 100644 (file)
@@ -113,7 +113,7 @@ static void *parse_subsystem(parse_state* state, int /*nargs*/, char** args) {
         parse_error(state, "out of memory\n");
         return 0;
     }
-    s->name = args[1];
+    s->name = strdup(args[1]);
     s->dirname = "/dev";
     list_add_tail(&subsystem_list, &s->slist);
     return s;
@@ -142,7 +142,7 @@ static void parse_line_subsystem(struct parse_state *state, int nargs,
 
     case K_dirname:
         if (args[1][0] == '/')
-            s->dirname = args[1];
+            s->dirname = strdup(args[1]);
         else
             parse_error(state, "dirname '%s' does not start with '/'\n",
                     args[1]);
@@ -191,7 +191,7 @@ static void parse_line(struct parse_state *state, char **args, int nargs)
     }
 }
 
-static void parse_config(const char *fn, const std::string& data)
+static void parse_config(const char *fn, std::string& data)
 {
     char *args[UEVENTD_PARSER_MAXARGS];
 
@@ -199,7 +199,7 @@ static void parse_config(const char *fn, const std::string& data)
     parse_state state;
     state.filename = fn;
     state.line = 1;
-    state.ptr = strdup(data.c_str());  // TODO: fix this code!
+    state.ptr = &data[0];
     state.nexttoken = 0;
     state.parse_line = parse_line_no_op;
     for (;;) {