r23758: Fix Coverity id 385
[ira/wip.git] / source3 / rpc_server / srv_spoolss_nt.c
index 16dec45318c8e05565a9a61579287611a5e6abfe..464ca36f3c0e9d7dba8942de772014cbd53e92d3 100644 (file)
@@ -166,7 +166,8 @@ static void srv_spoolss_replycloseprinter(int snum, POLICY_HND *handle)
                cli_shutdown( notify_cli_pipe->cli );
                notify_cli_pipe = NULL; /* The above call shuts downn the pipe also. */
 
-               message_deregister(MSG_PRINTER_NOTIFY2);
+               messaging_deregister(smbd_messaging_context(),
+                                    MSG_PRINTER_NOTIFY2, NULL);
 
                /* Tell the connections db we're no longer interested in
                 * printer notify messages. */
@@ -311,7 +312,8 @@ WERROR delete_printer_hook( NT_USER_TOKEN *token, const char *sharename )
                
        if ( (ret = smbrun(command, NULL)) == 0 ) {
                /* Tell everyone we updated smb.conf. */
-               message_send_all(conn_tdb_ctx(), MSG_SMB_CONF_UPDATED, NULL, 0, False, NULL);
+               message_send_all(smbd_messaging_context(),
+                                MSG_SMB_CONF_UPDATED, NULL, 0, NULL);
        }
                
        if ( is_print_op )
@@ -373,7 +375,8 @@ static WERROR delete_printer_handle(pipes_struct *p, POLICY_HND *hnd)
  Return the snum of a printer corresponding to an handle.
 ****************************************************************************/
 
-static BOOL get_printer_snum(pipes_struct *p, POLICY_HND *hnd, int *number)
+static BOOL get_printer_snum(pipes_struct *p, POLICY_HND *hnd, int *number,
+                            struct share_params **params)
 {
        Printer_entry *Printer = find_printer_index_by_hnd(p, hnd);
                
@@ -386,6 +389,13 @@ static BOOL get_printer_snum(pipes_struct *p, POLICY_HND *hnd, int *number)
                case SPLHND_PRINTER:            
                        DEBUG(4,("short name:%s\n", Printer->sharename));                       
                        *number = print_queue_snum(Printer->sharename);
+                       if ((*number != -1) && (params != NULL)) {
+                               *params = get_share_params(tmp_talloc_ctx(),
+                                                          Printer->sharename);
+                               if (*params == NULL) {
+                                       return False;
+                               }
+                       }
                        return (*number != -1);
                case SPLHND_SERVER:
                        return False;
@@ -715,15 +725,18 @@ static void notify_system_time(struct spoolss_notify_msg *msg,
        }
 
        data->notify_data.data.length = prs_offset(&ps);
-       data->notify_data.data.string = (uint16 *)
-               TALLOC(mem_ctx, prs_offset(&ps));
-       if (!data->notify_data.data.string) {
-               prs_mem_free(&ps);
-               return;
+       if (prs_offset(&ps)) {
+               data->notify_data.data.string = (uint16 *)
+                       TALLOC(mem_ctx, prs_offset(&ps));
+               if (!data->notify_data.data.string) {
+                       prs_mem_free(&ps);
+                       return;
+               }
+               prs_copy_all_data_out((char *)data->notify_data.data.string, &ps);
+       } else {
+               data->notify_data.data.string = NULL;
        }
 
-       prs_copy_all_data_out((char *)data->notify_data.data.string, &ps);
-
        prs_mem_free(&ps);
 }
 
@@ -1065,18 +1078,18 @@ static BOOL notify2_unpack_msg( SPOOLSS_NOTIFY_MSG *msg, struct timeval *tv, voi
 
        /* Unpack message */
 
-       offset += tdb_unpack((char *)buf + offset, len - offset, "f",
+       offset += tdb_unpack((uint8 *)buf + offset, len - offset, "f",
                             msg->printer);
        
-       offset += tdb_unpack((char *)buf + offset, len - offset, "ddddddd",
+       offset += tdb_unpack((uint8 *)buf + offset, len - offset, "ddddddd",
                                &tv_sec, &tv_usec,
                                &msg->type, &msg->field, &msg->id, &msg->len, &msg->flags);
 
        if (msg->len == 0)
-               tdb_unpack((char *)buf + offset, len - offset, "dd",
+               tdb_unpack((uint8 *)buf + offset, len - offset, "dd",
                           &msg->notify.value[0], &msg->notify.value[1]);
        else
-               tdb_unpack((char *)buf + offset, len - offset, "B", 
+               tdb_unpack((uint8 *)buf + offset, len - offset, "B", 
                           &msg->len, &msg->notify.data);
 
        DEBUG(3, ("notify2_unpack_msg: got NOTIFY2 message for printer %s, jobid %u type %d, field 0x%02x, flags 0x%04x\n",
@@ -1089,7 +1102,7 @@ static BOOL notify2_unpack_msg( SPOOLSS_NOTIFY_MSG *msg, struct timeval *tv, voi
                DEBUG(3, ("notify2_unpack_msg: value1 = %d, value2 = %d\n", msg->notify.value[0],
                          msg->notify.value[1]));
        else
-               dump_data(3, msg->notify.data, msg->len);
+               dump_data(3, (uint8 *)msg->notify.data, msg->len);
 
        return True;
 }
@@ -1098,18 +1111,21 @@ static BOOL notify2_unpack_msg( SPOOLSS_NOTIFY_MSG *msg, struct timeval *tv, voi
  Receive a notify2 message list
  ********************************************************************/
 
-static void receive_notify2_message_list(int msg_type, struct process_id src,
-                                        void *msg, size_t len)
+static void receive_notify2_message_list(struct messaging_context *msg,
+                                        void *private_data,
+                                        uint32_t msg_type,
+                                        struct server_id server_id,
+                                        DATA_BLOB *data)
 {
        size_t                  msg_count, i;
-       char                    *buf = (char *)msg;
+       char                    *buf = (char *)data->data;
        char                    *msg_ptr;
        size_t                  msg_len;
        SPOOLSS_NOTIFY_MSG      notify;
        SPOOLSS_NOTIFY_MSG_CTR  messages;
        int                     num_groups;
 
-       if (len < 4) {
+       if (data->length < 4) {
                DEBUG(0,("receive_notify2_message_list: bad message format (len < 4)!\n"));
                return;
        }
@@ -1139,7 +1155,7 @@ static void receive_notify2_message_list(int msg_type, struct process_id src,
        for ( i=0; i<msg_count; i++ ) {
                struct timeval msg_tv;
 
-               if (msg_ptr + 4 - buf > len) {
+               if (msg_ptr + 4 - buf > data->length) {
                        DEBUG(0,("receive_notify2_message_list: bad message format (len > buf_size) !\n"));
                        return;
                }
@@ -1147,7 +1163,7 @@ static void receive_notify2_message_list(int msg_type, struct process_id src,
                msg_len = IVAL(msg_ptr,0);
                msg_ptr += 4;
 
-               if (msg_ptr + msg_len - buf > len) {
+               if (msg_ptr + msg_len - buf > data->length) {
                        DEBUG(0,("receive_notify2_message_list: bad message format (bad len) !\n"));
                        return;
                }
@@ -1200,8 +1216,9 @@ static BOOL srv_spoolss_drv_upgrade_printer(char* drivername)
        DEBUG(10,("srv_spoolss_drv_upgrade_printer: Sending message about driver upgrade [%s]\n",
                drivername));
                
-       message_send_pid(pid_to_procid(sys_getpid()),
-                        MSG_PRINTER_DRVUPGRADE, drivername, len+1, False);
+       messaging_send_buf(smbd_messaging_context(), procid_self(),
+                          MSG_PRINTER_DRVUPGRADE,
+                          (uint8 *)drivername, len+1);
 
        return True;
 }
@@ -1211,14 +1228,19 @@ static BOOL srv_spoolss_drv_upgrade_printer(char* drivername)
  over all printers, upgrading ones as necessary 
  **********************************************************************/
  
-void do_drv_upgrade_printer(int msg_type, struct process_id src, void *buf, size_t len)
+void do_drv_upgrade_printer(struct messaging_context *msg,
+                           void *private_data,
+                           uint32_t msg_type,
+                           struct server_id server_id,
+                           DATA_BLOB *data)
 {
        fstring drivername;
        int snum;
        int n_services = lp_numservices();
+       size_t len;
        
-       len = MIN(len,sizeof(drivername)-1);
-       strncpy(drivername, (const char *)buf, len);
+       len = MIN(data->length,sizeof(drivername)-1);
+       strncpy(drivername, (const char *)data->data, len);
        
        DEBUG(10,("do_drv_upgrade_printer: Got message for new driver [%s]\n", drivername ));
 
@@ -1297,8 +1319,9 @@ static BOOL srv_spoolss_reset_printerdata(char* drivername)
        DEBUG(10,("srv_spoolss_reset_printerdata: Sending message about resetting printerdata [%s]\n",
                drivername));
                
-       message_send_pid(pid_to_procid(sys_getpid()),
-                        MSG_PRINTERDATA_INIT_RESET, drivername, len+1, False);
+       messaging_send_buf(smbd_messaging_context(), procid_self(),
+                          MSG_PRINTERDATA_INIT_RESET,
+                          (uint8 *)drivername, len+1);
 
        return True;
 }
@@ -1308,15 +1331,19 @@ static BOOL srv_spoolss_reset_printerdata(char* drivername)
  over all printers, resetting printer data as neessary 
  **********************************************************************/
  
-void reset_all_printerdata(int msg_type, struct process_id src,
-                          void *buf, size_t len)
+void reset_all_printerdata(struct messaging_context *msg,
+                          void *private_data,
+                          uint32_t msg_type,
+                          struct server_id server_id,
+                          DATA_BLOB *data)
 {
        fstring drivername;
        int snum;
        int n_services = lp_numservices();
+       size_t len;
        
-       len = MIN( len, sizeof(drivername)-1 );
-       strncpy( drivername, (const char *)buf, len );
+       len = MIN( data->length, sizeof(drivername)-1 );
+       strncpy( drivername, (const char *)data->data, len );
        
        DEBUG(10,("reset_all_printerdata: Got message for new driver [%s]\n", drivername ));
 
@@ -1406,11 +1433,15 @@ static DEVICEMODE* dup_devicemode(TALLOC_CTX *ctx, DEVICEMODE *devmode)
                        return NULL;
        }
 
-       d->dev_private = (uint8 *)TALLOC_MEMDUP(ctx, devmode->dev_private,
+       if (devmode->driverextra) {
+               d->dev_private = (uint8 *)TALLOC_MEMDUP(ctx, devmode->dev_private,
                                                devmode->driverextra);
-       if (!d->dev_private) {
-               return NULL;
-       }       
+               if (!d->dev_private) {
+                       return NULL;
+               }       
+       } else {
+               d->dev_private = NULL;
+       }
        return d;
 }
 
@@ -1626,7 +1657,7 @@ WERROR _spoolss_open_printer_ex( pipes_struct *p, SPOOL_Q_OPEN_PRINTER_EX *q_u,
                /* NT doesn't let us connect to a printer if the connecting user
                   doesn't have print permission.  */
 
-               if (!get_printer_snum(p, handle, &snum)) {
+               if (!get_printer_snum(p, handle, &snum, NULL)) {
                        close_printer_handle(p, handle);
                        return WERR_BADFID;
                }
@@ -1853,7 +1884,7 @@ static WERROR _spoolss_enddocprinter_internal(pipes_struct *p, POLICY_HND *handl
                return WERR_BADFID;
        }
        
-       if (!get_printer_snum(p, handle, &snum))
+       if (!get_printer_snum(p, handle, &snum, NULL))
                return WERR_BADFID;
 
        Printer->document_started=False;
@@ -2445,7 +2476,7 @@ WERROR _spoolss_getprinterdata(pipes_struct *p, SPOOL_Q_GETPRINTERDATA *q_u, SPO
                status = getprinterdata_printer_server( p->mem_ctx, value, type, data, needed, *out_size );
        else
        {
-               if ( !get_printer_snum(p,handle, &snum) ) {
+               if ( !get_printer_snum(p,handle, &snum, NULL) ) {
                        status = WERR_BADFID;
                        goto done;
                }
@@ -2485,9 +2516,8 @@ done:
                                if ( printer ) 
                                        free_a_printer( &printer, 2 );
                                return WERR_NOMEM;
-               } 
-               } 
-               else {
+                       } 
+               } else {
                        *data = NULL;
                }
        }
@@ -2589,7 +2619,9 @@ static BOOL srv_spoolss_replyopenprinter(int snum, const char *printer,
                if ( !spoolss_connect_to_client( &notify_cli_pipe, client_ip, unix_printer ))
                        return False;
                        
-               message_register(MSG_PRINTER_NOTIFY2, receive_notify2_message_list);
+               messaging_register(smbd_messaging_context(), NULL,
+                                  MSG_PRINTER_NOTIFY2,
+                                  receive_notify2_message_list);
                /* Tell the connections db we're now interested in printer
                 * notify messages. */
                register_message_flags( True, FLAG_MSG_PRINT_NOTIFY );
@@ -2663,7 +2695,7 @@ WERROR _spoolss_rffpcnex(pipes_struct *p, SPOOL_Q_RFFPCNEX *q_u, SPOOL_R_RFFPCNE
        if ( Printer->printer_type == SPLHND_SERVER)
                snum = -1;
        else if ( (Printer->printer_type == SPLHND_PRINTER) &&
-                       !get_printer_snum(p, handle, &snum) )
+                       !get_printer_snum(p, handle, &snum, NULL) )
                return WERR_BADFID;
                
        client_ip.s_addr = inet_addr(p->conn->client_address);
@@ -2694,14 +2726,17 @@ void spoolss_notify_server_name(int snum,
        len = rpcstr_push(temp, printer->info_2->servername, sizeof(temp)-2, STR_TERMINATE);
 
        data->notify_data.data.length = len;
-       data->notify_data.data.string = (uint16 *)TALLOC(mem_ctx, len);
-
-       if (!data->notify_data.data.string) {
-               data->notify_data.data.length = 0;
-               return;
-       }
+       if (len) {
+               data->notify_data.data.string = (uint16 *)TALLOC(mem_ctx, len);
+               if (!data->notify_data.data.string) {
+                       data->notify_data.data.length = 0;
+                       return;
+               }
        
-       memcpy(data->notify_data.data.string, temp, len);
+               memcpy(data->notify_data.data.string, temp, len);
+       } else {
+               data->notify_data.data.string = NULL;
+       }
 }
 
 /*******************************************************************
@@ -2729,14 +2764,16 @@ void spoolss_notify_printer_name(int snum,
        len = rpcstr_push(temp, p, sizeof(temp)-2, STR_TERMINATE);
 
        data->notify_data.data.length = len;
-       data->notify_data.data.string = (uint16 *)TALLOC(mem_ctx, len);
-       
-       if (!data->notify_data.data.string) {
-               data->notify_data.data.length = 0;
-               return;
+       if (len) {
+               data->notify_data.data.string = (uint16 *)TALLOC(mem_ctx, len);
+               if (!data->notify_data.data.string) {
+                       data->notify_data.data.length = 0;
+                       return;
+               }
+               memcpy(data->notify_data.data.string, temp, len);
+       } else {
+               data->notify_data.data.string = NULL;
        }
-       
-       memcpy(data->notify_data.data.string, temp, len);
 }
 
 /*******************************************************************
@@ -2755,14 +2792,17 @@ void spoolss_notify_share_name(int snum,
        len = rpcstr_push(temp, lp_servicename(snum), sizeof(temp)-2, STR_TERMINATE);
 
        data->notify_data.data.length = len;
-       data->notify_data.data.string = (uint16 *)TALLOC(mem_ctx, len);
-       
-       if (!data->notify_data.data.string) {
-               data->notify_data.data.length = 0;
-               return;
+       if (len) {
+               data->notify_data.data.string = (uint16 *)TALLOC(mem_ctx, len);
+               if (!data->notify_data.data.string) {
+                       data->notify_data.data.length = 0;
+                       return;
+               }
+               memcpy(data->notify_data.data.string, temp, len);
+       } else {
+               data->notify_data.data.string = NULL;
        }
        
-       memcpy(data->notify_data.data.string, temp, len);
 }
 
 /*******************************************************************
@@ -2783,14 +2823,18 @@ void spoolss_notify_port_name(int snum,
        len = rpcstr_push(temp, printer->info_2->portname, sizeof(temp)-2, STR_TERMINATE);
 
        data->notify_data.data.length = len;
-       data->notify_data.data.string = (uint16 *)TALLOC(mem_ctx, len);
+       if (len) {
+               data->notify_data.data.string = (uint16 *)TALLOC(mem_ctx, len);
        
-       if (!data->notify_data.data.string) {
-               data->notify_data.data.length = 0;
-               return;
-       }
+               if (!data->notify_data.data.string) {
+                       data->notify_data.data.length = 0;
+                       return;
+               }
        
-       memcpy(data->notify_data.data.string, temp, len);
+               memcpy(data->notify_data.data.string, temp, len);
+       } else {
+               data->notify_data.data.string = NULL;
+       }
 }
 
 /*******************************************************************
@@ -2810,14 +2854,18 @@ void spoolss_notify_driver_name(int snum,
        len = rpcstr_push(temp, printer->info_2->drivername, sizeof(temp)-2, STR_TERMINATE);
 
        data->notify_data.data.length = len;
-       data->notify_data.data.string = (uint16 *)TALLOC(mem_ctx, len);
+       if (len) {
+               data->notify_data.data.string = (uint16 *)TALLOC(mem_ctx, len);
        
-       if (!data->notify_data.data.string) {
-               data->notify_data.data.length = 0;
-               return;
-       }
+               if (!data->notify_data.data.string) {
+                       data->notify_data.data.length = 0;
+                       return;
+               }
        
-       memcpy(data->notify_data.data.string, temp, len);
+               memcpy(data->notify_data.data.string, temp, len);
+       } else {
+               data->notify_data.data.string = NULL;
+       }
 }
 
 /*******************************************************************
@@ -2839,14 +2887,18 @@ void spoolss_notify_comment(int snum,
                len = rpcstr_push(temp, printer->info_2->comment, sizeof(temp)-2, STR_TERMINATE);
 
        data->notify_data.data.length = len;
-       data->notify_data.data.string = (uint16 *)TALLOC(mem_ctx, len);
+       if (len) {
+               data->notify_data.data.string = (uint16 *)TALLOC(mem_ctx, len);
        
-       if (!data->notify_data.data.string) {
-               data->notify_data.data.length = 0;
-               return;
-       }
+               if (!data->notify_data.data.string) {
+                       data->notify_data.data.length = 0;
+                       return;
+               }
        
-       memcpy(data->notify_data.data.string, temp, len);
+               memcpy(data->notify_data.data.string, temp, len);
+       } else {
+               data->notify_data.data.string = NULL;
+       }
 }
 
 /*******************************************************************
@@ -2866,14 +2918,18 @@ void spoolss_notify_location(int snum,
        len = rpcstr_push(temp, printer->info_2->location,sizeof(temp)-2, STR_TERMINATE);
 
        data->notify_data.data.length = len;
-       data->notify_data.data.string = (uint16 *)TALLOC(mem_ctx, len);
+       if (len) {
+               data->notify_data.data.string = (uint16 *)TALLOC(mem_ctx, len);
        
-       if (!data->notify_data.data.string) {
-               data->notify_data.data.length = 0;
-               return;
-       }
+               if (!data->notify_data.data.string) {
+                       data->notify_data.data.length = 0;
+                       return;
+               }
        
-       memcpy(data->notify_data.data.string, temp, len);
+               memcpy(data->notify_data.data.string, temp, len);
+       } else {
+               data->notify_data.data.string = NULL;
+       }
 }
 
 /*******************************************************************
@@ -2887,6 +2943,9 @@ static void spoolss_notify_devmode(int snum,
                                   NT_PRINTER_INFO_LEVEL *printer,
                                   TALLOC_CTX *mem_ctx)
 {
+       /* for a dummy implementation we have to zero the fields */
+       data->notify_data.data.length = 0;
+       data->notify_data.data.string = NULL;
 }
 
 /*******************************************************************
@@ -2905,14 +2964,18 @@ void spoolss_notify_sepfile(int snum,
        len = rpcstr_push(temp, printer->info_2->sepfile, sizeof(temp)-2, STR_TERMINATE);
 
        data->notify_data.data.length = len;
-       data->notify_data.data.string = (uint16 *)TALLOC(mem_ctx, len);
+       if (len) {
+               data->notify_data.data.string = (uint16 *)TALLOC(mem_ctx, len);
        
-       if (!data->notify_data.data.string) {
-               data->notify_data.data.length = 0;
-               return;
-       }
+               if (!data->notify_data.data.string) {
+                       data->notify_data.data.length = 0;
+                       return;
+               }
        
-       memcpy(data->notify_data.data.string, temp, len);
+               memcpy(data->notify_data.data.string, temp, len);
+       } else {
+               data->notify_data.data.string = NULL;
+       }
 }
 
 /*******************************************************************
@@ -2932,14 +2995,18 @@ void spoolss_notify_print_processor(int snum,
        len = rpcstr_push(temp,  printer->info_2->printprocessor, sizeof(temp)-2, STR_TERMINATE);
 
        data->notify_data.data.length = len;
-       data->notify_data.data.string = (uint16 *)TALLOC(mem_ctx, len);
+       if (len) {
+               data->notify_data.data.string = (uint16 *)TALLOC(mem_ctx, len);
        
-       if (!data->notify_data.data.string) {
-               data->notify_data.data.length = 0;
-               return;
-       }
+               if (!data->notify_data.data.string) {
+                       data->notify_data.data.length = 0;
+                       return;
+               }
        
-       memcpy(data->notify_data.data.string, temp, len);
+               memcpy(data->notify_data.data.string, temp, len);
+       } else {
+               data->notify_data.data.string = NULL;
+       }
 }
 
 /*******************************************************************
@@ -2959,14 +3026,18 @@ void spoolss_notify_parameters(int snum,
        len = rpcstr_push(temp,  printer->info_2->parameters, sizeof(temp)-2, STR_TERMINATE);
 
        data->notify_data.data.length = len;
-       data->notify_data.data.string = (uint16 *)TALLOC(mem_ctx, len);
+       if (len) {
+               data->notify_data.data.string = (uint16 *)TALLOC(mem_ctx, len);
        
-       if (!data->notify_data.data.string) {
-               data->notify_data.data.length = 0;
-               return;
-       }
+               if (!data->notify_data.data.string) {
+                       data->notify_data.data.length = 0;
+                       return;
+               }
        
-       memcpy(data->notify_data.data.string, temp, len);
+               memcpy(data->notify_data.data.string, temp, len);
+       } else {
+               data->notify_data.data.string = NULL;
+       }
 }
 
 /*******************************************************************
@@ -2986,14 +3057,18 @@ void spoolss_notify_datatype(int snum,
        len = rpcstr_push(temp, printer->info_2->datatype, sizeof(pstring)-2, STR_TERMINATE);
 
        data->notify_data.data.length = len;
-       data->notify_data.data.string = (uint16 *)TALLOC(mem_ctx, len);
+       if (len) {
+               data->notify_data.data.string = (uint16 *)TALLOC(mem_ctx, len);
        
-       if (!data->notify_data.data.string) {
-               data->notify_data.data.length = 0;
-               return;
-       }
+               if (!data->notify_data.data.string) {
+                       data->notify_data.data.length = 0;
+                       return;
+               }
        
-       memcpy(data->notify_data.data.string, temp, len);
+               memcpy(data->notify_data.data.string, temp, len);
+       } else {
+               data->notify_data.data.string = NULL;
+       }
 }
 
 /*******************************************************************
@@ -3008,8 +3083,8 @@ static void spoolss_notify_security_desc(int snum,
                                         NT_PRINTER_INFO_LEVEL *printer,
                                         TALLOC_CTX *mem_ctx)
 {
-       data->notify_data.sd.size = printer->info_2->secdesc_buf->len;
-       data->notify_data.sd.desc = dup_sec_desc( mem_ctx, printer->info_2->secdesc_buf->sec ) ;
+       data->notify_data.sd.size = printer->info_2->secdesc_buf->sd_size;
+       data->notify_data.sd.desc = dup_sec_desc( mem_ctx, printer->info_2->secdesc_buf->sd ) ;
 }
 
 /*******************************************************************
@@ -3146,14 +3221,18 @@ static void spoolss_notify_username(int snum,
        len = rpcstr_push(temp, queue->fs_user, sizeof(temp)-2, STR_TERMINATE);
 
        data->notify_data.data.length = len;
-       data->notify_data.data.string = (uint16 *)TALLOC(mem_ctx, len);
+       if (len) {
+               data->notify_data.data.string = (uint16 *)TALLOC(mem_ctx, len);
        
-       if (!data->notify_data.data.string) {
-               data->notify_data.data.length = 0;
-               return;
-       }
+               if (!data->notify_data.data.string) {
+                       data->notify_data.data.length = 0;
+                       return;
+               }
        
-       memcpy(data->notify_data.data.string, temp, len);
+               memcpy(data->notify_data.data.string, temp, len);
+       } else {
+               data->notify_data.data.string = NULL;
+       }
 }
 
 /*******************************************************************
@@ -3186,14 +3265,18 @@ static void spoolss_notify_job_name(int snum,
        len = rpcstr_push(temp, queue->fs_file, sizeof(temp)-2, STR_TERMINATE);
 
        data->notify_data.data.length = len;
-       data->notify_data.data.string = (uint16 *)TALLOC(mem_ctx, len);
+       if (len) {
+               data->notify_data.data.string = (uint16 *)TALLOC(mem_ctx, len);
        
-       if (!data->notify_data.data.string) {
-               data->notify_data.data.length = 0;
-               return;
-       }
+               if (!data->notify_data.data.string) {
+                       data->notify_data.data.length = 0;
+                       return;
+               }
        
-       memcpy(data->notify_data.data.string, temp, len);
+               memcpy(data->notify_data.data.string, temp, len);
+       } else {
+               data->notify_data.data.string = NULL;
+       }
 }
 
 /*******************************************************************
@@ -3236,14 +3319,18 @@ static void spoolss_notify_job_status_string(int snum,
        len = rpcstr_push(temp, p, sizeof(temp) - 2, STR_TERMINATE);
 
        data->notify_data.data.length = len;
-       data->notify_data.data.string = (uint16 *)TALLOC(mem_ctx, len);
+       if (len) {
+               data->notify_data.data.string = (uint16 *)TALLOC(mem_ctx, len);
        
-       if (!data->notify_data.data.string) {
-               data->notify_data.data.length = 0;
-               return;
-       }
+               if (!data->notify_data.data.string) {
+                       data->notify_data.data.length = 0;
+                       return;
+               }
        
-       memcpy(data->notify_data.data.string, temp, len);
+               memcpy(data->notify_data.data.string, temp, len);
+       } else {
+               data->notify_data.data.string = NULL;
+       }
 }
 
 /*******************************************************************
@@ -3748,7 +3835,7 @@ static WERROR printer_notify_info(pipes_struct *p, POLICY_HND *hnd, SPOOL_NOTIFY
        if ( !option )
                return WERR_BADFID;
 
-       get_printer_snum(p, hnd, &snum);
+       get_printer_snum(p, hnd, &snum, NULL);
 
        for (i=0; i<option->count; i++) {
                option_type=&option->ctr.type[i];
@@ -3866,7 +3953,9 @@ done:
  * fill a printer_info_0 struct
  ********************************************************************/
 
-static BOOL construct_printer_info_0(Printer_entry *print_hnd, PRINTER_INFO_0 *printer, int snum)
+static BOOL construct_printer_info_0(Printer_entry *print_hnd,
+                                    PRINTER_INFO_0 *printer,
+                                    const struct share_params *params)
 {
        pstring chaine;
        int count;
@@ -3877,14 +3966,15 @@ static BOOL construct_printer_info_0(Printer_entry *print_hnd, PRINTER_INFO_0 *p
        time_t setuptime;
        print_status_struct status;
        
-       if (!W_ERROR_IS_OK(get_a_printer(print_hnd, &ntprinter, 2, lp_const_servicename(snum))))
+       if (!W_ERROR_IS_OK(get_a_printer(print_hnd, &ntprinter, 2,
+                                        lp_const_servicename(params->service))))
                return False;
 
-       count = print_queue_length(snum, &status);
+       count = print_queue_length(params->service, &status);
 
        /* check if we already have a counter for this printer */       
        for(session_counter = counter_list; session_counter; session_counter = session_counter->next) {
-               if (session_counter->snum == snum)
+               if (session_counter->snum == params->service)
                        break;
        }
 
@@ -3895,7 +3985,7 @@ static BOOL construct_printer_info_0(Printer_entry *print_hnd, PRINTER_INFO_0 *p
                        return False;
                }
                ZERO_STRUCTP(session_counter);
-               session_counter->snum=snum;
+               session_counter->snum=params->service;
                session_counter->counter=0;
                DLIST_ADD(counter_list, session_counter);
        }
@@ -3971,21 +4061,25 @@ static BOOL construct_printer_info_0(Printer_entry *print_hnd, PRINTER_INFO_0 *p
  * construct_printer_info_1
  * fill a printer_info_1 struct
  ********************************************************************/
-static BOOL construct_printer_info_1(Printer_entry *print_hnd, uint32 flags, PRINTER_INFO_1 *printer, int snum)
+static BOOL construct_printer_info_1(Printer_entry *print_hnd, uint32 flags,
+                                    PRINTER_INFO_1 *printer,
+                                    const struct share_params *params)
 {
        pstring chaine;
        pstring chaine2;
        NT_PRINTER_INFO_LEVEL *ntprinter = NULL;
 
-       if (!W_ERROR_IS_OK(get_a_printer(print_hnd, &ntprinter, 2, lp_const_servicename(snum))))
+       if (!W_ERROR_IS_OK(get_a_printer(print_hnd, &ntprinter, 2,
+                                        lp_const_servicename(params->service))))
                return False;
 
        printer->flags=flags;
 
        if (*ntprinter->info_2->comment == '\0') {
-               init_unistr(&printer->comment, lp_comment(snum));
+               init_unistr(&printer->comment, lp_comment(params->service));
                slprintf(chaine,sizeof(chaine)-1,"%s,%s,%s", ntprinter->info_2->printername,
-                       ntprinter->info_2->drivername, lp_comment(snum));
+                       ntprinter->info_2->drivername,
+                        lp_comment(params->service));
        }
        else {
                init_unistr(&printer->comment, ntprinter->info_2->comment); /* saved comment. */
@@ -4109,26 +4203,29 @@ done:
  * fill a printer_info_2 struct
  ********************************************************************/
 
-static BOOL construct_printer_info_2(Printer_entry *print_hnd, PRINTER_INFO_2 *printer, int snum)
+static BOOL construct_printer_info_2(Printer_entry *print_hnd,
+                                    PRINTER_INFO_2 *printer,
+                                    const struct share_params *params)
 {
        int count;
        NT_PRINTER_INFO_LEVEL *ntprinter = NULL;
 
        print_status_struct status;
 
-       if (!W_ERROR_IS_OK(get_a_printer(print_hnd, &ntprinter, 2, lp_const_servicename(snum))))
+       if (!W_ERROR_IS_OK(get_a_printer(print_hnd, &ntprinter, 2,
+                                        lp_const_servicename(params->service))))
                return False;
                
-       count = print_queue_length(snum, &status);
+       count = print_queue_length(params->service, &status);
 
        init_unistr(&printer->servername, ntprinter->info_2->servername); /* servername*/
        init_unistr(&printer->printername, ntprinter->info_2->printername);                             /* printername*/
-       init_unistr(&printer->sharename, lp_servicename(snum));                 /* sharename */
+       init_unistr(&printer->sharename, lp_servicename(params->service));                      /* sharename */
        init_unistr(&printer->portname, ntprinter->info_2->portname);                   /* port */      
        init_unistr(&printer->drivername, ntprinter->info_2->drivername);       /* drivername */
 
        if (*ntprinter->info_2->comment == '\0')
-               init_unistr(&printer->comment, lp_comment(snum));                       /* comment */   
+               init_unistr(&printer->comment, lp_comment(params->service));                    /* comment */   
        else
                init_unistr(&printer->comment, ntprinter->info_2->comment); /* saved comment. */
 
@@ -4148,19 +4245,20 @@ static BOOL construct_printer_info_2(Printer_entry *print_hnd, PRINTER_INFO_2 *p
        printer->cjobs = count;                                                 /* jobs */
        printer->averageppm = ntprinter->info_2->averageppm;                    /* average pages per minute */
                        
-       if ( !(printer->devmode = construct_dev_mode(lp_const_servicename(snum))) )
+       if ( !(printer->devmode = construct_dev_mode(
+                      lp_const_servicename(params->service))) )
                DEBUG(8, ("Returning NULL Devicemode!\n"));
 
        printer->secdesc = NULL;
 
        if ( ntprinter->info_2->secdesc_buf 
-               && ntprinter->info_2->secdesc_buf->len != 0 ) 
+               && 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 */
 
                printer->secdesc = dup_sec_desc( get_talloc_ctx(), 
-                       ntprinter->info_2->secdesc_buf->sec );
+                       ntprinter->info_2->secdesc_buf->sd );
        }
 
        free_a_printer(&ntprinter, 2);
@@ -4173,12 +4271,15 @@ static BOOL construct_printer_info_2(Printer_entry *print_hnd, PRINTER_INFO_2 *p
  * fill a printer_info_3 struct
  ********************************************************************/
 
-static BOOL construct_printer_info_3(Printer_entry *print_hnd, PRINTER_INFO_3 **pp_printer, int snum)
+static BOOL construct_printer_info_3(Printer_entry *print_hnd,
+                                    PRINTER_INFO_3 **pp_printer,
+                                    const struct share_params *params)
 {
        NT_PRINTER_INFO_LEVEL *ntprinter = NULL;
        PRINTER_INFO_3 *printer = NULL;
 
-       if (!W_ERROR_IS_OK(get_a_printer(print_hnd, &ntprinter, 2, lp_const_servicename(snum))))
+       if (!W_ERROR_IS_OK(get_a_printer(print_hnd, &ntprinter, 2,
+                                        lp_const_servicename(params->service))))
                return False;
 
        *pp_printer = NULL;
@@ -4192,14 +4293,12 @@ static BOOL construct_printer_info_3(Printer_entry *print_hnd, PRINTER_INFO_3 **
        
        /* These are the components of the SD we are returning. */
 
-       printer->flags = 0x4; 
-
-       if (ntprinter->info_2->secdesc_buf && ntprinter->info_2->secdesc_buf->len != 0) {
+       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 */
 
                printer->secdesc = dup_sec_desc( get_talloc_ctx(), 
-                       ntprinter->info_2->secdesc_buf->sec );
+                       ntprinter->info_2->secdesc_buf->sd );
        }
 
        free_a_printer(&ntprinter, 2);
@@ -4213,11 +4312,14 @@ static BOOL construct_printer_info_3(Printer_entry *print_hnd, PRINTER_INFO_3 **
  * fill a printer_info_4 struct
  ********************************************************************/
 
-static BOOL construct_printer_info_4(Printer_entry *print_hnd, PRINTER_INFO_4 *printer, int snum)
+static BOOL construct_printer_info_4(Printer_entry *print_hnd,
+                                    PRINTER_INFO_4 *printer,
+                                    const struct share_params *params)
 {
        NT_PRINTER_INFO_LEVEL *ntprinter = NULL;
 
-       if (!W_ERROR_IS_OK(get_a_printer(print_hnd, &ntprinter, 2, lp_const_servicename(snum))))
+       if (!W_ERROR_IS_OK(get_a_printer(print_hnd, &ntprinter, 2,
+                                        lp_const_servicename(params->service))))
                return False;
                
        init_unistr(&printer->printername, ntprinter->info_2->printername);                             /* printername*/
@@ -4233,11 +4335,14 @@ static BOOL construct_printer_info_4(Printer_entry *print_hnd, PRINTER_INFO_4 *p
  * fill a printer_info_5 struct
  ********************************************************************/
 
-static BOOL construct_printer_info_5(Printer_entry *print_hnd, PRINTER_INFO_5 *printer, int snum)
+static BOOL construct_printer_info_5(Printer_entry *print_hnd,
+                                    PRINTER_INFO_5 *printer,
+                                    const struct share_params *params)
 {
        NT_PRINTER_INFO_LEVEL *ntprinter = NULL;
 
-       if (!W_ERROR_IS_OK(get_a_printer(print_hnd, &ntprinter, 2, lp_const_servicename(snum))))
+       if (!W_ERROR_IS_OK(get_a_printer(print_hnd, &ntprinter, 2,
+                                        lp_const_servicename(params->service))))
                return False;
                
        init_unistr(&printer->printername, ntprinter->info_2->printername);
@@ -4254,17 +4359,45 @@ static BOOL construct_printer_info_5(Printer_entry *print_hnd, PRINTER_INFO_5 *p
        return True;
 }
 
+/********************************************************************
+ * construct_printer_info_6
+ * fill a printer_info_6 struct
+ ********************************************************************/
+
+static BOOL construct_printer_info_6(Printer_entry *print_hnd,
+                                    PRINTER_INFO_6 *printer,
+                                    const struct share_params *params)
+{
+       NT_PRINTER_INFO_LEVEL *ntprinter = NULL;
+       int count;
+       print_status_struct status;
+
+       if (!W_ERROR_IS_OK(get_a_printer(print_hnd, &ntprinter, 2,
+                                        lp_const_servicename(params->service))))
+               return False;
+
+       count = print_queue_length(params->service, &status);
+
+       printer->status = nt_printq_status(status.status);
+               
+       free_a_printer(&ntprinter, 2);
+
+       return True;
+}
+
 /********************************************************************
  * construct_printer_info_7
  * fill a printer_info_7 struct
  ********************************************************************/
 
-static BOOL construct_printer_info_7(Printer_entry *print_hnd, PRINTER_INFO_7 *printer, int snum)
+static BOOL construct_printer_info_7(Printer_entry *print_hnd,
+                                    PRINTER_INFO_7 *printer,
+                                    const struct share_params *params)
 {
        char *guid_str = NULL;
        struct GUID guid; 
        
-       if (is_printer_published(print_hnd, snum, &guid)) {
+       if (is_printer_published(print_hnd, params->service, &guid)) {
                asprintf(&guid_str, "{%s}", smb_uuid_string_static(guid));
                strupper_m(guid_str);
                init_unistr(&printer->guid, guid_str);
@@ -4283,31 +4416,45 @@ static BOOL construct_printer_info_7(Printer_entry *print_hnd, PRINTER_INFO_7 *p
 
 static WERROR enum_all_printers_info_1(uint32 flags, RPC_BUFFER *buffer, uint32 offered, uint32 *needed, uint32 *returned)
 {
-       int snum;
        int i;
-       int n_services=lp_numservices();
+       struct share_iterator *shares;
+       struct share_params *printer;
        PRINTER_INFO_1 *printers=NULL;
-       PRINTER_INFO_1 current_prt;
        WERROR result = WERR_OK;
        
        DEBUG(4,("enum_all_printers_info_1\n"));        
 
-       for (snum=0; snum<n_services; snum++) {
-               if (lp_browseable(snum) && lp_snum_ok(snum) && lp_print_ok(snum) ) {
-                       DEBUG(4,("Found a printer in smb.conf: %s[%x]\n", lp_servicename(snum), snum));
+       if (!(shares = share_list_all(NULL))) {
+               DEBUG(5, ("Could not list printers\n"));
+               return WERR_ACCESS_DENIED;
+       }
+
+       while ((printer = next_printer(shares)) != NULL) {
+               PRINTER_INFO_1 current_prt;
 
-                       if (construct_printer_info_1(NULL, flags, &current_prt, snum)) {
-                               if((printers=SMB_REALLOC_ARRAY(printers, PRINTER_INFO_1, *returned +1)) == NULL) {
-                                       DEBUG(2,("enum_all_printers_info_1: failed to enlarge printers buffer!\n"));
-                                       *returned=0;
-                                       return WERR_NOMEM;
-                               }
-                               DEBUG(4,("ReAlloced memory for [%d] PRINTER_INFO_1\n", *returned));             
+               DEBUG(4,("Found a printer in smb.conf: %s\n",
+                        lp_servicename(printer->service)));
 
-                               memcpy(&printers[*returned], &current_prt, sizeof(PRINTER_INFO_1));
-                               (*returned)++;
-                       }
+               if (!construct_printer_info_1(NULL, flags, &current_prt,
+                                             printer)) {
+                       continue;
+               }
+
+               if((printers=SMB_REALLOC_ARRAY(printers, PRINTER_INFO_1,
+                                              *returned +1)) == NULL) {
+                       DEBUG(2,("enum_all_printers_info_1: failed to enlarge "
+                                "printers buffer!\n"));
+                       *returned=0;
+                       TALLOC_FREE(shares);
+                       return WERR_NOMEM;
                }
+               DEBUG(4,("ReAlloced memory for [%d] PRINTER_INFO_1\n",
+                        *returned));
+
+               memcpy(&printers[*returned], &current_prt,
+                      sizeof(PRINTER_INFO_1));
+               (*returned)++;
+               TALLOC_FREE(printer);
        }
                
        /* check the required size. */  
@@ -4332,6 +4479,7 @@ out:
        /* clear memory */
 
        SAFE_FREE(printers);
+       TALLOC_FREE(shares);
 
        if ( !W_ERROR_IS_OK(result) )
                *returned = 0;
@@ -4469,33 +4617,45 @@ static WERROR enum_all_printers_info_1_network(fstring name, RPC_BUFFER *buffer,
 
 static WERROR enum_all_printers_info_2(RPC_BUFFER *buffer, uint32 offered, uint32 *needed, uint32 *returned)
 {
-       int snum;
        int i;
-       int n_services=lp_numservices();
+       struct share_iterator *shares;
+       struct share_params *printer;
        PRINTER_INFO_2 *printers=NULL;
-       PRINTER_INFO_2 current_prt;
        WERROR result = WERR_OK;
 
        *returned = 0;
 
-       for (snum=0; snum<n_services; snum++) {
-               if (lp_browseable(snum) && lp_snum_ok(snum) && lp_print_ok(snum) ) {
-                       DEBUG(4,("Found a printer in smb.conf: %s[%x]\n", lp_servicename(snum), snum));
-                               
-                       if (construct_printer_info_2(NULL, &current_prt, snum)) {
-                               if ( !(printers=SMB_REALLOC_ARRAY(printers, PRINTER_INFO_2, *returned +1)) ) {
-                                       DEBUG(2,("enum_all_printers_info_2: failed to enlarge printers buffer!\n"));
-                                       *returned = 0;
-                                       return WERR_NOMEM;
-                               }
+       if (!(shares = share_list_all(NULL))) {
+               DEBUG(5, ("Could not list printers\n"));
+               return WERR_ACCESS_DENIED;
+       }
 
-                               DEBUG(4,("ReAlloced memory for [%d] PRINTER_INFO_2\n", *returned + 1));         
+       while ((printer = next_printer(shares)) != NULL) {
+               PRINTER_INFO_2 current_prt;
 
-                               memcpy(&printers[*returned], &current_prt, sizeof(PRINTER_INFO_2));
+               DEBUG(4,("Found a printer in smb.conf: %s\n",
+                        lp_servicename(printer->service)));
 
-                               (*returned)++;
-                       }
+               if (!construct_printer_info_2(NULL, &current_prt,
+                                             printer)) {
+                       continue;
+               }
+               if ( !(printers=SMB_REALLOC_ARRAY(printers, PRINTER_INFO_2,
+                                                 *returned +1)) ) {
+                       DEBUG(2,("enum_all_printers_info_2: failed to enlarge "
+                                "printers buffer!\n"));
+                       *returned = 0;
+                       TALLOC_FREE(shares);
+                       return WERR_NOMEM;
                }
+
+               DEBUG(4,("ReAlloced memory for [%d] PRINTER_INFO_2\n",
+                        *returned + 1));
+
+               memcpy(&printers[*returned], &current_prt,
+                      sizeof(PRINTER_INFO_2));
+               (*returned)++;
+               TALLOC_FREE(printer);
        }
        
        /* check the required size. */  
@@ -4523,6 +4683,7 @@ out:
                free_devmode(printers[i].devmode);
 
        SAFE_FREE(printers);
+       TALLOC_FREE(shares);
 
        if ( !W_ERROR_IS_OK(result) )
                *returned = 0;
@@ -4663,7 +4824,10 @@ WERROR _spoolss_enumprinters( pipes_struct *p, SPOOL_Q_ENUMPRINTERS *q_u, SPOOL_
 /****************************************************************************
 ****************************************************************************/
 
-static WERROR getprinter_level_0(Printer_entry *print_hnd, int snum, RPC_BUFFER *buffer, uint32 offered, uint32 *needed)
+static WERROR getprinter_level_0(Printer_entry *print_hnd,
+                                const struct share_params *params,
+                                RPC_BUFFER *buffer, uint32 offered,
+                                uint32 *needed)
 {
        PRINTER_INFO_0 *printer=NULL;
        WERROR result = WERR_OK;
@@ -4671,7 +4835,7 @@ static WERROR getprinter_level_0(Printer_entry *print_hnd, int snum, RPC_BUFFER
        if((printer=SMB_MALLOC_P(PRINTER_INFO_0)) == NULL)
                return WERR_NOMEM;
 
-       construct_printer_info_0(print_hnd, printer, snum);
+       construct_printer_info_0(print_hnd, printer, params);
        
        /* check the required size. */  
        *needed += spoolss_size_printer_info_0(printer);
@@ -4700,7 +4864,10 @@ out:
 /****************************************************************************
 ****************************************************************************/
 
-static WERROR getprinter_level_1(Printer_entry *print_hnd, int snum, RPC_BUFFER *buffer, uint32 offered, uint32 *needed)
+static WERROR getprinter_level_1(Printer_entry *print_hnd,
+                                const struct share_params *params,
+                                RPC_BUFFER *buffer, uint32 offered,
+                                uint32 *needed)
 {
        PRINTER_INFO_1 *printer=NULL;
        WERROR result = WERR_OK;
@@ -4708,7 +4875,8 @@ static WERROR getprinter_level_1(Printer_entry *print_hnd, int snum, RPC_BUFFER
        if((printer=SMB_MALLOC_P(PRINTER_INFO_1)) == NULL)
                return WERR_NOMEM;
 
-       construct_printer_info_1(print_hnd, PRINTER_ENUM_ICON8, printer, snum);
+       construct_printer_info_1(print_hnd, PRINTER_ENUM_ICON8, printer,
+                                params);
        
        /* check the required size. */  
        *needed += spoolss_size_printer_info_1(printer);
@@ -4736,7 +4904,10 @@ out:
 /****************************************************************************
 ****************************************************************************/
 
-static WERROR getprinter_level_2(Printer_entry *print_hnd, int snum, RPC_BUFFER *buffer, uint32 offered, uint32 *needed)
+static WERROR getprinter_level_2(Printer_entry *print_hnd,
+                                const struct share_params *params,
+                                RPC_BUFFER *buffer, uint32 offered,
+                                uint32 *needed)
 {
        PRINTER_INFO_2 *printer=NULL;
        WERROR result = WERR_OK;
@@ -4744,7 +4915,7 @@ static WERROR getprinter_level_2(Printer_entry *print_hnd, int snum, RPC_BUFFER
        if((printer=SMB_MALLOC_P(PRINTER_INFO_2))==NULL)
                return WERR_NOMEM;
        
-       construct_printer_info_2(print_hnd, printer, snum);
+       construct_printer_info_2(print_hnd, printer, params);
        
        /* check the required size. */  
        *needed += spoolss_size_printer_info_2(printer);
@@ -4773,12 +4944,15 @@ out:
 /****************************************************************************
 ****************************************************************************/
 
-static WERROR getprinter_level_3(Printer_entry *print_hnd, int snum, RPC_BUFFER *buffer, uint32 offered, uint32 *needed)
+static WERROR getprinter_level_3(Printer_entry *print_hnd,
+                                const struct share_params *params,
+                                RPC_BUFFER *buffer, uint32 offered,
+                                uint32 *needed)
 {
        PRINTER_INFO_3 *printer=NULL;
        WERROR result = WERR_OK;
 
-       if (!construct_printer_info_3(print_hnd, &printer, snum))
+       if (!construct_printer_info_3(print_hnd, &printer, params))
                return WERR_NOMEM;
        
        /* check the required size. */  
@@ -4807,7 +4981,10 @@ out:
 /****************************************************************************
 ****************************************************************************/
 
-static WERROR getprinter_level_4(Printer_entry *print_hnd, int snum, RPC_BUFFER *buffer, uint32 offered, uint32 *needed)
+static WERROR getprinter_level_4(Printer_entry *print_hnd,
+                                const struct share_params *params,
+                                RPC_BUFFER *buffer, uint32 offered,
+                                uint32 *needed)
 {
        PRINTER_INFO_4 *printer=NULL;
        WERROR result = WERR_OK;
@@ -4815,7 +4992,7 @@ static WERROR getprinter_level_4(Printer_entry *print_hnd, int snum, RPC_BUFFER
        if((printer=SMB_MALLOC_P(PRINTER_INFO_4))==NULL)
                return WERR_NOMEM;
 
-       if (!construct_printer_info_4(print_hnd, printer, snum)) {
+       if (!construct_printer_info_4(print_hnd, printer, params)) {
                SAFE_FREE(printer);
                return WERR_NOMEM;
        }
@@ -4846,7 +5023,10 @@ out:
 /****************************************************************************
 ****************************************************************************/
 
-static WERROR getprinter_level_5(Printer_entry *print_hnd, int snum, RPC_BUFFER *buffer, uint32 offered, uint32 *needed)
+static WERROR getprinter_level_5(Printer_entry *print_hnd,
+                                const struct share_params *params,
+                                RPC_BUFFER *buffer, uint32 offered,
+                                uint32 *needed)
 {
        PRINTER_INFO_5 *printer=NULL;
        WERROR result = WERR_OK;
@@ -4854,7 +5034,7 @@ static WERROR getprinter_level_5(Printer_entry *print_hnd, int snum, RPC_BUFFER
        if((printer=SMB_MALLOC_P(PRINTER_INFO_5))==NULL)
                return WERR_NOMEM;
 
-       if (!construct_printer_info_5(print_hnd, printer, snum)) {
+       if (!construct_printer_info_5(print_hnd, printer, params)) {
                free_printer_info_5(printer);
                return WERR_NOMEM;
        }
@@ -4882,7 +5062,50 @@ out:
        return result;  
 }
 
-static WERROR getprinter_level_7(Printer_entry *print_hnd, int snum, RPC_BUFFER *buffer, uint32 offered, uint32 *needed)
+static WERROR getprinter_level_6(Printer_entry *print_hnd,
+                                const struct share_params *params,
+                                RPC_BUFFER *buffer, uint32 offered,
+                                uint32 *needed)
+{
+       PRINTER_INFO_6 *printer;
+       WERROR result = WERR_OK;
+
+       if ((printer = SMB_MALLOC_P(PRINTER_INFO_6)) == NULL) {
+               return WERR_NOMEM;
+       }
+
+       if (!construct_printer_info_6(print_hnd, printer, params)) {
+               free_printer_info_6(printer);
+               return WERR_NOMEM;
+       }
+
+       /* check the required size. */
+       *needed += spoolss_size_printer_info_6(printer);
+
+       if (*needed > offered) {
+               result = WERR_INSUFFICIENT_BUFFER;
+               goto out;
+       }
+
+       if (!rpcbuf_alloc_size(buffer, *needed)) {
+               result = WERR_NOMEM;
+               goto out;
+       }
+
+       /* fill the buffer with the structures */
+       smb_io_printer_info_6("", buffer, printer, 0);  
+       
+out:
+       /* clear memory */
+       free_printer_info_6(printer);
+       
+       return result;  
+}
+
+static WERROR getprinter_level_7(Printer_entry *print_hnd,
+                                const struct share_params *params,
+                                RPC_BUFFER *buffer, uint32 offered,
+                                uint32 *needed)
 {
        PRINTER_INFO_7 *printer=NULL;
        WERROR result = WERR_OK;
@@ -4890,7 +5113,7 @@ static WERROR getprinter_level_7(Printer_entry *print_hnd, int snum, RPC_BUFFER
        if((printer=SMB_MALLOC_P(PRINTER_INFO_7))==NULL)
                return WERR_NOMEM;
 
-       if (!construct_printer_info_7(print_hnd, printer, snum))
+       if (!construct_printer_info_7(print_hnd, printer, params))
                return WERR_NOMEM;
        
        /* check the required size. */  
@@ -4928,6 +5151,7 @@ WERROR _spoolss_getprinter(pipes_struct *p, SPOOL_Q_GETPRINTER *q_u, SPOOL_R_GET
        uint32 offered = q_u->offered;
        uint32 *needed = &r_u->needed;
        Printer_entry *Printer=find_printer_index_by_hnd(p, handle);
+       struct share_params *params;
 
        int snum;
 
@@ -4942,24 +5166,34 @@ WERROR _spoolss_getprinter(pipes_struct *p, SPOOL_Q_GETPRINTER *q_u, SPOOL_R_GET
 
        *needed=0;
 
-       if (!get_printer_snum(p, handle, &snum))
+       if (!get_printer_snum(p, handle, &snum, &params))
                return WERR_BADFID;
 
        switch (level) {
        case 0:
-               return getprinter_level_0(Printer, snum, buffer, offered, needed);
+               return getprinter_level_0(Printer, params, buffer, offered,
+                                         needed);
        case 1:
-               return getprinter_level_1(Printer, snum, buffer, offered, needed);
+               return getprinter_level_1(Printer, params, buffer, offered,
+                                         needed);
        case 2:         
-               return getprinter_level_2(Printer, snum, buffer, offered, needed);
+               return getprinter_level_2(Printer, params, buffer, offered,
+                                         needed);
        case 3:         
-               return getprinter_level_3(Printer, snum, buffer, offered, needed);
+               return getprinter_level_3(Printer, params, buffer, offered,
+                                         needed);
        case 4:         
-               return getprinter_level_4(Printer, snum, buffer, offered, needed);
+               return getprinter_level_4(Printer, params, buffer, offered,
+                                         needed);
        case 5:         
-               return getprinter_level_5(Printer, snum, buffer, offered, needed);
+               return getprinter_level_5(Printer, params, buffer, offered,
+                                         needed);
+       case 6:
+               return getprinter_level_6(Printer, params, buffer, offered,
+                                         needed);
        case 7:
-               return getprinter_level_7(Printer, snum, buffer, offered, needed);
+               return getprinter_level_7(Printer, params, buffer, offered,
+                                         needed);
        }
        return WERR_UNKNOWN_LEVEL;
 }      
@@ -5556,7 +5790,7 @@ WERROR _spoolss_getprinterdriver2(pipes_struct *p, SPOOL_Q_GETPRINTERDRIVER2 *q_
        fstrcpy(servername, get_server_name( printer ));
        unistr2_to_ascii(architecture, uni_arch, sizeof(architecture)-1);
 
-       if (!get_printer_snum(p, handle, &snum))
+       if (!get_printer_snum(p, handle, &snum, NULL))
                return WERR_BADFID;
 
        switch (level) {
@@ -5612,7 +5846,7 @@ WERROR _spoolss_endpageprinter(pipes_struct *p, SPOOL_Q_ENDPAGEPRINTER *q_u, SPO
                return WERR_BADFID;
        }
        
-       if (!get_printer_snum(p, handle, &snum))
+       if (!get_printer_snum(p, handle, &snum, NULL))
                return WERR_BADFID;
 
        Printer->page_started=False;
@@ -5661,7 +5895,7 @@ WERROR _spoolss_startdocprinter(pipes_struct *p, SPOOL_Q_STARTDOCPRINTER *q_u, S
        }               
        
        /* get the share number of the printer */
-       if (!get_printer_snum(p, handle, &snum)) {
+       if (!get_printer_snum(p, handle, &snum, NULL)) {
                return WERR_BADFID;
        }
 
@@ -5713,7 +5947,7 @@ WERROR _spoolss_writeprinter(pipes_struct *p, SPOOL_Q_WRITEPRINTER *q_u, SPOOL_R
                return WERR_BADFID;
        }
 
-       if (!get_printer_snum(p, handle, &snum))
+       if (!get_printer_snum(p, handle, &snum, NULL))
                return WERR_BADFID;
 
        (*buffer_written) = (uint32)print_job_write(snum, Printer->jobid, (const char *)buffer,
@@ -5749,7 +5983,7 @@ static WERROR control_printer(POLICY_HND *handle, uint32 command,
                return WERR_BADFID;
        }
 
-       if (!get_printer_snum(p, handle, &snum))
+       if (!get_printer_snum(p, handle, &snum, NULL))
                return WERR_BADFID;
 
        switch (command) {
@@ -5794,7 +6028,7 @@ WERROR _spoolss_abortprinter(pipes_struct *p, SPOOL_Q_ABORTPRINTER *q_u, SPOOL_R
                return WERR_BADFID;
        }
        
-       if (!get_printer_snum(p, handle, &snum))
+       if (!get_printer_snum(p, handle, &snum, NULL))
                return WERR_BADFID;
        
        print_job_delete( &p->pipe_user, snum, Printer->jobid, &errcode );      
@@ -5817,7 +6051,7 @@ static WERROR update_printer_sec(POLICY_HND *handle, uint32 level,
 
        Printer_entry *Printer = find_printer_index_by_hnd(p, handle);
 
-       if (!Printer || !get_printer_snum(p, handle, &snum)) {
+       if (!Printer || !get_printer_snum(p, handle, &snum, NULL)) {
                DEBUG(2,("update_printer_sec: Invalid handle (%s:%u:%u)\n",
                         OUR_HANDLE(handle)));
 
@@ -5825,6 +6059,12 @@ static WERROR update_printer_sec(POLICY_HND *handle, uint32 level,
                goto done;
        }
        
+       if (!secdesc_ctr) {
+               DEBUG(10,("update_printer_sec: secdesc_ctr is NULL !\n"));
+               result = WERR_INVALID_PARAM;
+               goto done;
+       }
+
        /* Check the user has permissions to change the security
           descriptor.  By experimentation with two NT machines, the user
           requires Full Access to the printer to change security
@@ -5845,20 +6085,20 @@ static WERROR update_printer_sec(POLICY_HND *handle, uint32 level,
                SEC_ACL *the_acl;
                int i;
 
-               the_acl = old_secdesc_ctr->sec->dacl;
+               the_acl = old_secdesc_ctr->sd->dacl;
                DEBUG(10, ("old_secdesc_ctr for %s has %d aces:\n", 
                           PRINTERNAME(snum), the_acl->num_aces));
 
                for (i = 0; i < the_acl->num_aces; i++) {
                        fstring sid_str;
 
-                       sid_to_string(sid_str, &the_acl->ace[i].trustee);
+                       sid_to_string(sid_str, &the_acl->aces[i].trustee);
 
                        DEBUG(10, ("%s 0x%08x\n", sid_str, 
-                                 the_acl->ace[i].info.mask));
+                                 the_acl->aces[i].access_mask));
                }
 
-               the_acl = secdesc_ctr->sec->dacl;
+               the_acl = secdesc_ctr->sd->dacl;
 
                if (the_acl) {
                        DEBUG(10, ("secdesc_ctr for %s has %d aces:\n", 
@@ -5867,10 +6107,10 @@ static WERROR update_printer_sec(POLICY_HND *handle, uint32 level,
                        for (i = 0; i < the_acl->num_aces; i++) {
                                fstring sid_str;
                                
-                               sid_to_string(sid_str, &the_acl->ace[i].trustee);
+                               sid_to_string(sid_str, &the_acl->aces[i].trustee);
                                
                                DEBUG(10, ("%s 0x%08x\n", sid_str, 
-                                          the_acl->ace[i].info.mask));
+                                          the_acl->aces[i].access_mask));
                        }
                } else {
                        DEBUG(10, ("dacl for secdesc_ctr is NULL\n"));
@@ -5883,7 +6123,7 @@ static WERROR update_printer_sec(POLICY_HND *handle, uint32 level,
                goto done;
        }
 
-       if (sec_desc_equal(new_secdesc_ctr->sec, old_secdesc_ctr->sec)) {
+       if (sec_desc_equal(new_secdesc_ctr->sd, old_secdesc_ctr->sd)) {
                result = WERR_OK;
                goto done;
        }
@@ -6028,7 +6268,8 @@ BOOL add_printer_hook(NT_USER_TOKEN *token, NT_PRINTER_INFO_LEVEL *printer)
        
        if ( (ret = smbrun(command, &fd)) == 0 ) {
                /* Tell everyone we updated smb.conf. */
-               message_send_all(conn_tdb_ctx(), MSG_SMB_CONF_UPDATED, NULL, 0, False, NULL);
+               message_send_all(smbd_messaging_context(),
+                                MSG_SMB_CONF_UPDATED, NULL, 0, NULL);
        }
 
        if ( is_print_op )
@@ -6092,7 +6333,7 @@ static WERROR update_printer(pipes_struct *p, POLICY_HND *handle, uint32 level,
                goto done;
        }
 
-       if (!get_printer_snum(p, handle, &snum)) {
+       if (!get_printer_snum(p, handle, &snum, NULL)) {
                result = WERR_BADFID;
                goto done;
        }
@@ -6283,7 +6524,7 @@ static WERROR publish_or_unpublish_printer(pipes_struct *p, POLICY_HND *handle,
        if (!Printer)
                return WERR_BADFID;
 
-       if (!get_printer_snum(p, handle, &snum))
+       if (!get_printer_snum(p, handle, &snum, NULL))
                return WERR_BADFID;
        
        nt_printer_publish(Printer, snum, info7->action);
@@ -6353,7 +6594,7 @@ WERROR _spoolss_fcpn(pipes_struct *p, SPOOL_Q_FCPN *q_u, SPOOL_R_FCPN *r_u)
                if ( Printer->printer_type == SPLHND_SERVER)
                        snum = -1;
                else if ( (Printer->printer_type == SPLHND_PRINTER) &&
-                               !get_printer_snum(p, handle, &snum) )
+                               !get_printer_snum(p, handle, &snum, NULL) )
                        return WERR_BADFID;
 
                srv_spoolss_replycloseprinter(snum, &Printer->notify.client_hnd);
@@ -6600,7 +6841,7 @@ WERROR _spoolss_enumjobs( pipes_struct *p, SPOOL_Q_ENUMJOBS *q_u, SPOOL_R_ENUMJO
 
        /* lookup the printer snum and tdb entry */
        
-       if (!get_printer_snum(p, handle, &snum))
+       if (!get_printer_snum(p, handle, &snum, NULL))
                return WERR_BADFID;
 
        wret = get_a_printer(NULL, &ntprinter, 2, lp_servicename(snum));
@@ -6654,7 +6895,7 @@ WERROR _spoolss_setjob(pipes_struct *p, SPOOL_Q_SETJOB *q_u, SPOOL_R_SETJOB *r_u
        int snum;
        WERROR errcode = WERR_BADFUNC;
                
-       if (!get_printer_snum(p, handle, &snum)) {
+       if (!get_printer_snum(p, handle, &snum, NULL)) {
                return WERR_BADFID;
        }
 
@@ -7249,8 +7490,13 @@ WERROR enumports_hook( int *count, char ***lines )
        /* if no hook then just fill in the default port */
        
        if ( !*cmd ) {
-               qlines = SMB_MALLOC_ARRAY( char*, 2 );
-               qlines[0] = SMB_STRDUP( SAMBA_PRINTER_PORT_NAME );
+               if (!(qlines = SMB_MALLOC_ARRAY( char*, 2 ))) {
+                       return WERR_NOMEM;
+               }
+               if (!(qlines[0] = SMB_STRDUP( SAMBA_PRINTER_PORT_NAME ))) {
+                       SAFE_FREE(qlines);
+                       return WERR_NOMEM;
+               }
                qlines[1] = NULL;
                numlines = 1;
        }
@@ -7880,7 +8126,7 @@ WERROR _spoolss_enumprinterdata(pipes_struct *p, SPOOL_Q_ENUMPRINTERDATA *q_u, S
                return WERR_BADFID;
        }
 
-       if (!get_printer_snum(p,handle, &snum))
+       if (!get_printer_snum(p,handle, &snum, NULL))
                return WERR_BADFID;
        
        result = get_a_printer(Printer, &printer, 2, lp_const_servicename(snum));
@@ -7949,14 +8195,18 @@ WERROR _spoolss_enumprinterdata(pipes_struct *p, SPOOL_Q_ENUMPRINTERDATA *q_u, S
 
                *out_max_value_len=(in_value_len/sizeof(uint16));
                
-               if((*out_value=(uint16 *)TALLOC_ZERO(p->mem_ctx, in_value_len*sizeof(uint8))) == NULL)
-               {
-                       result = WERR_NOMEM;
-                       goto done;
+               if (in_value_len) {
+                       if((*out_value=(uint16 *)TALLOC_ZERO(p->mem_ctx, in_value_len*sizeof(uint8))) == NULL)
+                       {
+                               result = WERR_NOMEM;
+                               goto done;
+                       }
+                       *out_value_len = (uint32)rpcstr_push((char *)*out_value, "", in_value_len, 0);
+               } else {
+                       *out_value=NULL;
+                       *out_value_len = 0;
                }
 
-               *out_value_len = (uint32)rpcstr_push((char *)*out_value, "", in_value_len, 0);
-
                /* the data is counted in bytes */
                
                *out_max_data_len = in_data_len;
@@ -7985,13 +8235,18 @@ WERROR _spoolss_enumprinterdata(pipes_struct *p, SPOOL_Q_ENUMPRINTERDATA *q_u, S
        
                /* name */
                *out_max_value_len=(in_value_len/sizeof(uint16));
-               if ( (*out_value = (uint16 *)TALLOC_ZERO(p->mem_ctx, in_value_len*sizeof(uint8))) == NULL ) 
-               {
-                       result = WERR_NOMEM;
-                       goto done;
-               }
+               if (in_value_len) {
+                       if ( (*out_value = (uint16 *)TALLOC_ZERO(p->mem_ctx, in_value_len*sizeof(uint8))) == NULL ) 
+                       {
+                               result = WERR_NOMEM;
+                               goto done;
+                       }
        
-               *out_value_len = (uint32)rpcstr_push((char *)*out_value, regval_name(val), (size_t)in_value_len, 0);
+                       *out_value_len = (uint32)rpcstr_push((char *)*out_value, regval_name(val), (size_t)in_value_len, 0);
+               } else {
+                       *out_value = NULL;
+                       *out_value_len = 0;
+               }
 
                /* type */
                
@@ -8006,7 +8261,7 @@ WERROR _spoolss_enumprinterdata(pipes_struct *p, SPOOL_Q_ENUMPRINTERDATA *q_u, S
                        goto done;
                }
                data_len = regval_size(val);
-               if ( *data_out )
+               if ( *data_out && data_len )
                        memcpy( *data_out, regval_data_p(val), data_len );
                *out_data_len = data_len;
        }
@@ -8045,7 +8300,7 @@ WERROR _spoolss_setprinterdata( pipes_struct *p, SPOOL_Q_SETPRINTERDATA *q_u, SP
                return WERR_INVALID_PARAM;
        }
 
-       if (!get_printer_snum(p,handle, &snum))
+       if (!get_printer_snum(p,handle, &snum, NULL))
                return WERR_BADFID;
 
        /* 
@@ -8117,7 +8372,7 @@ WERROR _spoolss_resetprinter(pipes_struct *p, SPOOL_Q_RESETPRINTER *q_u, SPOOL_R
                return WERR_BADFID;
        }
 
-       if (!get_printer_snum(p,handle, &snum))
+       if (!get_printer_snum(p,handle, &snum, NULL))
                return WERR_BADFID;
 
 
@@ -8147,7 +8402,7 @@ WERROR _spoolss_deleteprinterdata(pipes_struct *p, SPOOL_Q_DELETEPRINTERDATA *q_
                return WERR_BADFID;
        }
 
-       if (!get_printer_snum(p, handle, &snum))
+       if (!get_printer_snum(p, handle, &snum, NULL))
                return WERR_BADFID;
 
        if (Printer->access_granted != PRINTER_ACCESS_ADMINISTER) {
@@ -8199,7 +8454,7 @@ WERROR _spoolss_addform( pipes_struct *p, SPOOL_Q_ADDFORM *q_u, SPOOL_R_ADDFORM
        
        if ( Printer->printer_type == SPLHND_PRINTER )
        {
-               if (!get_printer_snum(p,handle, &snum))
+               if (!get_printer_snum(p,handle, &snum, NULL))
                        return WERR_BADFID;
         
                status = get_a_printer(Printer, &printer, 2, lp_const_servicename(snum));
@@ -8270,7 +8525,7 @@ WERROR _spoolss_deleteform( pipes_struct *p, SPOOL_Q_DELETEFORM *q_u, SPOOL_R_DE
        
        if ( Printer->printer_type == SPLHND_PRINTER )
        {
-               if (!get_printer_snum(p,handle, &snum))
+               if (!get_printer_snum(p,handle, &snum, NULL))
                        return WERR_BADFID;
         
                status = get_a_printer(Printer, &printer, 2, lp_const_servicename(snum));
@@ -8338,7 +8593,7 @@ WERROR _spoolss_setform(pipes_struct *p, SPOOL_Q_SETFORM *q_u, SPOOL_R_SETFORM *
        
        if ( Printer->printer_type == SPLHND_PRINTER )
        {
-               if (!get_printer_snum(p,handle, &snum))
+               if (!get_printer_snum(p,handle, &snum, NULL))
                        return WERR_BADFID;
         
                status = get_a_printer(Printer, &printer, 2, lp_const_servicename(snum));
@@ -8464,7 +8719,7 @@ WERROR _spoolss_enumprintprocessors(pipes_struct *p, SPOOL_Q_ENUMPRINTPROCESSORS
 static WERROR enumprintprocdatatypes_level_1(RPC_BUFFER *buffer, uint32 offered, uint32 *needed, uint32 *returned)
 {
        PRINTPROCDATATYPE_1 *info_1=NULL;
-       WERROR result = WERR_NOMEM;
+       WERROR result = WERR_OK;
        
        if((info_1 = SMB_MALLOC_P(PRINTPROCDATATYPE_1)) == NULL)
                return WERR_NOMEM;
@@ -8824,7 +9079,7 @@ WERROR _spoolss_getjob( pipes_struct *p, SPOOL_Q_GETJOB *q_u, SPOOL_R_GETJOB *r_
        
        *needed = 0;
        
-       if (!get_printer_snum(p, handle, &snum))
+       if (!get_printer_snum(p, handle, &snum, NULL))
                return WERR_BADFID;
        
        wstatus = get_a_printer(NULL, &ntprinter, 2, lp_servicename(snum));
@@ -8907,7 +9162,7 @@ WERROR _spoolss_getprinterdataex(pipes_struct *p, SPOOL_Q_GETPRINTERDATAEX *q_u,
                goto done;
        }
        
-       if ( !get_printer_snum(p,handle, &snum) )
+       if ( !get_printer_snum(p,handle, &snum, NULL) )
                return WERR_BADFID;
 
        status = get_a_printer(Printer, &printer, 2, lp_servicename(snum));
@@ -8947,10 +9202,9 @@ done:
                                status = WERR_NOMEM;
                                goto done;
                        }
-               } 
-               else {
+               } else {
                        *data = NULL;
-       }
+               }
        }
        
        if ( printer )
@@ -8993,7 +9247,7 @@ WERROR _spoolss_setprinterdataex(pipes_struct *p, SPOOL_Q_SETPRINTERDATAEX *q_u,
                return WERR_INVALID_PARAM;
        }
 
-       if ( !get_printer_snum(p,handle, &snum) )
+       if ( !get_printer_snum(p,handle, &snum, NULL) )
                return WERR_BADFID;
 
        /* 
@@ -9080,7 +9334,7 @@ WERROR _spoolss_deleteprinterdataex(pipes_struct *p, SPOOL_Q_DELETEPRINTERDATAEX
                return WERR_BADFID;
        }
 
-       if (!get_printer_snum(p, handle, &snum))
+       if (!get_printer_snum(p, handle, &snum, NULL))
                return WERR_BADFID;
 
        if (Printer->access_granted != PRINTER_ACCESS_ADMINISTER) {
@@ -9132,7 +9386,7 @@ WERROR _spoolss_enumprinterkey(pipes_struct *p, SPOOL_Q_ENUMPRINTERKEY *q_u, SPO
                return WERR_BADFID;
        }
 
-       if ( !get_printer_snum(p,handle, &snum) )
+       if ( !get_printer_snum(p,handle, &snum, NULL) )
                return WERR_BADFID;
 
        status = get_a_printer(Printer, &printer, 2, lp_const_servicename(snum));
@@ -9202,7 +9456,7 @@ WERROR _spoolss_deleteprinterkey(pipes_struct *p, SPOOL_Q_DELETEPRINTERKEY *q_u,
        if ( !q_u->keyname.buffer )
                return WERR_INVALID_PARAM;
                
-       if (!get_printer_snum(p, handle, &snum))
+       if (!get_printer_snum(p, handle, &snum, NULL))
                return WERR_BADFID;
 
        if (Printer->access_granted != PRINTER_ACCESS_ADMINISTER) {
@@ -9275,7 +9529,7 @@ WERROR _spoolss_enumprinterdataex(pipes_struct *p, SPOOL_Q_ENUMPRINTERDATAEX *q_
 
        /* get the printer off of disk */
        
-       if (!get_printer_snum(p,handle, &snum))
+       if (!get_printer_snum(p,handle, &snum, NULL))
                return WERR_BADFID;
        
        ZERO_STRUCT(printer);
@@ -9337,7 +9591,7 @@ WERROR _spoolss_enumprinterdataex(pipes_struct *p, SPOOL_Q_ENUMPRINTERDATAEX *q_
                if ( data_len ) {
                        if ( !(enum_values[i].data = (uint8 *)TALLOC_MEMDUP(p->mem_ctx, regval_data_p(val), data_len)) ) 
                        {
-                               DEBUG(0,("talloc_memdup failed to allocate memory [data_len=%d] for data!\n", 
+                               DEBUG(0,("TALLOC_MEMDUP failed to allocate memory [data_len=%d] for data!\n", 
                                        data_len ));
                                result = WERR_NOMEM;
                                goto done;
@@ -9352,6 +9606,15 @@ WERROR _spoolss_enumprinterdataex(pipes_struct *p, SPOOL_Q_ENUMPRINTERDATAEX *q_
        
        /* housekeeping information in the reply */
        
+       /* Fix from Martin Zielinski <mz@seh.de> - ensure
+        * the hand marshalled container size is a multiple
+        * of 4 bytes for RPC alignment.
+        */
+
+       if (needed % 4) {
+               needed += 4-(needed % 4);
+       }
+
        r_u->needed     = needed;
        r_u->returned   = num_entries;
 
@@ -9363,6 +9626,7 @@ WERROR _spoolss_enumprinterdataex(pipes_struct *p, SPOOL_Q_ENUMPRINTERDATAEX *q_
        /* copy data into the reply */
        
        r_u->ctr.size           = r_u->needed;
+
        r_u->ctr.size_of_array  = r_u->returned;
        r_u->ctr.values         = enum_values;