s3-spoolss: Correctly set the default values.
authorAndreas Schneider <asn@samba.org>
Mon, 26 Jul 2010 16:12:13 +0000 (18:12 +0200)
committerSimo Sorce <idra@samba.org>
Tue, 27 Jul 2010 14:27:16 +0000 (10:27 -0400)
source3/rpc_server/srv_spoolss_util.c

index 943cd87102b5112bad0bc45d5117b1b21e110fb0..603a0b270239379452d84719135b9628c17e9942 100644 (file)
 #define TOP_LEVEL_CONTROL_FORMS_KEY TOP_LEVEL_CONTROL_KEY "\\Forms"
 
 #define EMPTY_STRING ""
-static const char *empty_string_array[1] = { NULL };
-#define EMPTY_STRING_ARRAY empty_string_array
+
+#define FILL_STRING(mem_ctx, in, out) \
+       do { \
+               if (in && strlen(in)) { \
+                       out = talloc_strdup(mem_ctx, in); \
+               } else { \
+                       out = talloc_strdup(mem_ctx, ""); \
+               } \
+               W_ERROR_HAVE_NO_MEMORY(out); \
+       } while (0);
 
 #define CHECK_ERROR(result) \
        if (W_ERROR_IS_OK(result)) continue; \
@@ -1098,6 +1106,11 @@ static WERROR winreg_enumval_to_dword(TALLOC_CTX *mem_ctx,
                return WERR_INVALID_DATATYPE;
        }
 
+       if (v->data_length == 0) {
+               *dw = 0;
+               return WERR_OK;
+       }
+
        *dw = IVAL(v->data->data, 0);
        return WERR_OK;
 }
@@ -1115,6 +1128,14 @@ static WERROR winreg_enumval_to_sz(TALLOC_CTX *mem_ctx,
                return WERR_INVALID_DATATYPE;
        }
 
+       if (v->data_length == 0) {
+               *_str = talloc_strdup(mem_ctx, EMPTY_STRING);
+               if (*_str == NULL) {
+                       return WERR_NOMEM;
+               }
+               return WERR_OK;
+       }
+
        if (!pull_reg_sz(mem_ctx, v->data, _str)) {
                return WERR_NOMEM;
        }
@@ -1136,6 +1157,15 @@ static WERROR winreg_enumval_to_multi_sz(TALLOC_CTX *mem_ctx,
                return WERR_INVALID_DATATYPE;
        }
 
+       if (v->data_length == 0) {
+               *array = talloc_array(mem_ctx, const char *, 1);
+               if (*array == NULL) {
+                       return WERR_NOMEM;
+               }
+               *array[0] = NULL;
+               return WERR_OK;
+       }
+
        if (!pull_reg_multi_sz(mem_ctx, v->data, array)) {
                return WERR_NOMEM;
        }
@@ -1975,17 +2005,17 @@ WERROR winreg_get_printer(TALLOC_CTX *mem_ctx,
                goto done;
        }
 
-       info2->servername     = EMPTY_STRING;
-       info2->printername    = EMPTY_STRING;
-       info2->sharename      = EMPTY_STRING;
-       info2->portname       = EMPTY_STRING;
-       info2->drivername     = EMPTY_STRING;
-       info2->comment        = EMPTY_STRING;
-       info2->location       = EMPTY_STRING;
-       info2->sepfile        = EMPTY_STRING;
-       info2->printprocessor = EMPTY_STRING;
-       info2->datatype       = EMPTY_STRING;
-       info2->parameters     = EMPTY_STRING;
+       FILL_STRING(info2, EMPTY_STRING, info2->servername);
+       FILL_STRING(info2, EMPTY_STRING, info2->printername);
+       FILL_STRING(info2, EMPTY_STRING, info2->sharename);
+       FILL_STRING(info2, EMPTY_STRING, info2->portname);
+       FILL_STRING(info2, EMPTY_STRING, info2->drivername);
+       FILL_STRING(info2, EMPTY_STRING, info2->comment);
+       FILL_STRING(info2, EMPTY_STRING, info2->location);
+       FILL_STRING(info2, EMPTY_STRING, info2->sepfile);
+       FILL_STRING(info2, EMPTY_STRING, info2->printprocessor);
+       FILL_STRING(info2, EMPTY_STRING, info2->datatype);
+       FILL_STRING(info2, EMPTY_STRING, info2->parameters);
 
        if (servername != NULL && servername[0] != '\0') {
                info2->servername = talloc_asprintf(info2, "\\\\%s", servername);
@@ -4007,25 +4037,6 @@ WERROR winreg_get_driver(TALLOC_CTX *mem_ctx,
                goto done;
        }
 
-       info8->config_file = EMPTY_STRING;
-       info8->data_file = EMPTY_STRING;
-       info8->default_datatype = EMPTY_STRING;
-       info8->driver_path = EMPTY_STRING;
-       info8->hardware_id = EMPTY_STRING;
-       info8->help_file = EMPTY_STRING;
-       info8->inf_path = EMPTY_STRING;
-       info8->manufacturer_name = EMPTY_STRING;
-       info8->manufacturer_url = EMPTY_STRING;
-       info8->monitor_name = EMPTY_STRING;
-       info8->print_processor = EMPTY_STRING;
-       info8->provider = EMPTY_STRING;
-       info8->vendor_setup = EMPTY_STRING;
-
-       info8->color_profiles = empty_string_array;
-       info8->core_driver_dependencies = EMPTY_STRING_ARRAY;
-       info8->dependent_files = EMPTY_STRING_ARRAY;
-       info8->previous_names = EMPTY_STRING_ARRAY;
-
        result = WERR_OK;
 
        for (i = 0; i < num_values; i++) {