s3: spoolss: Fix GUID string format on GetPrinter info
authorSamuel Cabrero <scabrero@suse.de>
Thu, 21 Sep 2017 07:53:35 +0000 (09:53 +0200)
committerJeremy Allison <jra@samba.org>
Fri, 6 Oct 2017 03:21:25 +0000 (05:21 +0200)
Fix regression introduced by commit a4157e7c5d75 which removed the braces
around the printer GUID in the printer info level 7 structure.

MS-RPRN section 2.2 says this protocol uses curly-braced GUIDs so printers
are deleted from the directory by the domain controller's pruning service.

BUG: https://bugzilla.samba.org/show_bug.cgi?id=12993

Signed-off-by: Samuel Cabrero <scabrero@suse.de>
Reviewed-by: David Disseldorp <ddiss@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
Autobuild-User(master): Jeremy Allison <jra@samba.org>
Autobuild-Date(master): Fri Oct  6 05:21:25 CEST 2017 on sn-devel-144

source3/rpc_server/spoolss/srv_spoolss_nt.c

index 663c62381d5d8e64bab0abe48a9433e8de80c71e..1476dc6bf159ce4f2a85052d6c1f78196fd19a9d 100644 (file)
@@ -4241,7 +4241,7 @@ static WERROR construct_printer_info7(TALLOC_CTX *mem_ctx,
        if (is_printer_published(tmp_ctx, session_info, msg_ctx,
                                 servername, printer, &pinfo2)) {
                struct GUID guid;
-               struct GUID_txt_buf guid_txt;
+               char *guidstr;
                werr = nt_printer_guid_get(tmp_ctx, session_info, msg_ctx,
                                           printer, &guid);
                if (!W_ERROR_IS_OK(werr)) {
@@ -4288,9 +4288,19 @@ static WERROR construct_printer_info7(TALLOC_CTX *mem_ctx,
                                          printer));
                        }
                }
-               r->guid = talloc_strdup_upper(mem_ctx,
-                                            GUID_buf_string(&guid, &guid_txt));
+
+               /* [MS-RPRN] section 2.2: must use curly-braced GUIDs */
+               guidstr = GUID_string2(mem_ctx, &guid);
+               if (guidstr == NULL) {
+                       werr = WERR_NOT_ENOUGH_MEMORY;
+                       goto out_tmp_free;
+               }
+               /* Convert GUID string to uppercase otherwise printers
+                * are pruned */
+               r->guid = talloc_strdup_upper(mem_ctx, guidstr);
                r->action = DSPRINT_PUBLISH;
+
+               TALLOC_FREE(guidstr);
        } else {
                r->guid = talloc_strdup(mem_ctx, "");
                r->action = DSPRINT_UNPUBLISH;