s3: fix s3 winreg server after idl changes.
[kai/samba.git] / source3 / rpc_server / srv_winreg_nt.c
index 7ff93e0b07e23b168629d18955a1757b1b0b0c32..7e842ed54d3a8c5bed32c855e55fe6b5e7d075df 100644 (file)
@@ -230,7 +230,11 @@ WERROR _winreg_QueryValue(pipes_struct *p, struct winreg_QueryValue *r)
        if ( !regkey )
                return WERR_BADFID;
 
-       *r->out.value_length = *r->out.type = REG_NONE;
+       if ((r->out.data_length == NULL) || (r->out.type == NULL)) {
+               return WERR_INVALID_PARAM;
+       }
+
+       *r->out.data_length = *r->out.type = REG_NONE;
        
        DEBUG(7,("_reg_info: policy key name = [%s]\n", regkey->key->name));
        DEBUG(7,("_reg_info: policy key type = [%08x]\n", regkey->key->type));
@@ -238,38 +242,40 @@ WERROR _winreg_QueryValue(pipes_struct *p, struct winreg_QueryValue *r)
        /* Handle QueryValue calls on HKEY_PERFORMANCE_DATA */
        if(regkey->key->type == REG_KEY_HKPD) 
        {
-               if(strequal(r->in.value_name.name, "Global"))   {
-                       prs_init(&prs_hkpd, *r->in.data_size, p->mem_ctx, MARSHALL);
+               if (strequal(r->in.value_name->name, "Global")) {
+                       if (!prs_init(&prs_hkpd, *r->in.data_size, p->mem_ctx, MARSHALL))
+                               return WERR_NOMEM;
                        status = reg_perfcount_get_hkpd(
                                &prs_hkpd, *r->in.data_size, &outbuf_size, NULL);
                        outbuf = (uint8_t *)prs_hkpd.data_p;
                        free_prs = True;
                }
-               else if(strequal(r->in.value_name.name, "Counter 009")) {
+               else if (strequal(r->in.value_name->name, "Counter 009")) {
                        outbuf_size = reg_perfcount_get_counter_names(
                                reg_perfcount_get_base_index(),
                                (char **)(void *)&outbuf);
                        free_buf = True;
                }
-               else if(strequal(r->in.value_name.name, "Explain 009")) {
+               else if (strequal(r->in.value_name->name, "Explain 009")) {
                        outbuf_size = reg_perfcount_get_counter_help(
                                reg_perfcount_get_base_index(),
                                (char **)(void *)&outbuf);
                        free_buf = True;
                }
-               else if(isdigit(r->in.value_name.name[0])) {
+               else if (isdigit(r->in.value_name->name[0])) {
                        /* we probably have a request for a specific object
                         * here */
-                       prs_init(&prs_hkpd, *r->in.data_size, p->mem_ctx, MARSHALL);
+                       if (!prs_init(&prs_hkpd, *r->in.data_size, p->mem_ctx, MARSHALL))
+                               return WERR_NOMEM;
                        status = reg_perfcount_get_hkpd(
                                &prs_hkpd, *r->in.data_size, &outbuf_size,
-                               r->in.value_name.name);
+                               r->in.value_name->name);
                        outbuf = (uint8_t *)prs_hkpd.data_p;
                        free_prs = True;
                }
                else {
                        DEBUG(3,("Unsupported key name [%s] for HKPD.\n",
-                                r->in.value_name.name));
+                                r->in.value_name->name));
                        return WERR_BADFILE;
                }
 
@@ -278,14 +284,14 @@ WERROR _winreg_QueryValue(pipes_struct *p, struct winreg_QueryValue *r)
        else {
                struct registry_value *val;
 
-               status = reg_queryvalue(p->mem_ctx, regkey, r->in.value_name.name,
+               status = reg_queryvalue(p->mem_ctx, regkey, r->in.value_name->name,
                                        &val);
                if (!W_ERROR_IS_OK(status)) {
                        if (r->out.data_size) {
                                *r->out.data_size = 0;
                        }
-                       if (r->out.value_length) {
-                               *r->out.value_length = 0;
+                       if (r->out.data_length) {
+                               *r->out.data_length = 0;
                        }
                        return status;
                }
@@ -300,18 +306,18 @@ WERROR _winreg_QueryValue(pipes_struct *p, struct winreg_QueryValue *r)
                *r->out.type = val->type;
        }
 
-       *r->out.value_length = outbuf_size;
+       *r->out.data_length = outbuf_size;
 
        if ( *r->in.data_size == 0 || !r->out.data ) {
                status = WERR_OK;
-       } else if ( *r->out.value_length > *r->in.data_size ) {
+       } else if ( *r->out.data_length > *r->in.data_size ) {
                status = WERR_MORE_DATA;
        } else {
-               memcpy( r->out.data, outbuf, *r->out.value_length );
+               memcpy( r->out.data, outbuf, *r->out.data_length );
                status = WERR_OK;
        }
 
-       *r->out.data_size = *r->out.value_length;
+       *r->out.data_size = *r->out.data_length;
 
        if (free_prs) prs_mem_free(&prs_hkpd);
        if (free_buf) SAFE_FREE(outbuf);
@@ -469,7 +475,7 @@ WERROR _winreg_InitiateSystemShutdown(pipes_struct *p, struct winreg_InitiateSys
        s.in.message = r->in.message;
        s.in.timeout = r->in.timeout;
        s.in.force_apps = r->in.force_apps;
-       s.in.reboot = r->in.reboot;
+       s.in.do_reboot = r->in.do_reboot;
        s.in.reason = 0;
 
        /* thunk down to _winreg_InitiateSystemShutdownEx() 
@@ -493,7 +499,7 @@ WERROR _winreg_InitiateSystemShutdownEx(pipes_struct *p, struct winreg_InitiateS
        char *chkmsg = NULL;
        fstring str_timeout;
        fstring str_reason;
-       fstring reboot;
+       fstring do_reboot;
        fstring f;
        int ret;
        bool can_shutdown;
@@ -508,10 +514,8 @@ WERROR _winreg_InitiateSystemShutdownEx(pipes_struct *p, struct winreg_InitiateS
 
        /* pull the message string and perform necessary sanity checks on it */
 
-       chkmsg[0] = '\0';
-
-       if ( r->in.message && r->in.message->name && r->in.message->name->name ) {
-               if ( (msg = talloc_strdup(p->mem_ctx, r->in.message->name->name )) == NULL ) {
+       if ( r->in.message && r->in.message->string ) {
+               if ( (msg = talloc_strdup(p->mem_ctx, r->in.message->string )) == NULL ) {
                        return WERR_NOMEM;
                }
                chkmsg = TALLOC_ARRAY(p->mem_ctx, char, strlen(msg)+1);
@@ -522,7 +526,7 @@ WERROR _winreg_InitiateSystemShutdownEx(pipes_struct *p, struct winreg_InitiateS
        }
 
        fstr_sprintf(str_timeout, "%d", r->in.timeout);
-       fstr_sprintf(reboot, r->in.reboot ? SHUTDOWN_R_STRING : "");
+       fstr_sprintf(do_reboot, r->in.do_reboot ? SHUTDOWN_R_STRING : "");
        fstr_sprintf(f, r->in.force_apps ? SHUTDOWN_F_STRING : "");
        fstr_sprintf(str_reason, "%d", r->in.reason );
 
@@ -537,7 +541,7 @@ WERROR _winreg_InitiateSystemShutdownEx(pipes_struct *p, struct winreg_InitiateS
                return WERR_NOMEM;
        }
        shutdown_script = talloc_all_string_sub(p->mem_ctx,
-                                               shutdown_script, "%r", reboot);
+                                               shutdown_script, "%r", do_reboot);
        if (!shutdown_script) {
                return WERR_NOMEM;
        }
@@ -740,6 +744,9 @@ WERROR _winreg_CreateKey( pipes_struct *p, struct winreg_CreateKey *r)
        if ( !parent )
                return WERR_BADFID;
 
+       DEBUG(10, ("_winreg_CreateKey called with parent key '%s' and "
+                  "subkey name '%s'\n", parent->key->name, r->in.name.name));
+
        result = reg_createkey(NULL, parent, r->in.name.name, r->in.access_mask,
                               &new_key, r->out.action_taken);
        if (!W_ERROR_IS_OK(result)) {