]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
spoolss: clear PrinterInfo on GetPrinter error
authorDavid Disseldorp <ddiss@samba.org>
Wed, 17 Dec 2014 15:54:42 +0000 (16:54 +0100)
committerKarolin Seeger <kseeger@samba.org>
Wed, 14 Jan 2015 20:58:09 +0000 (21:58 +0100)
If an error is returned without zeroing a pre-allocated @info pointer,
then marshalling of the response will fail.

Bug: https://bugzilla.samba.org/show_bug.cgi?id=10984

Signed-off-by: David Disseldorp <ddiss@samba.org>
Reviewed-by: Andreas Schneider <asn@samba.org>
(cherry picked from commit a11e97b79645ff0d9e7d20f5318a979194a858fe)

source3/rpc_server/spoolss/srv_spoolss_nt.c

index cf2526d148ba9f4eea256a62cc46c9e39e6f50ce..17eee50a31ea438e7bbb6ce3d534130d2fc7b240 100644 (file)
@@ -4773,17 +4773,20 @@ WERROR _spoolss_GetPrinter(struct pipes_struct *p,
        /* that's an [in out] buffer */
 
        if (!r->in.buffer && (r->in.offered != 0)) {
-               return WERR_INVALID_PARAM;
+               result = WERR_INVALID_PARAM;
+               goto err_info_free;
        }
 
        *r->out.needed = 0;
 
        if (Printer == NULL) {
-               return WERR_BADFID;
+               result = WERR_BADFID;
+               goto err_info_free;
        }
 
        if (!get_printer_snum(p, r->in.handle, &snum, NULL)) {
-               return WERR_BADFID;
+               result = WERR_BADFID;
+               goto err_info_free;
        }
 
        result = winreg_get_printer_internal(p->mem_ctx,
@@ -4792,7 +4795,7 @@ WERROR _spoolss_GetPrinter(struct pipes_struct *p,
                                    lp_const_servicename(snum),
                                    &info2);
        if (!W_ERROR_IS_OK(result)) {
-               goto out;
+               goto err_info_free;
        }
 
        switch (r->in.level) {
@@ -4852,12 +4855,10 @@ WERROR _spoolss_GetPrinter(struct pipes_struct *p,
        }
        TALLOC_FREE(info2);
 
- out:
        if (!W_ERROR_IS_OK(result)) {
                DEBUG(0, ("_spoolss_GetPrinter: failed to construct printer info level %d - %s\n",
                          r->in.level, win_errstr(result)));
-               TALLOC_FREE(r->out.info);
-               return result;
+               goto err_info_free;
        }
 
        *r->out.needed  = SPOOLSS_BUFFER_UNION(spoolss_PrinterInfo,
@@ -4865,6 +4866,10 @@ WERROR _spoolss_GetPrinter(struct pipes_struct *p,
        r->out.info     = SPOOLSS_BUFFER_OK(r->out.info, NULL);
 
        return SPOOLSS_BUFFER_OK(WERR_OK, WERR_INSUFFICIENT_BUFFER);
+
+err_info_free:
+       TALLOC_FREE(r->out.info);
+       return result;
 }
 
 /********************************************************************