1
0
mirror of https://github.com/samba-team/samba.git synced 2025-12-06 16:23:49 +03:00

fixed the pack/unpack of the devicemode

we were being bitten by uint16/uint32 mixups
This commit is contained in:
Andrew Tridgell
-
parent 46f5f41c88
commit 1d37f76953
2 changed files with 86 additions and 52 deletions

View File

@@ -186,11 +186,12 @@ typedef struct nt_printer_param
typedef struct ntdevicemode typedef struct ntdevicemode
{ {
fstring devicename; fstring devicename;
fstring formname;
uint16 specversion; uint16 specversion;
uint16 driverversion; uint16 driverversion;
uint16 size; uint16 size;
uint16 driverextra; uint16 driverextra;
uint32 fields;
uint16 orientation; uint16 orientation;
uint16 papersize; uint16 papersize;
uint16 paperlength; uint16 paperlength;
@@ -204,8 +205,9 @@ typedef struct ntdevicemode
uint16 yresolution; uint16 yresolution;
uint16 ttoption; uint16 ttoption;
uint16 collate; uint16 collate;
fstring formname;
uint16 logpixels; uint16 logpixels;
uint32 fields;
uint32 bitsperpel; uint32 bitsperpel;
uint32 pelswidth; uint32 pelswidth;
uint32 pelsheight; uint32 pelsheight;

View File

@@ -491,31 +491,44 @@ static int pack_devicemode(NT_DEVICEMODE *nt_devmode, char *buf, int buflen)
if (!nt_devmode) return len; if (!nt_devmode) return len;
len += tdb_pack(buf+len, buflen-len, "fddddddddddddddddddddddp", len += tdb_pack(buf+len, buflen-len, "fwwwwwwwwwwwwwwwwwwddddddddddddddp",
nt_devmode->formname, nt_devmode->formname,
nt_devmode->specversion,
nt_devmode->driverversion, nt_devmode->specversion,
nt_devmode->size, nt_devmode->driverversion,
nt_devmode->driverextra, nt_devmode->size,
nt_devmode->fields, nt_devmode->driverextra,
nt_devmode->orientation, nt_devmode->orientation,
nt_devmode->papersize, nt_devmode->papersize,
nt_devmode->paperlength, nt_devmode->paperlength,
nt_devmode->paperwidth, nt_devmode->paperwidth,
nt_devmode->scale, nt_devmode->scale,
nt_devmode->copies, nt_devmode->copies,
nt_devmode->defaultsource, nt_devmode->defaultsource,
nt_devmode->printquality, nt_devmode->printquality,
nt_devmode->color, nt_devmode->color,
nt_devmode->duplex, nt_devmode->duplex,
nt_devmode->yresolution, nt_devmode->yresolution,
nt_devmode->ttoption, nt_devmode->ttoption,
nt_devmode->collate, nt_devmode->collate,
nt_devmode->icmmethod, nt_devmode->logpixels,
nt_devmode->icmintent,
nt_devmode->mediatype, nt_devmode->fields,
nt_devmode->dithertype, nt_devmode->bitsperpel,
nt_devmode->private); nt_devmode->pelswidth,
nt_devmode->pelsheight,
nt_devmode->displayflags,
nt_devmode->displayfrequency,
nt_devmode->icmmethod,
nt_devmode->icmintent,
nt_devmode->mediatype,
nt_devmode->dithertype,
nt_devmode->reserved1,
nt_devmode->reserved2,
nt_devmode->panningwidth,
nt_devmode->panningheight,
nt_devmode->private);
if (nt_devmode->private) { if (nt_devmode->private) {
len += tdb_pack(buf+len, buflen-len, "B", len += tdb_pack(buf+len, buflen-len, "B",
@@ -523,6 +536,8 @@ static int pack_devicemode(NT_DEVICEMODE *nt_devmode, char *buf, int buflen)
nt_devmode->private); nt_devmode->private);
} }
DEBUG(8,("Packed devicemode [%s]\n", nt_devmode->formname));
return len; return len;
} }
@@ -652,6 +667,9 @@ static uint32 add_a_printer_2(NT_PRINTER_INFO_LEVEL_2 *info)
safe_free(buf); safe_free(buf);
DEBUG(8,("packed printer [%s] with form [%s] len=%d\n",
info->portname, info->devmode->formname, len));
return ret; return ret;
} }
@@ -893,31 +911,43 @@ static int unpack_devicemode(NT_DEVICEMODE **nt_devmode, char *buf, int buflen)
if (!*nt_devmode) return len; if (!*nt_devmode) return len;
len += tdb_unpack(buf+len, buflen-len, "fddddddddddddddddddddddp", len += tdb_unpack(buf+len, buflen-len, "fwwwwwwwwwwwwwwwwwwddddddddddddddp",
devmode.formname, devmode.formname,
&devmode.specversion,
&devmode.driverversion, &devmode.specversion,
&devmode.size, &devmode.driverversion,
&devmode.driverextra, &devmode.size,
&devmode.fields, &devmode.driverextra,
&devmode.orientation, &devmode.orientation,
&devmode.papersize, &devmode.papersize,
&devmode.paperlength, &devmode.paperlength,
&devmode.paperwidth, &devmode.paperwidth,
&devmode.scale, &devmode.scale,
&devmode.copies, &devmode.copies,
&devmode.defaultsource, &devmode.defaultsource,
&devmode.printquality, &devmode.printquality,
&devmode.color, &devmode.color,
&devmode.duplex, &devmode.duplex,
&devmode.yresolution, &devmode.yresolution,
&devmode.ttoption, &devmode.ttoption,
&devmode.collate, &devmode.collate,
&devmode.icmmethod, &devmode.logpixels,
&devmode.icmintent,
&devmode.mediatype, &devmode.fields,
&devmode.dithertype, &devmode.bitsperpel,
&devmode.private); &devmode.pelswidth,
&devmode.pelsheight,
&devmode.displayflags,
&devmode.displayfrequency,
&devmode.icmmethod,
&devmode.icmintent,
&devmode.mediatype,
&devmode.dithertype,
&devmode.reserved1,
&devmode.reserved2,
&devmode.panningwidth,
&devmode.panningheight,
&devmode.private);
if (devmode.private) { if (devmode.private) {
devmode.private = (uint8 *)malloc(devmode.driverextra); devmode.private = (uint8 *)malloc(devmode.driverextra);
@@ -929,6 +959,8 @@ static int unpack_devicemode(NT_DEVICEMODE **nt_devmode, char *buf, int buflen)
*nt_devmode = (NT_DEVICEMODE *)memdup(&devmode, sizeof(devmode)); *nt_devmode = (NT_DEVICEMODE *)memdup(&devmode, sizeof(devmode));
DEBUG(8,("Unpacked devicemode [%s]\n", devmode.formname));
return len; return len;
} }