summaryrefslogtreecommitdiff
path: root/source3/rpc_parse/parse_spoolss.c
diff options
context:
space:
mode:
Diffstat (limited to 'source3/rpc_parse/parse_spoolss.c')
-rw-r--r--source3/rpc_parse/parse_spoolss.c38
1 files changed, 23 insertions, 15 deletions
diff --git a/source3/rpc_parse/parse_spoolss.c b/source3/rpc_parse/parse_spoolss.c
index c090239f38..08ea5f73a2 100644
--- a/source3/rpc_parse/parse_spoolss.c
+++ b/source3/rpc_parse/parse_spoolss.c
@@ -462,20 +462,15 @@ void spoolss_io_r_getprinterdata(char *desc, SPOOL_R_GETPRINTERDATA *r_u, prs_st
prs_debug(ps, depth, desc, "spoolss_io_r_getprinterdata");
depth++;
+ /* grow buffer mem enough */
+ mem_grow_data(&(ps->data), ps->io, r_u->size+100, 0);
+
prs_align(ps);
prs_uint32("type", ps, depth, &(r_u->type));
prs_uint32("size", ps, depth, &(r_u->size));
-
- switch (r_u->type)
- {
- case 0x1:
- case 0x3:
- case 0x4:
- case 0x7:
- prs_uint8s(False,"data", ps, depth, r_u->data, r_u->size);
- prs_align(ps);
- break;
- }
+
+ prs_uint8s(False,"data", ps, depth, r_u->data, r_u->size);
+ prs_align(ps);
prs_uint32("needed", ps, depth, &(r_u->needed));
prs_uint32("status", ps, depth, &(r_u->status));
@@ -969,6 +964,8 @@ static void smb_io_printer_info_2(char *desc, PRINTER_INFO_2 *info, prs_struct *
uint32 *start_offset, uint32 *end_offset)
{
uint32 pipo=0;
+ uint32 devmode_offset;
+ uint32 backup_offset;
prs_debug(ps, depth, desc, "smb_io_printer_info_2");
depth++;
@@ -982,8 +979,9 @@ static void smb_io_printer_info_2(char *desc, PRINTER_INFO_2 *info, prs_struct *
smb_io_relstr("comment", ps, depth, &(info->comment), start_offset, end_offset);
smb_io_relstr("location", ps, depth, &(info->location), start_offset, end_offset);
- smb_io_reldevmode("devmode", ps, depth, info->devmode, start_offset, end_offset);
-
+ devmode_offset=ps->offset;
+ ps->offset=ps->offset+4;
+
smb_io_relstr("sepfile", ps, depth, &(info->sepfile), start_offset, end_offset);
smb_io_relstr("printprocessor",ps, depth, &(info->printprocessor), start_offset, end_offset);
smb_io_relstr("datatype", ps, depth, &(info->datatype), start_offset, end_offset);
@@ -999,6 +997,15 @@ static void smb_io_printer_info_2(char *desc, PRINTER_INFO_2 *info, prs_struct *
prs_uint32("status", ps, depth, &(info->status));
prs_uint32("jobs", ps, depth, &(info->cjobs));
prs_uint32("averageppm", ps, depth, &(info->averageppm));
+
+ /*
+ I'm not sure if putting the devmode at the end the struct is worth it
+ but NT does it
+ */
+ backup_offset=ps->offset;
+ ps->offset=devmode_offset;
+ smb_io_reldevmode("devmode", ps, depth, info->devmode, start_offset, end_offset);
+ ps->offset=backup_offset;
}
/*******************************************************************
@@ -1184,7 +1191,8 @@ static uint32 spoolss_size_printer_info_2(PRINTER_INFO_2 *info)
int size=0;
size+=4; /* the security descriptor */
- size+=0xDC+4; /* size of the devmode and the ptr */
+ size+=info->devmode->size+4; /* size of the devmode and the ptr */
+ size+=info->devmode->driverextra; /* if a devmode->private section exists, add its size */
size+=size_of_relative_string( &(info->servername) );
size+=size_of_relative_string( &(info->printername) );
@@ -3307,7 +3315,7 @@ void spoolss_io_q_enumprintprocessors(char *desc, SPOOL_Q_ENUMPRINTPROCESSORS *q
********************************************************************/
void spoolss_io_r_enumprinterdata(char *desc, SPOOL_R_ENUMPRINTERDATA *r_u, prs_struct *ps, int depth)
{
- prs_debug(ps, depth, desc, "spoolss_io_r_enumprintprocessors");
+ prs_debug(ps, depth, desc, "spoolss_io_r_enumprinterdata");
depth++;
prs_align(ps);