Fill in a REGVAL_BUFFER for the data given a REGISTRY_VALUE
*******************************************************************/
-static uint32 reg_init_regval_buffer( REGVAL_BUFFER *buf2, REGISTRY_VALUE *val )
+uint32 reg_init_regval_buffer( REGVAL_BUFFER *buf2, REGISTRY_VALUE *val )
{
uint32 real_size = 0;
{
q_o->server = TALLOC_P( get_talloc_ctx(), uint16);
+ if (!q_o->server) {
+ smb_panic("init_reg_q_open_hive: talloc fail.\n");
+ return;
+ }
*q_o->server = 0x1;
q_o->access = access_desired;
if(!prs_align(ps))
return False;
- if(!prs_pointer("server", ps, depth, (void**)&q_u->server, sizeof(uint16), (PRS_POINTER_CAST)prs_uint16))
+ if(!prs_pointer("server", ps, depth, (void*)&q_u->server, sizeof(uint16), (PRS_POINTER_CAST)prs_uint16))
return False;
if(!prs_align(ps))
Inits a registry key create request
********************************************************************/
-void init_reg_q_create_key(REG_Q_CREATE_KEY *q_c, POLICY_HND *hnd,
+void init_reg_q_create_key_ex(REG_Q_CREATE_KEY_EX *q_c, POLICY_HND *hnd,
char *name, char *key_class, uint32 access_desired,
SEC_DESC_BUF *sec_buf)
{
q_c->access = access_desired;
q_c->sec_info = TALLOC_P( get_talloc_ctx(), uint32 );
+ if (!q_c->sec_info) {
+ smb_panic("init_reg_q_create_key_ex: talloc fail\n");
+ return;
+ }
*q_c->sec_info = DACL_SECURITY_INFORMATION | SACL_SECURITY_INFORMATION;
q_c->data = sec_buf;
q_c->ptr2 = 1;
init_buf_hdr(&q_c->hdr_sec, sec_buf->len, sec_buf->len);
q_c->ptr3 = 1;
- q_c->unknown_2 = 0x00000000;
+ q_c->disposition = TALLOC_P( get_talloc_ctx(), uint32 );
+ if (!q_c->disposition) {
+ smb_panic("init_reg_q_create_key_ex: talloc fail\n");
+ return;
+ }
}
/*******************************************************************
Marshalls a registry key create request
********************************************************************/
-BOOL reg_io_q_create_key(const char *desc, REG_Q_CREATE_KEY *q_u,
+BOOL reg_io_q_create_key_ex(const char *desc, REG_Q_CREATE_KEY_EX *q_u,
prs_struct *ps, int depth)
{
if ( !q_u )
return False;
- prs_debug(ps, depth, desc, "reg_io_q_create_key");
+ prs_debug(ps, depth, desc, "reg_io_q_create_key_ex");
depth++;
if(!prs_align(ps))
if(!prs_align(ps))
return False;
- if(!prs_uint32("reserved", ps, depth, &q_u->reserved))
+ if(!prs_uint32("options", ps, depth, &q_u->options))
return False;
if(!prs_uint32("access", ps, depth, &q_u->access))
return False;
- if(!prs_pointer("sec_info", ps, depth, (void**)&q_u->sec_info, sizeof(uint32), (PRS_POINTER_CAST)prs_uint32))
+ if(!prs_pointer("sec_info", ps, depth, (void*)&q_u->sec_info, sizeof(uint32), (PRS_POINTER_CAST)prs_uint32))
return False;
- if(!prs_uint32("ptr2", ps, depth, &q_u->ptr2))
- return False;
- if(!reg_io_hdrbuf_sec(q_u->ptr2, &q_u->ptr3, &q_u->hdr_sec, q_u->data,
- ps, depth))
- return False;
+ if ( q_u->sec_info ) {
+ if(!prs_uint32("ptr2", ps, depth, &q_u->ptr2))
+ return False;
+ if(!reg_io_hdrbuf_sec(q_u->ptr2, &q_u->ptr3, &q_u->hdr_sec, q_u->data, ps, depth))
+ return False;
+ }
-#if 0
- if(!prs_uint32("unknown_2", ps, depth, &q_u->unknown_2))
+ if(!prs_pointer("disposition", ps, depth, (void*)&q_u->disposition, sizeof(uint32), (PRS_POINTER_CAST)prs_uint32))
return False;
-#endif
return True;
}
Unmarshalls a registry key create response
********************************************************************/
-BOOL reg_io_r_create_key(const char *desc, REG_R_CREATE_KEY *r_u,
+BOOL reg_io_r_create_key_ex(const char *desc, REG_R_CREATE_KEY_EX *r_u,
prs_struct *ps, int depth)
{
if ( !r_u )
return False;
- prs_debug(ps, depth, desc, "reg_io_r_create_key");
+ prs_debug(ps, depth, desc, "reg_io_r_create_key_ex");
depth++;
if(!prs_align(ps))
if(!smb_io_pol_hnd("", &r_u->handle, ps, depth))
return False;
- if(!prs_uint32("unknown", ps, depth, &r_u->unknown))
+ if(!prs_uint32("disposition", ps, depth, &r_u->disposition))
return False;
if(!prs_werror("status", ps, depth, &r_u->status))
if(!prs_unistr4("name", ps, depth, &q_u->name))
return False;
- if(!prs_align(ps))
- return False;
return True;
}
if(!prs_unistr4("key_class", ps, depth, &q_u->key_class))
return False;
- if(!prs_align(ps))
- return False;
-
return True;
}
return False;
r_u->type = TALLOC_P( get_talloc_ctx(), uint32 );
+ if (!r_u->type) {
+ return False;
+ }
*r_u->type = val->type;
buf_len = reg_init_regval_buffer( &buf2, val );
r_u->buf_max_len = TALLOC_P( get_talloc_ctx(), uint32 );
+ if (!r_u->buf_max_len) {
+ return False;
+ }
*r_u->buf_max_len = buf_len;
r_u->buf_len = TALLOC_P( get_talloc_ctx(), uint32 );
+ if (!r_u->buf_len) {
+ return False;
+ }
*r_u->buf_len = buf_len;
/* if include_keyval is not set, don't send the key value, just
if ( include_keyval ) {
r_u->value = TALLOC_P( get_talloc_ctx(), REGVAL_BUFFER );
+ if (!r_u->value) {
+ return False;
+ }
/* steal the memory */
*r_u->value = buf2;
}
if(!prs_align(ps))
return False;
- if ( !prs_pointer("type", ps, depth, (void**)&r_u->type, sizeof(uint32), (PRS_POINTER_CAST)prs_uint32))
+ if ( !prs_pointer("type", ps, depth, (void*)&r_u->type, sizeof(uint32), (PRS_POINTER_CAST)prs_uint32))
return False;
- if ( !prs_pointer("value", ps, depth, (void**)&r_u->value, sizeof(REGVAL_BUFFER), (PRS_POINTER_CAST)smb_io_regval_buffer))
+ if ( !prs_pointer("value", ps, depth, (void*)&r_u->value, sizeof(REGVAL_BUFFER), (PRS_POINTER_CAST)smb_io_regval_buffer))
return False;
if(!prs_align(ps))
return False;
- if ( !prs_pointer("buf_max_len", ps, depth, (void**)&r_u->buf_max_len, sizeof(uint32), (PRS_POINTER_CAST)prs_uint32))
+ if ( !prs_pointer("buf_max_len", ps, depth, (void*)&r_u->buf_max_len, sizeof(uint32), (PRS_POINTER_CAST)prs_uint32))
return False;
- if ( !prs_pointer("buf_len", ps, depth, (void**)&r_u->buf_len, sizeof(uint32), (PRS_POINTER_CAST)prs_uint32))
+ if ( !prs_pointer("buf_len", ps, depth, (void*)&r_u->buf_len, sizeof(uint32), (PRS_POINTER_CAST)prs_uint32))
return False;
if(!prs_werror("status", ps, depth, &r_u->status))
q_u->name.size = max_name_len*2;
q_u->name.string = TALLOC_ZERO_P( get_talloc_ctx(), UNISTR2 );
+ if (!q_u->name.string) {
+ smb_panic("init_reg_q_enum_val: talloc fail\n");
+ return;
+ }
q_u->name.string->uni_max_len = max_name_len;
q_u->type = TALLOC_P( get_talloc_ctx(), uint32 );
+ if (!q_u->type) {
+ smb_panic("init_reg_q_enum_val: talloc fail\n");
+ return;
+ }
*q_u->type = 0x0;
q_u->value = TALLOC_ZERO_P( get_talloc_ctx(), REGVAL_BUFFER );
+ if (!q_u->value) {
+ smb_panic("init_reg_q_enum_val: talloc fail\n");
+ return;
+ }
+
q_u->value->buf_max_len = max_buf_len;
- q_u->buffer_len = TALLOC_P( get_talloc_ctx(), uint32 );
+ q_u->buffer_len = TALLOC_P( get_talloc_ctx(), uint32 );
+ if (!q_u->buffer_len) {
+ smb_panic("init_reg_q_enum_val: talloc fail\n");
+ return;
+ }
*q_u->buffer_len = max_buf_len;
- q_u->name_len = TALLOC_P( get_talloc_ctx(), uint32 );
+ q_u->name_len = TALLOC_P( get_talloc_ctx(), uint32 );
+ if (!q_u->name_len) {
+ smb_panic("init_reg_q_enum_val: talloc fail\n");
+ return;
+ }
*q_u->name_len = 0x0;
}
/* type */
r_u->type = TALLOC_P( get_talloc_ctx(), uint32 );
+ if (!r_u->type) {
+ smb_panic("init_reg_r_enum_val: talloc fail\n");
+ return;
+ }
*r_u->type = val->type;
/* REG_SZ & REG_MULTI_SZ must be converted to UNICODE */
r_u->value = TALLOC_P( get_talloc_ctx(), REGVAL_BUFFER );
+ if (!r_u->value) {
+ smb_panic("init_reg_r_enum_val: talloc fail\n");
+ return;
+ }
real_size = reg_init_regval_buffer( r_u->value, val );
/* lengths */
- r_u->buffer_len1 = TALLOC_P( get_talloc_ctx(), uint32 );
+ r_u->buffer_len1 = TALLOC_P( get_talloc_ctx(), uint32 );
+ if (!r_u->buffer_len1) {
+ smb_panic("init_reg_r_enum_val: talloc fail\n");
+ return;
+ }
*r_u->buffer_len1 = real_size;
- r_u->buffer_len2 = TALLOC_P( get_talloc_ctx(), uint32 );
+ r_u->buffer_len2 = TALLOC_P( get_talloc_ctx(), uint32 );
+ if (!r_u->buffer_len2) {
+ smb_panic("init_reg_r_enum_val: talloc fail\n");
+ return;
+ }
*r_u->buffer_len2 = real_size;
}
if(!prs_align(ps))
return False;
- if(!prs_pointer("type", ps, depth, (void**)&q_u->type, sizeof(uint32), (PRS_POINTER_CAST)prs_uint32))
+ if(!prs_pointer("type", ps, depth, (void*)&q_u->type, sizeof(uint32), (PRS_POINTER_CAST)prs_uint32))
return False;
- if ( !prs_pointer("value", ps, depth, (void**)&q_u->value, sizeof(REGVAL_BUFFER), (PRS_POINTER_CAST)smb_io_regval_buffer))
+ if ( !prs_pointer("value", ps, depth, (void*)&q_u->value, sizeof(REGVAL_BUFFER), (PRS_POINTER_CAST)smb_io_regval_buffer))
return False;
if(!prs_align(ps))
return False;
- if(!prs_pointer("buffer_len", ps, depth, (void**)&q_u->buffer_len, sizeof(uint32), (PRS_POINTER_CAST)prs_uint32))
+ if(!prs_pointer("buffer_len", ps, depth, (void*)&q_u->buffer_len, sizeof(uint32), (PRS_POINTER_CAST)prs_uint32))
return False;
- if(!prs_pointer("name_len", ps, depth, (void**)&q_u->name_len, sizeof(uint32), (PRS_POINTER_CAST)prs_uint32))
+ if(!prs_pointer("name_len", ps, depth, (void*)&q_u->name_len, sizeof(uint32), (PRS_POINTER_CAST)prs_uint32))
return False;
return True;
if(!prs_align(ps))
return False;
- if(!prs_pointer("type", ps, depth, (void**)&r_u->type, sizeof(uint32), (PRS_POINTER_CAST)prs_uint32))
+ if(!prs_pointer("type", ps, depth, (void*)&r_u->type, sizeof(uint32), (PRS_POINTER_CAST)prs_uint32))
return False;
- if ( !prs_pointer("value", ps, depth, (void**)&r_u->value, sizeof(REGVAL_BUFFER), (PRS_POINTER_CAST)smb_io_regval_buffer))
+ if ( !prs_pointer("value", ps, depth, (void*)&r_u->value, sizeof(REGVAL_BUFFER), (PRS_POINTER_CAST)smb_io_regval_buffer))
return False;
if(!prs_align(ps))
return False;
- if(!prs_pointer("buffer_len1", ps, depth, (void**)&r_u->buffer_len1, sizeof(uint32), (PRS_POINTER_CAST)prs_uint32))
+ if(!prs_pointer("buffer_len1", ps, depth, (void*)&r_u->buffer_len1, sizeof(uint32), (PRS_POINTER_CAST)prs_uint32))
return False;
- if(!prs_pointer("buffer_len2", ps, depth, (void**)&r_u->buffer_len2, sizeof(uint32), (PRS_POINTER_CAST)prs_uint32))
+ if(!prs_pointer("buffer_len2", ps, depth, (void*)&r_u->buffer_len2, sizeof(uint32), (PRS_POINTER_CAST)prs_uint32))
return False;
if(!prs_werror("status", ps, depth, &r_u->status))
if ( !r_u )
return;
- init_unistr4( &r_u->keyname, subkey, STR_TERMINATE );
+ init_unistr4( &r_u->keyname, subkey, UNI_STR_TERMINATE );
r_u->classname = TALLOC_ZERO_P( get_talloc_ctx(), UNISTR4 );
- r_u->time = TALLOC_ZERO_P( get_talloc_ctx(), NTTIME );
+ if (!r_u->classname) {
+ smb_panic("init_reg_r_enum_key: talloc fail\n");
+ return;
+ }
+ r_u->time = TALLOC_ZERO_P( get_talloc_ctx(), NTTIME );
+ if (!r_u->time) {
+ smb_panic("init_reg_r_enum_key: talloc fail\n");
+ return;
+ }
}
/*******************************************************************
if(!prs_align(ps))
return False;
- if (!prs_pointer("class", ps, depth, (void**)&q_u->classname, sizeof(UNISTR4), (PRS_POINTER_CAST)prs_unistr4))
+ if (!prs_pointer("class", ps, depth, (void*)&q_u->classname, sizeof(UNISTR4), (PRS_POINTER_CAST)prs_unistr4))
return False;
if(!prs_align(ps))
return False;
- if (!prs_pointer("time", ps, depth, (void**)&q_u->time, sizeof(NTTIME), (PRS_POINTER_CAST)smb_io_nttime))
+ if (!prs_pointer("time", ps, depth, (void*)&q_u->time, sizeof(NTTIME), (PRS_POINTER_CAST)smb_io_nttime))
return False;
if(!prs_align(ps))
uint32 timeout, BOOL do_reboot, BOOL force)
{
q_u->server = TALLOC_P( get_talloc_ctx(), uint16 );
+ if (!q_u->server) {
+ smb_panic("init_reg_q_shutdown: talloc fail\n");
+ return;
+ }
*q_u->server = 0x1;
- q_u->message = TALLOC_P( get_talloc_ctx(), UNISTR4 );
- init_unistr4( q_u->message, msg, UNI_FLAGS_NONE );
+ q_u->message = TALLOC_ZERO_P( get_talloc_ctx(), UNISTR4 );
+ if (!q_u->message) {
+ smb_panic("init_reg_q_shutdown: talloc fail\n");
+ return;
+ }
+
+ if ( msg && *msg ) {
+ init_unistr4( q_u->message, msg, UNI_FLAGS_NONE );
+
+ /* Win2000 is apparently very sensitive to these lengths */
+ /* do a special case here */
+
+ q_u->message->string->uni_max_len++;
+ q_u->message->size += 2;
+
+ }
q_u->timeout = timeout;
if (!prs_align(ps))
return False;
- if (!prs_pointer("server", ps, depth, (void**)&q_u->server, sizeof(uint16), (PRS_POINTER_CAST)prs_uint16))
+ if (!prs_pointer("server", ps, depth, (void*)&q_u->server, sizeof(uint16), (PRS_POINTER_CAST)prs_uint16))
+ return False;
+ if (!prs_align(ps))
return False;
- if (!prs_pointer("message", ps, depth, (void**)&q_u->message, sizeof(UNISTR4), (PRS_POINTER_CAST)prs_unistr4))
+ if (!prs_pointer("message", ps, depth, (void*)&q_u->message, sizeof(UNISTR4), (PRS_POINTER_CAST)prs_unistr4))
return False;
if (!prs_align(ps))
if (!prs_align(ps))
return False;
- if (!prs_pointer("server", ps, depth, (void**)&q_u->server, sizeof(uint16), (PRS_POINTER_CAST)prs_uint16))
+ if (!prs_pointer("server", ps, depth, (void*)&q_u->server, sizeof(uint16), (PRS_POINTER_CAST)prs_uint16))
+ return False;
+ if (!prs_align(ps))
return False;
- if (!prs_pointer("message", ps, depth, (void**)&q_u->message, sizeof(UNISTR4), (PRS_POINTER_CAST)prs_unistr4))
+ if (!prs_pointer("message", ps, depth, (void*)&q_u->message, sizeof(UNISTR4), (PRS_POINTER_CAST)prs_unistr4))
return False;
if (!prs_align(ps))
return True;
}
-
-
/*******************************************************************
Inits a structure.
********************************************************************/
+
void init_reg_q_abort_shutdown(REG_Q_ABORT_SHUTDOWN *q_u)
{
q_u->server = TALLOC_P( get_talloc_ctx(), uint16 );
+ if (!q_u->server) {
+ smb_panic("init_reg_q_abort_shutdown: talloc fail\n");
+ return;
+ }
*q_u->server = 0x1;
}
/*******************************************************************
reads or writes a structure.
********************************************************************/
+
BOOL reg_io_q_abort_shutdown(const char *desc, REG_Q_ABORT_SHUTDOWN *q_u,
prs_struct *ps, int depth)
{
if (!prs_align(ps))
return False;
- if (!prs_pointer("server", ps, depth, (void**)&q_u->server, sizeof(uint16), (PRS_POINTER_CAST)prs_uint16))
+ if (!prs_pointer("server", ps, depth, (void*)&q_u->server, sizeof(uint16), (PRS_POINTER_CAST)prs_uint16))
+ return False;
+ if (!prs_align(ps))
return False;
return True;