r22062: Fix the parsing of info level 3. Flags is not a flags
authorJeremy Allison <jra@samba.org>
Tue, 3 Apr 2007 19:47:19 +0000 (19:47 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 17:19:07 +0000 (12:19 -0500)
field, but an offset. Fixed 64-bit display of ACLs on
printers.
Jeremy.
(This used to be commit 0c8949ff5d742dbe59f2af0f57a289f238e3592c)

source3/include/rpc_spoolss.h
source3/rpc_parse/parse_spoolss.c
source3/rpc_server/srv_spoolss_nt.c
source3/rpcclient/cmd_spoolss.c

index 069d2b3bf7497706818616e597a69dff8505c1d4..baa120445eb2ca553eb5eeddf9a0d95d067686d0 100755 (executable)
@@ -961,7 +961,6 @@ PRINTER_INFO_2;
 
 typedef struct printer_info_3
 {
-       uint32 flags;
        SEC_DESC *secdesc;
 }
 PRINTER_INFO_3;
index 44d35ec24b9861afc7d0f8c086b991eae7b79dbd..9c180d34739e618694e45186a8efddea7fe5a35e 100644 (file)
@@ -2388,6 +2388,7 @@ BOOL smb_io_printer_info_2(const char *desc, RPC_BUFFER *buffer, PRINTER_INFO_2
 
 BOOL smb_io_printer_info_3(const char *desc, RPC_BUFFER *buffer, PRINTER_INFO_3 *info, int depth)
 {
+       uint32 offset = 0;
        prs_struct *ps=&buffer->prs;
 
        prs_debug(ps, depth, desc, "smb_io_printer_info_3");
@@ -2395,8 +2396,41 @@ BOOL smb_io_printer_info_3(const char *desc, RPC_BUFFER *buffer, PRINTER_INFO_3
        
        buffer->struct_start=prs_offset(ps);
        
-       if (!prs_uint32("flags", ps, depth, &info->flags))
-               return False;
+       if (MARSHALLING(ps)) {
+               /* Ensure the SD is 8 byte aligned in the buffer. */
+               uint start = prs_offset(ps); /* Remember the start position. */
+               uint off_val = 0;
+
+               /* Write a dummy value. */
+               if (!prs_uint32("offset", ps, depth, &off_val))
+                       return False;
+
+               /* 8 byte align. */
+               if (!prs_align_uint64(ps))
+                       return False;
+
+               /* Remember where we must seek back to write the SD. */
+               offset = prs_offset(ps);
+
+               /* Calculate the real offset for the SD. */
+
+               off_val = offset - start;
+
+               /* Seek back to where we store the SD offset & store. */
+               prs_set_offset(ps, start);
+               if (!prs_uint32("offset", ps, depth, &off_val))
+                       return False;
+
+               /* Return to after the 8 byte align. */
+               prs_set_offset(ps, offset);
+
+       } else {
+               if (!prs_uint32("offset", ps, depth, &offset))
+                       return False;
+               /* Seek within the buffer. */
+               if (!prs_set_offset(ps, offset))
+                       return False;
+       }
        if (!sec_io_desc("sec_desc", &info->secdesc, ps, depth))
                return False;
 
@@ -3143,9 +3177,8 @@ return the size required by a struct in the stream
 
 uint32 spoolss_size_printer_info_3(PRINTER_INFO_3 *info)
 {
-       /* The 4 is for the self relative pointer.. */
-       /* JRA !!!! TESTME - WHAT ABOUT prs_align.... !!! */
-       return 4 + (uint32)sec_desc_size( info->secdesc );
+       /* The 8 is for the self relative pointer - 8 byte aligned.. */
+       return 8 + (uint32)sec_desc_size( info->secdesc );
 }
 
 /*******************************************************************
index b33fc6b5b052d1442c0b087b7ade590b29bb55d9..3e1c1a240865e215e5f4d76074e2bb1fa5c396b9 100644 (file)
@@ -4220,8 +4220,6 @@ static BOOL construct_printer_info_3(Printer_entry *print_hnd,
        
        /* These are the components of the SD we are returning. */
 
-       printer->flags = 0x4; 
-
        if (ntprinter->info_2->secdesc_buf && ntprinter->info_2->secdesc_buf->sd_size != 0) {
                /* don't use talloc_steal() here unless you do a deep steal of all 
                   the SEC_DESC members */
index fe165732486ab0412d319c03f8fa61e01a0542eb..e8561ea182f2dcaaccae8182dd91b17c6c5cef2b 100644 (file)
@@ -276,8 +276,6 @@ static void display_print_info_2(PRINTER_INFO_2 *i2)
 
 static void display_print_info_3(PRINTER_INFO_3 *i3)
 {
-       printf("\tflags:[0x%x]\n", i3->flags);
-
        display_sec_desc(i3->secdesc);
 
        printf("\n");
@@ -2578,7 +2576,7 @@ static BOOL compare_printer_secdesc( struct rpc_pipe_client *cli1, POLICY_HND *h
                goto done;
        }
        
-       if ( (ctr1.printers_3->flags != ctr1.printers_3->flags ) || !sec_desc_equal( sd1, sd2 ) ) {
+       if (!sec_desc_equal( sd1, sd2 ) ) {
                printf("Security Descriptors *not* equal!\n");
                result = False;
                goto done;