Sfoglia il codice sorgente

ncd: ncd.c: understand strings with null bytes

ambrop7 14 anni fa
parent
commit
d40da16cc6
1 ha cambiato i file con 15 aggiunte e 8 eliminazioni
  1. 15 8
      ncd/ncd.c

+ 15 - 8
ncd/ncd.c

@@ -85,7 +85,10 @@
 struct arg_value {
     int type;
     union {
-        char *string;
+        struct {
+            char *string;
+            size_t string_len;
+        };
         char **variable_names;
         LinkedList1 list;
         LinkedList1 maplist;
@@ -184,7 +187,7 @@ static void print_version (void);
 static int parse_arguments (int argc, char *argv[]);
 static void signal_handler (void *unused);
 static void start_terminate (int exit_code);
-static int arg_value_init_string (struct arg_value *o, const char *string);
+static int arg_value_init_string (struct arg_value *o, const char *string, size_t len);
 static int arg_value_init_variable (struct arg_value *o, struct NCDConfig_strings *ast_names);
 static void arg_value_init_list (struct arg_value *o);
 static int arg_value_list_append (struct arg_value *o, struct arg_value v);
@@ -640,13 +643,17 @@ void start_terminate (int exit_code)
     }
 }
 
-int arg_value_init_string (struct arg_value *o, const char *string)
+int arg_value_init_string (struct arg_value *o, const char *string, size_t len)
 {
     o->type = ARG_VALUE_TYPE_STRING;
-    if (!(o->string = strdup(string))) {
-        BLog(BLOG_ERROR, "strdup failed");
+    
+    if (!(o->string = malloc(len))) {
+        BLog(BLOG_ERROR, "malloc failed");
         return 0;
     }
+    memcpy(o->string, string, len);
+    
+    o->string_len = len;
     
     return 1;
 }
@@ -744,7 +751,7 @@ int build_arg_from_ast (struct arg_value *o, struct NCDConfig_list *ast)
 {
     switch (ast->type) {
         case NCDCONFIG_ARG_STRING: {
-            if (!arg_value_init_string(o, ast->string)) {
+            if (!arg_value_init_string(o, ast->string, ast->string_len)) {
                 return 0;
             }
         } break;
@@ -1542,8 +1549,8 @@ int process_statement_resolve_argument (struct process_statement *ps, struct arg
     
     switch (arg->type) {
         case ARG_VALUE_TYPE_STRING: {
-            if (!NCDValue_InitString(out, arg->string)) {
-                process_statement_log(ps, BLOG_ERROR, "NCDValue_InitString failed");
+            if (!NCDValue_InitStringBin(out, arg->string, arg->string_len)) {
+                process_statement_log(ps, BLOG_ERROR, "NCDValue_InitStringBin failed");
                 return 0;
             }
         } break;