From: Günther Deschner Date: Thu, 3 Jun 2010 14:30:55 +0000 (+0200) Subject: s3-spoolss: add and use spoolss_printerinfo2_to_setprinterinfo2(). X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1a4a8e9bfb146276174a3723e3f20897e0443542;p=thirdparty%2Fsamba.git s3-spoolss: add and use spoolss_printerinfo2_to_setprinterinfo2(). This fixes some invalid typecasts. Guenther The last 3 patches address bug #7658 (fix some "dereferencing type-punned pointer will break strict-aliasing rules" warnings). --- diff --git a/source3/include/proto.h b/source3/include/proto.h index 4d3fb636ac6..483fd84a9bb 100644 --- a/source3/include/proto.h +++ b/source3/include/proto.h @@ -5595,6 +5595,8 @@ WERROR pull_spoolss_PrinterData(TALLOC_CTX *mem_ctx, WERROR push_spoolss_PrinterData(TALLOC_CTX *mem_ctx, DATA_BLOB *blob, enum winreg_Type type, union spoolss_PrinterData *data); +void spoolss_printerinfo2_to_setprinterinfo2(const struct spoolss_PrinterInfo2 *i, + struct spoolss_SetPrinterInfo2 *s); /* The following definitions come from rpc_client/init_lsa.c */ diff --git a/source3/rpc_client/init_spoolss.c b/source3/rpc_client/init_spoolss.c index 4c105ea3bc1..d557ff21de9 100644 --- a/source3/rpc_client/init_spoolss.c +++ b/source3/rpc_client/init_spoolss.c @@ -73,3 +73,32 @@ WERROR push_spoolss_PrinterData(TALLOC_CTX *mem_ctx, DATA_BLOB *blob, } return WERR_OK; } + +/******************************************************************* + ********************************************************************/ + +void spoolss_printerinfo2_to_setprinterinfo2(const struct spoolss_PrinterInfo2 *i, + struct spoolss_SetPrinterInfo2 *s) +{ + s->servername = i->servername; + s->printername = i->printername; + s->sharename = i->sharename; + s->portname = i->portname; + s->drivername = i->drivername; + s->comment = i->comment; + s->location = i->location; + s->devmode_ptr = 0; + s->sepfile = i->sepfile; + s->printprocessor = i->printprocessor; + s->datatype = i->datatype; + s->parameters = i->parameters; + s->secdesc_ptr = 0; + s->attributes = i->attributes; + s->priority = i->priority; + s->defaultpriority = i->defaultpriority; + s->starttime = i->starttime; + s->untiltime = i->untiltime; + s->status = i->status; + s->cjobs = i->cjobs; + s->averageppm = i->averageppm; +} diff --git a/source3/rpcclient/cmd_spoolss.c b/source3/rpcclient/cmd_spoolss.c index e6b8d69ad57..2d79b1140ec 100644 --- a/source3/rpcclient/cmd_spoolss.c +++ b/source3/rpcclient/cmd_spoolss.c @@ -502,27 +502,8 @@ static WERROR cmd_spoolss_setprinter(struct rpc_pipe_client *cli, /* Modify the comment. */ - info2.servername = info.info2.servername; - info2.printername = info.info2.printername; - info2.sharename = info.info2.sharename; - info2.portname = info.info2.portname; - info2.drivername = info.info2.drivername; - info2.comment = comment; - info2.location = info.info2.location; - info2.devmode_ptr = 0; - info2.sepfile = info.info2.sepfile; - info2.printprocessor = info.info2.printprocessor; - info2.datatype = info.info2.datatype; - info2.parameters = info.info2.parameters; - info2.secdesc_ptr = 0; - info2.attributes = info.info2.attributes; - info2.priority = info.info2.priority; - info2.defaultpriority = info.info2.defaultpriority; - info2.starttime = info.info2.starttime; - info2.untiltime = info.info2.untiltime; - info2.status = info.info2.status; - info2.cjobs = info.info2.cjobs; - info2.averageppm = info.info2.averageppm; + spoolss_printerinfo2_to_setprinterinfo2(&info.info2, &info2); + info2.comment = comment; info_ctr.level = 2; info_ctr.info.info2 = &info2; @@ -597,27 +578,8 @@ static WERROR cmd_spoolss_setprintername(struct rpc_pipe_client *cli, goto done; /* Modify the printername. */ - info2.servername = info.info2.servername; - info2.printername = new_printername; - info2.sharename = info.info2.sharename; - info2.portname = info.info2.portname; - info2.drivername = info.info2.drivername; - info2.comment = info.info2.comment; - info2.location = info.info2.location; - info2.devmode_ptr = 0; - info2.sepfile = info.info2.sepfile; - info2.printprocessor = info.info2.printprocessor; - info2.datatype = info.info2.datatype; - info2.parameters = info.info2.parameters; - info2.secdesc_ptr = 0; - info2.attributes = info.info2.attributes; - info2.priority = info.info2.priority; - info2.defaultpriority = info.info2.defaultpriority; - info2.starttime = info.info2.starttime; - info2.untiltime = info.info2.untiltime; - info2.status = info.info2.status; - info2.cjobs = info.info2.cjobs; - info2.averageppm = info.info2.averageppm; + spoolss_printerinfo2_to_setprinterinfo2(&info.info2, &info2); + info2.printername = new_printername; info_ctr.level = 2; info_ctr.info.info2 = &info2; @@ -1814,27 +1776,8 @@ static WERROR cmd_spoolss_setdriver(struct rpc_pipe_client *cli, /* Set the printer driver */ - info2.servername = info.info2.servername; - info2.printername = info.info2.printername; - info2.sharename = info.info2.sharename; - info2.portname = info.info2.portname; - info2.drivername = argv[2]; - info2.comment = info.info2.comment; - info2.location = info.info2.location; - info2.devmode_ptr = 0; - info2.sepfile = info.info2.sepfile; - info2.printprocessor = info.info2.printprocessor; - info2.datatype = info.info2.datatype; - info2.parameters = info.info2.parameters; - info2.secdesc_ptr = 0; - info2.attributes = info.info2.attributes; - info2.priority = info.info2.priority; - info2.defaultpriority = info.info2.defaultpriority; - info2.starttime = info.info2.starttime; - info2.untiltime = info.info2.untiltime; - info2.status = info.info2.status; - info2.cjobs = info.info2.cjobs; - info2.averageppm = info.info2.averageppm; + spoolss_printerinfo2_to_setprinterinfo2(&info.info2, &info2); + info2.drivername = argv[2]; info_ctr.level = 2; info_ctr.info.info2 = &info2; diff --git a/source3/utils/net_rpc_printer.c b/source3/utils/net_rpc_printer.c index 6c11a2feb2b..dfc150fa3b0 100644 --- a/source3/utils/net_rpc_printer.c +++ b/source3/utils/net_rpc_printer.c @@ -754,6 +754,7 @@ static bool net_spoolss_setprinter(struct rpc_pipe_client *pipe_hnd, WERROR result; NTSTATUS status; struct spoolss_SetPrinterInfoCtr info_ctr; + struct spoolss_SetPrinterInfo2 info2; struct spoolss_DevmodeContainer devmode_ctr; struct sec_desc_buf secdesc_ctr; @@ -773,8 +774,8 @@ static bool net_spoolss_setprinter(struct rpc_pipe_client *pipe_hnd, (void *)&info->info1; break; case 2: - info_ctr.info.info2 = (struct spoolss_SetPrinterInfo2 *) - (void *)&info->info2; + spoolss_printerinfo2_to_setprinterinfo2(&info->info2, &info2); + info_ctr.info.info2 = &info2; break; case 3: info_ctr.info.info3 = (struct spoolss_SetPrinterInfo3 *) @@ -2044,6 +2045,8 @@ NTSTATUS rpc_printer_migrate_printers_internals(struct net_context *c, /* do something for all printers */ for (i = 0; i < num_printers; i++) { + struct spoolss_SetPrinterInfo2 info2; + /* do some initialization */ printername = info_enum[i].info2.printername; sharename = info_enum[i].info2.sharename; @@ -2095,8 +2098,8 @@ NTSTATUS rpc_printer_migrate_printers_internals(struct net_context *c, d_printf(_("creating printer: %s\n"), printername); info_ctr.level = level; - info_ctr.info.info2 = (struct spoolss_SetPrinterInfo2 *) - (void *)&info_src.info2; + spoolss_printerinfo2_to_setprinterinfo2(&info_src.info2, &info2); + info_ctr.info.info2 = &info2; result = rpccli_spoolss_addprinterex(pipe_hnd_dst, mem_ctx,