diff options
-rwxr-xr-x | source3/include/rpc_spoolss.h | 1 | ||||
-rw-r--r-- | source3/rpc_parse/parse_prs.c | 21 | ||||
-rw-r--r-- | source3/rpc_parse/parse_spoolss.c | 37 |
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; |