summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGerald Carter <jerry@samba.org>2002-07-09 23:23:19 +0000
committerGerald Carter <jerry@samba.org>2002-07-09 23:23:19 +0000
commit51eeaa494cf88b3f2438406cd8f716091069134f (patch)
treeb900b1b93f6bffb25d3808568b123df015ff672c
parent8d26bc35813896fa2bedfb8ebddf03c349163370 (diff)
downloadsamba-51eeaa494cf88b3f2438406cd8f716091069134f.tar.gz
samba-51eeaa494cf88b3f2438406cd8f716091069134f.tar.bz2
samba-51eeaa494cf88b3f2438406cd8f716091069134f.zip
8-byte alignment needed for beginning driver_info_level_6.
Verified by looking at NT4 and 2k servers. First time for everything I guess. (This used to be commit f57640720e4758176116bc2e1b578cf0e867f95f)
-rwxr-xr-xsource3/include/rpc_spoolss.h1
-rw-r--r--source3/rpc_parse/parse_prs.c21
-rw-r--r--source3/rpc_parse/parse_spoolss.c37
3 files changed, 36 insertions, 23 deletions
diff --git a/source3/include/rpc_spoolss.h b/source3/include/rpc_spoolss.h
index d16d528904..82062d5278 100755
--- a/source3/include/rpc_spoolss.h
+++ b/source3/include/rpc_spoolss.h
@@ -1513,7 +1513,6 @@ SPOOL_PRINTER_DRIVER_INFO_LEVEL_3;
/* SPOOL_PRINTER_DRIVER_INFO_LEVEL_6 structure */
typedef struct {
- uint32 unknown;
uint32 version;
uint32 name_ptr;
uint32 environment_ptr;
diff --git a/source3/rpc_parse/parse_prs.c b/source3/rpc_parse/parse_prs.c
index 05f38ddd23..2ab8c7246e 100644
--- a/source3/rpc_parse/parse_prs.c
+++ b/source3/rpc_parse/parse_prs.c
@@ -447,6 +447,10 @@ BOOL prs_align(prs_struct *ps)
return True;
}
+/******************************************************************
+ Align on a 2 byte boundary
+ *****************************************************************/
+
BOOL prs_align_uint16(prs_struct *ps)
{
BOOL ret;
@@ -455,6 +459,23 @@ BOOL prs_align_uint16(prs_struct *ps)
ps->align = 2;
ret = prs_align(ps);
ps->align = old_align;
+
+ return ret;
+}
+
+/******************************************************************
+ Align on a 8 byte boundary
+ *****************************************************************/
+
+BOOL prs_align_uint64(prs_struct *ps)
+{
+ BOOL ret;
+ uint8 old_align = ps->align;
+
+ ps->align = 8;
+ ret = prs_align(ps);
+ ps->align = old_align;
+
return ret;
}
diff --git a/source3/rpc_parse/parse_spoolss.c b/source3/rpc_parse/parse_spoolss.c
index 0bcace8a00..c74249878a 100644
--- a/source3/rpc_parse/parse_spoolss.c
+++ b/source3/rpc_parse/parse_spoolss.c
@@ -5034,39 +5034,32 @@ BOOL spool_io_printer_driver_info_level_6(char *desc, SPOOL_PRINTER_DRIVER_INFO_
if(!prs_align(ps))
return False;
- if (!prs_uint32("unknown ", ps, depth, &il->unknown))
+ /*
+ * I know this seems weird, but I have no other explanation.
+ * This is observed behavior on both NT4 and 2K servers.
+ * --jerry
+ */
+
+ if (!prs_align_uint64(ps))
return False;
/* parse the main elements the packet */
- if(!prs_uint32("cversion ", ps, depth, &il->version))
+ if(!prs_uint32("cversion ", ps, depth, &il->version))
return False;
-
- if(!prs_uint32("name ", ps, depth, &il->name_ptr))
+ if(!prs_uint32("name ", ps, depth, &il->name_ptr))
return False;
-
- /*
- * If name_ptr is NULL then the next 4 bytes are the name_ptr. A driver
- * with a NULL name just isn't a driver For example: "HP LaserJet 4si"
- * from W2K CDROM (which uses unidriver). JohnR 010205
- */
- if (!il->name_ptr) {
- DEBUG(5,("spool_io_printer_driver_info_level_6: name_ptr is NULL! Get next value\n"));
- if(!prs_uint32("name_ptr", ps, depth, &il->name_ptr))
- return False;
- }
-
- if(!prs_uint32("environment", ps, depth, &il->environment_ptr))
+ if(!prs_uint32("environment ", ps, depth, &il->environment_ptr))
return False;
- if(!prs_uint32("driverpath ", ps, depth, &il->driverpath_ptr))
+ if(!prs_uint32("driverpath ", ps, depth, &il->driverpath_ptr))
return False;
- if(!prs_uint32("datafile ", ps, depth, &il->datafile_ptr))
+ if(!prs_uint32("datafile ", ps, depth, &il->datafile_ptr))
return False;
- if(!prs_uint32("configfile ", ps, depth, &il->configfile_ptr))
+ if(!prs_uint32("configfile ", ps, depth, &il->configfile_ptr))
return False;
- if(!prs_uint32("helpfile ", ps, depth, &il->helpfile_ptr))
+ if(!prs_uint32("helpfile ", ps, depth, &il->helpfile_ptr))
return False;
- if(!prs_uint32("monitorname", ps, depth, &il->monitorname_ptr))
+ if(!prs_uint32("monitorname ", ps, depth, &il->monitorname_ptr))
return False;
if(!prs_uint32("defaultdatatype", ps, depth, &il->defaultdatatype_ptr))
return False;