r16945: Sync trunk -> 3.0 for 3.0.24 code. Still need
[vlendec/samba-autobuild/.git] / source3 / rpc_parse / parse_reg.c
index 190f39eb79a5329adccc6c20985a2a9674696646..1820a595eda589938aa34ae8739dd794f2e999e7 100644 (file)
@@ -33,7 +33,7 @@
  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;
        
@@ -54,6 +54,10 @@ void init_reg_q_open_hive( REG_Q_OPEN_HIVE *q_o, uint32 access_desired )
 {
        
        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;
@@ -72,7 +76,7 @@ BOOL reg_io_q_open_hive(const char *desc, REG_Q_OPEN_HIVE *q_u,
        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))
@@ -206,7 +210,7 @@ static BOOL reg_io_hdrbuf_sec(uint32 ptr, uint32 *ptr3, BUFHDR *hdr_sec,
  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)
 {
@@ -221,26 +225,34 @@ void init_reg_q_create_key(REG_Q_CREATE_KEY *q_c, POLICY_HND *hnd,
        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))
@@ -259,24 +271,23 @@ BOOL reg_io_q_create_key(const char *desc,  REG_Q_CREATE_KEY *q_u,
        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;
 }
@@ -285,13 +296,13 @@ BOOL reg_io_q_create_key(const char *desc,  REG_Q_CREATE_KEY *q_u,
 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))
@@ -299,7 +310,7 @@ BOOL reg_io_r_create_key(const char *desc,  REG_R_CREATE_KEY *r_u,
        
        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))
@@ -343,8 +354,6 @@ BOOL reg_io_q_delete_value(const char *desc, REG_Q_DELETE_VALUE *q_u,
 
        if(!prs_unistr4("name", ps, depth, &q_u->name))
                return False;
-       if(!prs_align(ps))
-               return False;
 
        return True;
 }
@@ -464,9 +473,6 @@ BOOL reg_io_q_query_key(const char *desc,  REG_Q_QUERY_KEY *q_u, prs_struct *ps,
        if(!prs_unistr4("key_class", ps, depth, &q_u->key_class))
                return False;
 
-       if(!prs_align(ps))
-               return False;
-
        return True;
 }
 
@@ -1003,14 +1009,23 @@ BOOL init_reg_r_query_value(uint32 include_keyval, REG_R_QUERY_VALUE *r_u,
                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
@@ -1018,6 +1033,9 @@ BOOL init_reg_r_query_value(uint32 include_keyval, REG_R_QUERY_VALUE *r_u,
 
        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;
        }
@@ -1042,17 +1060,17 @@ BOOL reg_io_r_query_value(const char *desc, REG_R_QUERY_VALUE *r_u, prs_struct *
        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))
@@ -1077,18 +1095,39 @@ void init_reg_q_enum_val(REG_Q_ENUM_VALUE *q_u, POLICY_HND *pol,
 
        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;
 }
 
@@ -1111,18 +1150,34 @@ void init_reg_r_enum_val(REG_R_ENUM_VALUE *r_u, REGISTRY_VALUE *val )
        /* 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;
 }
 
@@ -1152,17 +1207,17 @@ BOOL reg_io_q_enum_val(const char *desc,  REG_Q_ENUM_VALUE *q_u, prs_struct *ps,
        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;
@@ -1188,17 +1243,17 @@ BOOL reg_io_r_enum_val(const char *desc,  REG_R_ENUM_VALUE *r_u, prs_struct *ps,
        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))
@@ -1316,9 +1371,17 @@ void init_reg_r_enum_key(REG_R_ENUM_KEY *r_u, char *subkey )
        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;
+       }
 }
 
 /*******************************************************************
@@ -1394,12 +1457,12 @@ BOOL reg_io_r_enum_key(const char *desc,  REG_R_ENUM_KEY *q_u, prs_struct *ps, i
        
        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))
@@ -1488,10 +1551,28 @@ void init_reg_q_shutdown(REG_Q_SHUTDOWN *q_u, const char *msg,
                        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;
 
@@ -1539,10 +1620,12 @@ BOOL reg_io_q_shutdown(const char *desc, REG_Q_SHUTDOWN *q_u, prs_struct *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))
@@ -1597,10 +1680,12 @@ BOOL reg_io_q_shutdown_ex(const char *desc, REG_Q_SHUTDOWN_EX *q_u, prs_struct *
        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))
@@ -1644,20 +1729,24 @@ BOOL reg_io_r_shutdown_ex(const char *desc, REG_R_SHUTDOWN_EX *r_u, prs_struct *
        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)
 {
@@ -1670,7 +1759,9 @@ BOOL reg_io_q_abort_shutdown(const char *desc, REG_Q_ABORT_SHUTDOWN *q_u,
        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;