Added Shirish's reg changes to HEAD. Sync up with 2.2.0 backport.
authorJeremy Allison <jra@samba.org>
Mon, 15 May 2000 20:53:08 +0000 (20:53 +0000)
committerJeremy Allison <jra@samba.org>
Mon, 15 May 2000 20:53:08 +0000 (20:53 +0000)
Also added prs_xx error return checks to new code in rpc_parse/parse_reg.c
Jeremy.
(This used to be commit a148cb996297ed34342660f82ef0e66773d40500)

source3/include/proto.h
source3/include/rpc_reg.h
source3/rpc_parse/parse_reg.c
source3/rpc_server/srv_reg.c

index 0cc0546b883cf0817558d16f93a9ac7b3ef8e617..b19d3d8f5ceb45038a7ee30418d91a28d75e90c7 100644 (file)
@@ -2071,7 +2071,7 @@ BOOL net_io_r_sam_logoff(char *desc, NET_R_SAM_LOGOFF *r_l, prs_struct *ps, int
 
 /*The following definitions come from  rpc_parse/parse_prs.c  */
 
-void prs_dump(char *name, int level, prs_struct *ps);
+void prs_dump(char *name, int v, prs_struct *ps);
 void prs_debug(prs_struct *ps, int depth, char *desc, char *fn_name);
 BOOL prs_init(prs_struct *ps, uint32 size, uint8 align, BOOL io);
 BOOL prs_read(prs_struct *ps, int fd, size_t len, int timeout);
@@ -2154,13 +2154,10 @@ void init_reg_q_get_key_sec(REG_Q_GET_KEY_SEC *q_i, POLICY_HND *pol,
                                uint32 sec_buf_size, SEC_DESC_BUF *psdb);
 BOOL reg_io_q_get_key_sec(char *desc,  REG_Q_GET_KEY_SEC *r_q, prs_struct *ps, int depth);
 BOOL reg_io_r_get_key_sec(char *desc,  REG_R_GET_KEY_SEC *r_q, prs_struct *ps, int depth);
-void init_reg_q_info(REG_Q_INFO *q_i, POLICY_HND *pol, char *product_type,
-                               time_t unix_time, uint8 major, uint8 minor);
+BOOL init_reg_q_info(REG_Q_INFO *q_i, POLICY_HND *pol, char* val_name);
 BOOL reg_io_q_info(char *desc,  REG_Q_INFO *r_q, prs_struct *ps, int depth);
-void init_reg_r_info(REG_R_INFO *r_r,
-                               uint32 level, char *os_type,
-                               uint32 unknown_0, uint32 unknown_1,
-                               uint32 status);
+BOOL init_reg_r_info(uint32 include_keyval, REG_R_INFO *r_r,
+                    BUFFER2* buf, uint32 type, uint32 status);
 BOOL reg_io_r_info(char *desc, REG_R_INFO *r_r, prs_struct *ps, int depth);
 void init_reg_q_enum_val(REG_Q_ENUM_VALUE *q_i, POLICY_HND *pol,
                                uint32 val_idx, uint32 max_val_len,
@@ -2725,6 +2722,8 @@ BOOL api_netlog_rpc(pipes_struct *p, prs_struct *data);
 BOOL create_next_pdu(pipes_struct *p);
 BOOL api_pipe_bind_auth_resp(pipes_struct *p, prs_struct *rpc_in_p);
 BOOL setup_fault_pdu(pipes_struct *p);
+BOOL check_bind_req(char* pipe_name, RPC_IFACE* abstract,
+                                       RPC_IFACE* transfer);
 BOOL api_pipe_bind_req(pipes_struct *p, prs_struct *rpc_in_p);
 BOOL api_pipe_auth_process(pipes_struct *p, prs_struct *rpc_in);
 BOOL api_pipe_request(pipes_struct *p);
index 776605258884e379efb485ddb0b2e27dfb7e77d5..103a7492cd0b5c16d8a48b52caa54e0a79bc6da1 100644 (file)
@@ -396,43 +396,43 @@ typedef struct r_reg_enum_key_info
 /* REG_Q_INFO */
 typedef struct q_reg_info_info
 {
-       POLICY_HND pol;        /* policy handle */
+  POLICY_HND pol;        /* policy handle */
 
-       UNIHDR  hdr_type;       /* unicode product type header */
-       UNISTR2 uni_type;       /* unicode product type - "ProductType" */
+  UNIHDR  hdr_type;       /* unicode product type header */
+  UNISTR2 uni_type;       /* unicode product type - "ProductType" */
 
-       uint32 ptr1;            /* pointer */
-       NTTIME time;            /* current time? */
-       uint8  major_version1;  /* 0x4 - os major version? */
-       uint8  minor_version1;  /* 0x1 - os minor version? */
-       uint8  pad1[10];        /* padding - zeros */
+  uint32 ptr_reserved;    
+  
+  uint32 ptr_buf;         /* the next three fields follow if ptr_buf != 0 */
+  uint32 ptr_bufsize;
+  uint32 bufsize;
+  uint32 buf_unk;
 
-       uint32 ptr2;            /* pointer */
-       uint8  major_version2;  /* 0x4 - os major version? */
-       uint8  minor_version2;  /* 0x1 - os minor version? */
-       uint8  pad2[2];         /* padding - zeros */
-
-       uint32 ptr3;            /* pointer */
-       uint32 unknown;         /* 0x0000 0000 */
+  uint32 unk1;
+  uint32 ptr_buflen;
+  uint32 buflen;
+  
+  uint32 ptr_buflen2;
+  uint32 buflen2;
 
 } REG_Q_INFO;
 
 /* REG_R_INFO */
 typedef struct r_reg_info_info
 { 
-       uint32 ptr1;            /* buffer pointer */
-       uint32 level;          /* 0x1 - info level? */
+  uint32 ptr_type;            /* keyvalue  pointer */
+  uint32 type;          /*  keyvalue datatype  */
 
-       uint32 ptr_type;       /* pointer to o/s type */
-       BUFFER2 uni_type;      /* unicode string o/s type - "LanmanNT" */
+  uint32 ptr_uni_val;       /* pointer to o/s type */
+  BUFFER2 *uni_val;      /* unicode string o/s type - "LanmanNT" */
 
-       uint32 ptr2;           /* pointer to unknown_0 */
-       uint32 unknown_0;      /* 0x12 */
+  uint32 ptr_max_len;    /* pointer to unknown_0 */
+  uint32 buf_max_len;    /* 0x12 */
 
-       uint32 ptr3;           /* pointer to unknown_1 */
-       uint32 unknown_1;      /* 0x12 */
+  uint32 ptr_len;    /* pointer to unknown_1 */
+  uint32 buf_len;        /* 0x12 */
 
-       uint32 status;         /* return status */
+  uint32 status;         /* return status */
 
 } REG_R_INFO;
 
index cc970e41500120b4075b9964b4a91a05cf173217..e757245f7c3c86cb0e8222322d1e6579955f74a3 100644 (file)
@@ -868,29 +868,33 @@ BOOL reg_io_r_get_key_sec(char *desc,  REG_R_GET_KEY_SEC *r_q, prs_struct *ps, i
 makes a structure.
 ********************************************************************/
 
-void init_reg_q_info(REG_Q_INFO *q_i, POLICY_HND *pol, char *product_type,
-                               time_t unix_time, uint8 major, uint8 minor)
+BOOL init_reg_q_info(REG_Q_INFO *q_i, POLICY_HND *pol, char* val_name)
 {
-       int len_type  = strlen(product_type);
+        int len_type = val_name != NULL ? strlen(val_name) + 1 : 0;
 
-       memcpy(&q_i->pol, pol, sizeof(q_i->pol));
+        if (q_i == NULL)
+                return False;
 
-       init_uni_hdr(&q_i->hdr_type, len_type);
-       init_unistr2(&q_i->uni_type, product_type, len_type);
+        q_i->pol = *pol;
 
-       q_i->ptr1 = 1;
-       unix_to_nt_time(&q_i->time, unix_time);
-       q_i->major_version1 = major;
-       q_i->minor_version1 = minor;
-       memset(q_i->pad1, 0, sizeof(q_i->pad1));
+        init_uni_hdr(&(q_i->hdr_type), len_type);
+        init_unistr2(&(q_i->uni_type), val_name, len_type);
 
-       q_i->ptr2 = 1;
-       q_i->major_version2 = major;
-       q_i->minor_version2 = minor;
-       memset(q_i->pad2, 0, sizeof(q_i->pad2));
+        q_i->ptr_reserved = 1;
+        q_i->ptr_buf = 1;
 
-       q_i->ptr3 = 1;
-       q_i->unknown = 0x00000000;
+        q_i->ptr_bufsize = 1;
+        q_i->bufsize = 0;
+        q_i->buf_unk = 0;
+
+        q_i->unk1 = 0;
+        q_i->ptr_buflen = 1;
+        q_i->buflen = 0;
+
+        q_i->ptr_buflen2 = 1;
+        q_i->buflen2 = 0;
+
+        return True;
 }
 
 /*******************************************************************
@@ -918,68 +922,66 @@ BOOL reg_io_q_info(char *desc,  REG_Q_INFO *r_q, prs_struct *ps, int depth)
        if(!prs_align(ps))
                return False;
        
-       if(!prs_uint32("ptr1", ps, depth, &r_q->ptr1))
+       if(!prs_uint32("ptr_reserved", ps, depth, &(r_q->ptr_reserved)))
                return False;
 
-       if (r_q->ptr1 != 0) {
-               if(!smb_io_time("", &r_q->time, ps, depth))
-                       return False;
-               if(!prs_uint8 ("major_version1", ps, depth, &r_q->major_version1))
-                       return False;
-               if(!prs_uint8 ("minor_version1", ps, depth, &r_q->minor_version1))
-                       return False;
-               if(!prs_uint8s(False, "pad1", ps, depth, r_q->pad1, sizeof(r_q->pad1)))
-                       return False;
-       }
-
-       if(!prs_uint32("ptr2", ps, depth, &r_q->ptr2))
+       if(!prs_uint32("ptr_buf", ps, depth, &(r_q->ptr_buf)))
                return False;
 
-       if (r_q->ptr2 != 0) {
-               if(!prs_uint8 ("major_version2", ps, depth, &r_q->major_version2))
+       if(r_q->ptr_buf) {
+               if(!prs_uint32("ptr_bufsize", ps, depth, &(r_q->ptr_bufsize)))
                        return False;
-               if(!prs_uint8 ("minor_version2", ps, depth, &r_q->minor_version2))
+               if(!prs_uint32("bufsize", ps, depth, &(r_q->bufsize)))
                        return False;
-               if(!prs_uint8s(False, "pad2", ps, depth, r_q->pad2, sizeof(r_q->pad2)))
+               if(!prs_uint32("buf_unk", ps, depth, &(r_q->buf_unk)))
                        return False;
        }
 
-       if(!prs_uint32("ptr3", ps, depth, &r_q->ptr3))
+       if(!prs_uint32("unk1", ps, depth, &(r_q->unk1)))
                return False;
 
-       if (r_q->ptr3 != 0) {
-               if(!prs_uint32("unknown", ps, depth, &r_q->unknown))
-                       return False;
-       }
+       if(!prs_uint32("ptr_buflen", ps, depth, &(r_q->ptr_buflen)))
+               return False;
+       if(!prs_uint32("buflen", ps, depth, &(r_q->buflen)))
+               return False;
 
-       return True;
+       if(!prs_uint32("ptr_buflen2", ps, depth, &(r_q->ptr_buflen2)))
+               return False;
+       if(!prs_uint32("buflen2", ps, depth, &(r_q->buflen2)))
+               return False;
+
+       return True;
 }
 
 /*******************************************************************
  Inits a structure.
 ********************************************************************/
 
-void init_reg_r_info(REG_R_INFO *r_r,
-                               uint32 level, char *os_type,
-                               uint32 unknown_0, uint32 unknown_1,
-                               uint32 status)
+BOOL init_reg_r_info(uint32 include_keyval, REG_R_INFO *r_r,
+                    BUFFER2* buf, uint32 type, uint32 status)
 {
-       uint8 buf[512];
-       int len = dos_struni2((char *)buf, os_type, sizeof(buf));
+  if(r_r == NULL)
+    return False;
 
-       r_r->ptr1 = 1;
-       r_r->level = level;
+  
+  r_r->ptr_type = 1;
+  r_r->type = type;
 
-       r_r->ptr_type = 1;
-       init_buffer2(&r_r->uni_type, buf, len*2);
+  /* if include_keyval is not set, don't send the key value, just
+     the buflen data. probably used by NT5 to allocate buffer space - SK */
+  r_r->ptr_uni_val = include_keyval ? 1:0;
+  r_r->uni_val = buf;
 
-       r_r->ptr2 = 1;
-       r_r->unknown_0 = unknown_0;
+  r_r->ptr_max_len = 1;
+  r_r->buf_max_len = r_r->uni_val->buf_max_len;
 
-       r_r->ptr3 = 1;
-       r_r->unknown_1 = unknown_1;
+  r_r->ptr_len = 1;
+  r_r->buf_len = r_r->uni_val->buf_len;
 
-       r_r->status = status;
+  r_r->status = status;
+
+  return True;
+  
 }
 
 /*******************************************************************
@@ -997,41 +999,44 @@ BOOL reg_io_r_info(char *desc, REG_R_INFO *r_r, prs_struct *ps, int depth)
        if(!prs_align(ps))
                return False;
        
-       if(!prs_uint32("ptr1", ps, depth, &r_r->ptr1))
+       if(!prs_uint32("ptr_type", ps, depth, &(r_r->ptr_type)))
                return False;
 
-       if (r_r->ptr1 != 0) {
-               if(!prs_uint32("level", ps, depth, &r_r->level))
-                       return False;
-               if(!prs_uint32("ptr_type", ps, depth, &r_r->ptr_type))
+       if (r_r->ptr_type != 0) {
+               if(!prs_uint32("type", ps, depth, &r_r->type))
                        return False;
+       }
 
-               if(!smb_io_buffer2("uni_type", &r_r->uni_type, r_r->ptr_type, ps, depth))
-                       return False;
-               if(!prs_align(ps))
-                       return False;
+       if(!prs_uint32("ptr_uni_val", ps, depth, &(r_r->ptr_uni_val)))
+               return False;
 
-               if(!prs_uint32("ptr2", ps, depth, &r_r->ptr2))
+       if(r_r->ptr_uni_val != 0) {
+               if(!smb_io_buffer2("uni_val", r_r->uni_val, r_r->ptr_uni_val, ps, depth))
                        return False;
+       }
 
-               if (r_r->ptr2 != 0) {
-                       if(!prs_uint32("unknown_0", ps, depth, &r_r->unknown_0))
-                               return False;
-               }
+       if(!prs_align(ps))
+               return False;
 
-               if(!prs_uint32("ptr3", ps, depth, &r_r->ptr3))
-                       return False;
+       if(!prs_uint32("ptr_max_len", ps, depth, &(r_r->ptr_max_len)))
+               return False;
 
-               if (r_r->ptr3 != 0) {
-                       if(!prs_uint32("unknown_1", ps, depth, &r_r->unknown_1))
-                               return False;
-               }
+       if (r_r->ptr_max_len != 0) {
+               if(!prs_uint32("buf_max_len", ps, depth, &(r_r->buf_max_len)))
+               return False;
+       }
 
+       if(!prs_uint32("ptr_len", ps, depth, &(r_r->ptr_len)))
+               return False;
+       if (r_r->ptr_len != 0) {
+               if(!prs_uint32("buf_len", ps, depth, &(r_r->buf_len)))
+                       return False;
        }
+
        if(!prs_uint32("status", ps, depth, &r_r->status))
                return False;
 
-       return True;
+       return True;
 }
 
 /*******************************************************************
index 6a8d803c2e0e85720958b1f858762e14d75b2c1c..cba24d7dfb21d722ea059b0c55235b039a44f953 100644 (file)
@@ -23,6 +23,7 @@
  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  */
 
+
 #include "includes.h"
 
 extern int DEBUGLEVEL;
@@ -59,7 +60,7 @@ static void reg_reply_close(REG_Q_CLOSE *q_r,
 /*******************************************************************
  api_reg_close
  ********************************************************************/
-static BOOL api_reg_close(prs_struct *data, prs_struct *rdata)
+static BOOL api_reg_close(prs_struct *data, prs_struct *rdata )
 {
        REG_Q_CLOSE q_r;
 
@@ -99,7 +100,7 @@ static void reg_reply_open(REG_Q_OPEN_HKLM *q_r,
 /*******************************************************************
  api_reg_open
  ********************************************************************/
-static BOOL api_reg_open(prs_struct *data, prs_struct *rdata)
+static BOOL api_reg_open(prs_struct *data, prs_struct *rdata )
 {
        REG_Q_OPEN_HKLM q_u;
 
@@ -164,7 +165,7 @@ static void reg_reply_open_entry(REG_Q_OPEN_ENTRY *q_u,
 /*******************************************************************
  api_reg_open_entry
  ********************************************************************/
-static BOOL api_reg_open_entry(prs_struct *data, prs_struct *rdata)
+static BOOL api_reg_open_entry(prs_struct *data, prs_struct *rdata )
 {
        REG_Q_OPEN_ENTRY q_u;
 
@@ -185,6 +186,11 @@ static void reg_reply_info(REG_Q_INFO *q_u,
                                prs_struct *rdata)
 {
        uint32 status     = 0;
+       fstring key = "ServerNT"; /* always a non-PDC */
+       uint32 type=0x1; /* key type: REG_SZ */
+
+       UNISTR2 uni_key;
+       BUFFER2 buf;
 
        REG_R_INFO r_u;
 
@@ -195,14 +201,13 @@ static void reg_reply_info(REG_Q_INFO *q_u,
                status = 0xC000000 | NT_STATUS_INVALID_HANDLE;
        }
 
-       if (status == 0)
-       {
-       }
-
        /* This makes the server look like a member server to clients */
        /* which tells clients that we have our own local user and    */
        /* group databases and helps with ACL support.                */
-       init_reg_r_info(&r_u, 1, "ServerNT", 0x12, 0x12, status);
+       init_unistr2(&uni_key, key, strlen(key)+1);
+       init_buffer2(&buf, (uint8*) uni_key.buffer, uni_key.uni_str_len*2);
+  
+       init_reg_r_info(q_u->ptr_buf, &r_u, &buf, type, status);
 
        /* store the response in the SMB stream */
        reg_io_r_info("", &r_u, rdata, 0);
@@ -213,7 +218,7 @@ static void reg_reply_info(REG_Q_INFO *q_u,
 /*******************************************************************
  api_reg_info
  ********************************************************************/
-static BOOL api_reg_info(prs_struct *data, prs_struct *rdata)
+static BOOL api_reg_info(prs_struct *data, prs_struct *rdata )
 {
        REG_Q_INFO q_u;
 
@@ -246,5 +251,4 @@ BOOL api_reg_rpc(pipes_struct *p, prs_struct *data)
 {
        return api_rpcTNP(p, "api_reg_rpc", api_reg_cmds, data);
 }
-
 #undef OLD_NTDOMAIN