From b381fba0892021f164223bae8b0951014a28735e Mon Sep 17 00:00:00 2001 From: Günther Deschner Date: Tue, 29 Jun 2010 16:13:15 +0200 Subject: s3-registry: avoid using registry_value union. Just pull and push data as is. Guenther --- source3/rpc_server/srv_winreg_nt.c | 50 +++++++++++++------------------------- 1 file changed, 17 insertions(+), 33 deletions(-) (limited to 'source3/rpc_server/srv_winreg_nt.c') diff --git a/source3/rpc_server/srv_winreg_nt.c b/source3/rpc_server/srv_winreg_nt.c index 1cf0903b51..5cebcf1e15 100644 --- a/source3/rpc_server/srv_winreg_nt.c +++ b/source3/rpc_server/srv_winreg_nt.c @@ -226,7 +226,6 @@ WERROR _winreg_QueryValue(pipes_struct *p, struct winreg_QueryValue *r) uint8_t *outbuf; uint32_t outbuf_size; - DATA_BLOB val_blob; bool free_buf = False; bool free_prs = False; @@ -305,13 +304,8 @@ WERROR _winreg_QueryValue(pipes_struct *p, struct winreg_QueryValue *r) return status; } - status = registry_push_value(p->mem_ctx, val, &val_blob); - if (!W_ERROR_IS_OK(status)) { - return status; - } - - outbuf = val_blob.data; - outbuf_size = val_blob.length; + outbuf = val->data.data; + outbuf_size = val->data.length; *r->out.type = val->type; } @@ -422,7 +416,6 @@ WERROR _winreg_EnumValue(pipes_struct *p, struct winreg_EnumValue *r) struct registry_key *key = find_regkey_by_hnd( p, r->in.handle ); char *valname; struct registry_value *val; - DATA_BLOB value_blob; if ( !key ) return WERR_BADFID; @@ -438,11 +431,6 @@ WERROR _winreg_EnumValue(pipes_struct *p, struct winreg_EnumValue *r) return err; } - err = registry_push_value(p->mem_ctx, val, &value_blob); - if (!W_ERROR_IS_OK(err)) { - return err; - } - if (r->out.name != NULL) { r->out.name->name = valname; } @@ -456,18 +444,18 @@ WERROR _winreg_EnumValue(pipes_struct *p, struct winreg_EnumValue *r) return WERR_INVALID_PARAM; } - if (value_blob.length > *r->out.size) { + if (val->data.length > *r->out.size) { return WERR_MORE_DATA; } - memcpy( r->out.value, value_blob.data, value_blob.length ); + memcpy( r->out.value, val->data.data, val->data.length ); } if (r->out.length != NULL) { - *r->out.length = value_blob.length; + *r->out.length = val->data.length; } if (r->out.size != NULL) { - *r->out.size = value_blob.length; + *r->out.size = val->data.length; } return WERR_OK; @@ -788,7 +776,6 @@ WERROR _winreg_SetValue(pipes_struct *p, struct winreg_SetValue *r) { struct registry_key *key = find_regkey_by_hnd(p, r->in.handle); struct registry_value *val; - WERROR status; if ( !key ) return WERR_BADFID; @@ -796,12 +783,14 @@ WERROR _winreg_SetValue(pipes_struct *p, struct winreg_SetValue *r) DEBUG(8,("_winreg_SetValue: Setting value for [%s:%s]\n", key->key->name, r->in.name.name)); - status = registry_pull_value(p->mem_ctx, &val, r->in.type, r->in.data, - r->in.size, r->in.size); - if (!W_ERROR_IS_OK(status)) { - return status; + val = talloc_zero(p->mem_ctx, struct registry_value); + if (val == NULL) { + return WERR_NOMEM; } + val->type = r->in.type; + val->data = data_blob_talloc(p->mem_ctx, r->in.data, r->in.size); + return reg_setvalue(key, r->in.name.name, val); } @@ -1060,16 +1049,11 @@ WERROR _winreg_QueryMultipleValues2(pipes_struct *p, for (i=0; i < r->in.num_values; i++) { const char *valuename = NULL; - DATA_BLOB blob = data_blob_null; - - if (vals[i].type != REG_NONE) { - err = registry_push_value(p->mem_ctx, &vals[i], &blob); - if (!W_ERROR_IS_OK(err)) { - return err; - } + if (vals[i].data.length > 0) { if (!data_blob_append(p->mem_ctx, &result, - blob.data, blob.length)) { + vals[i].data.data, + vals[i].data.length)) { return WERR_NOMEM; } } @@ -1081,7 +1065,7 @@ WERROR _winreg_QueryMultipleValues2(pipes_struct *p, err = construct_multiple_entry(r->out.values_out, valuename, - blob.length, + vals[i].data.length, offset, vals[i].type, &r->out.values_out[i]); @@ -1089,7 +1073,7 @@ WERROR _winreg_QueryMultipleValues2(pipes_struct *p, return err; } - offset += blob.length; + offset += vals[i].data.length; } *r->out.needed = result.length; -- cgit