]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
s3-spoolss: add and use spoolss_printerinfo2_to_setprinterinfo2().
authorGünther Deschner <gd@samba.org>
Thu, 3 Jun 2010 14:30:55 +0000 (16:30 +0200)
committerKarolin Seeger <kseeger@samba.org>
Mon, 6 Sep 2010 18:50:22 +0000 (20:50 +0200)
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).

source3/include/proto.h
source3/rpc_client/init_spoolss.c
source3/rpcclient/cmd_spoolss.c
source3/utils/net_rpc_printer.c

index 4d3fb636ac6f8a1c4be0d877db98ee7b7cbbb87c..483fd84a9bbecfe1aede592a6160ca6234cb36cf 100644 (file)
@@ -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  */
 
index 4c105ea3bc10e9d2482ac97011ef6cef4f6b3264..d557ff21de9bf453d8e329813ce16a3a150bfe1f 100644 (file)
@@ -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;
+}
index e6b8d69ad570939393ae5bf1b56ef000b0b74e56..2d79b1140ec721463dc2c2a02ba4ef310d25acca 100644 (file)
@@ -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;
index 6c11a2feb2ba878190c3ed0bf4a57de3f2996ad7..dfc150fa3b0891e1f807cd4f0823ef374f4cab29 100644 (file)
@@ -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,