1
0
mirror of https://github.com/samba-team/samba.git synced 2025-01-26 10:04:02 +03:00

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)
This commit is contained in:
Gerald Carter 2002-07-09 23:23:19 +00:00
parent 8d26bc3581
commit 51eeaa494c
3 changed files with 36 additions and 23 deletions

View File

@ -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;

View File

@ -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;
}

View File

@ -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;