s3:printing: Fix %J substition
authorRalph Boehme <slow@samba.org>
Thu, 31 Oct 2019 11:46:38 +0000 (12:46 +0100)
committerAndreas Schneider <asn@cryptomilk.org>
Thu, 7 Nov 2019 16:01:21 +0000 (16:01 +0000)
print_run_command() uses lp_print_command() which internally performs basic
substition by calling talloc_sub_basic(). As a result. any of the variables in
the "basic set", including "%J" are already substituted.

To prevent the unwanted subtitution, we declare all affected configuration
options as const, which disabled the basic substition.

As a result print_run_command() can run manual substitution on all characters,
including %J, in the variadic argument list *before* calling lp_string() to run
basic substition which we had disabled before with the const.

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

Signed-off-by: Ralph Boehme <slow@samba.org>
Reviewed-by: Andreas Schneider <asn@samba.org>
Autobuild-User(master): Andreas Schneider <asn@cryptomilk.org>
Autobuild-Date(master): Thu Nov  7 16:01:21 UTC 2019 on sn-devel-184

docs-xml/smbdotconf/printing/lppausecommand.xml
docs-xml/smbdotconf/printing/lpqcommand.xml
docs-xml/smbdotconf/printing/lpresumecommand.xml
docs-xml/smbdotconf/printing/lprmcommand.xml
docs-xml/smbdotconf/printing/printcommand.xml
docs-xml/smbdotconf/printing/queuepausecommand.xml
docs-xml/smbdotconf/printing/queueresumecommand.xml
source3/printing/print_generic.c
source3/printing/printing.c
source3/utils/testparm.c

index 3aa134c4377eaefbe4c7235ffdf23390995ee287..f2518d3def0565063008926ddfc39d70a1845473 100644 (file)
@@ -1,6 +1,7 @@
 <samba:parameter name="lppause command"
                  context="S"
                  type="string"
+                 constant="1"
                  xmlns:samba="http://www.samba.org/samba/DTD/samba-doc">
 <description>
     <para>This parameter specifies the command to be 
index f3c17f286d10c084b885ffad1a397645efd3b0c8..f0161f3448d0b9a2390b989cf278b7631b4dba4d 100644 (file)
@@ -1,6 +1,7 @@
 <samba:parameter name="lpq command"
                  context="S"
                  type="string"
+                 constant="1"
                  xmlns:samba="http://www.samba.org/samba/DTD/samba-doc">
  <description>
     <para>This parameter specifies the command to be 
index 153ba76a693f9c6b2da9b7d344c572d8500c3235..2cee574bd73472180e1b526dfd684f875e3f1a99 100644 (file)
@@ -1,6 +1,7 @@
 <samba:parameter name="lpresume command"
                  context="S"
                  type="string"
+                 constant="1"
                  xmlns:samba="http://www.samba.org/samba/DTD/samba-doc">
 <description>
     <para>This parameter specifies the command to be 
index 4b7f3dd75c35aff54d2172b4fbeeffa034418f51..a595c1225c0e1c5971bde7d975603fd5e74f09d3 100644 (file)
@@ -1,6 +1,7 @@
 <samba:parameter name="lprm command"
                  context="S"
                  type="string"
+                 constant="1"
                  xmlns:samba="http://www.samba.org/samba/DTD/samba-doc">
 <description>
     <para>This parameter specifies the command to be 
index c84e45f404decfbf0af5df8a7d7104ca69e14bef..42a7188cb9a5b76a6c44641cf33174cd3e426ebd 100644 (file)
@@ -1,6 +1,7 @@
 <samba:parameter name="print command"
                  context="S"
                  type="string"
+                 constant="1"
                  xmlns:samba="http://www.samba.org/samba/DTD/samba-doc">
 <description>
     <para>After a print job has finished spooling to 
index 5dca45657cccee77f1b37859612532b0ff9dee2e..600a2baa621331daa302af2ef22ff13bd2c0e05f 100644 (file)
@@ -1,6 +1,7 @@
 <samba:parameter name="queuepause command"
                  context="S"
                  type="string"
+                 constant="1"
                  xmlns:samba="http://www.samba.org/samba/DTD/samba-doc">
 <description>
     <para>This parameter specifies the command to be 
index 4a5733300481a272ef4c01290166e5e84f1fca7d..431295a804ea95b71b91801066ead93d7813ebe5 100644 (file)
@@ -1,6 +1,7 @@
 <samba:parameter name="queueresume command"
                  context="S"
                  type="string"
+                 constant="1"
                  xmlns:samba="http://www.samba.org/samba/DTD/samba-doc">
 <description>
     <para>This parameter specifies the command to be 
index d3c72dd6a9acc83f3a0f2b890a354322c831ec21..574f357c76c1efe66d61b72851f140f5ed005b4e 100644 (file)
@@ -73,14 +73,17 @@ static int print_run_command(int snum, const char* printername, bool do_sub,
                return -1;
        }
 
+       syscmd = lp_string(ctx, syscmd);
+       if (syscmd == NULL) {
+               return -1;
+       }
+
        if (do_sub && snum != -1) {
-               syscmd = talloc_sub_full(ctx,
+               syscmd = talloc_sub_advanced(ctx,
                                lp_servicename(talloc_tos(), snum),
                                current_user_info.unix_name,
                                "",
                                get_current_gid(NULL),
-                               get_current_username(),
-                               current_user_info.domain,
                                syscmd);
                if (!syscmd) {
                        return -1;
@@ -120,7 +123,7 @@ static int generic_job_pause(int snum, struct printjob *pjob)
        /* need to pause the spooled entry */
        slprintf(jobstr, sizeof(jobstr)-1, "%d", pjob->sysjob);
        return print_run_command(snum, lp_printername(talloc_tos(), snum), True,
-                                lp_lppause_command(talloc_tos(), snum), NULL,
+                                lp_lppause_command(snum), NULL,
                                 "%j", jobstr,
                                 NULL);
 }
@@ -135,7 +138,7 @@ static int generic_job_resume(int snum, struct printjob *pjob)
        /* need to pause the spooled entry */
        slprintf(jobstr, sizeof(jobstr)-1, "%d", pjob->sysjob);
        return print_run_command(snum, lp_printername(talloc_tos(), snum), True,
-                                lp_lpresume_command(talloc_tos(), snum), NULL,
+                                lp_lpresume_command(snum), NULL,
                                 "%j", jobstr,
                                 NULL);
 }
@@ -257,7 +260,7 @@ static int generic_job_submit(int snum, struct printjob *pjob,
 
        /* send it to the system spooler */
        ret = print_run_command(snum, lp_printername(talloc_tos(), snum), True,
-                       lp_print_command(talloc_tos(), snum), NULL,
+                       lp_print_command(snum), NULL,
                        "%s", p,
                        "%J", jobname,
                        "%f", p,
@@ -310,7 +313,7 @@ static int generic_job_submit(int snum, struct printjob *pjob,
 static int generic_queue_pause(int snum)
 {
        return print_run_command(snum, lp_printername(talloc_tos(), snum), True,
-                                lp_queuepause_command(talloc_tos(), snum), NULL, NULL);
+                                lp_queuepause_command(snum), NULL, NULL);
 }
 
 /****************************************************************************
@@ -319,7 +322,7 @@ static int generic_queue_pause(int snum)
 static int generic_queue_resume(int snum)
 {
        return print_run_command(snum, lp_printername(talloc_tos(), snum), True,
-                                lp_queueresume_command(talloc_tos(), snum), NULL, NULL);
+                                lp_queueresume_command(snum), NULL, NULL);
 }
 
 /****************************************************************************
index c6bf6ec69dd9a9235c2c7653b7094474123638ed..0f4db52e0110795f63dba8e2a19a83113ffee3cd 100644 (file)
@@ -1717,7 +1717,7 @@ static void print_queue_update(struct messaging_context *msg_ctx,
        /* don't strip out characters like '$' from the printername */
 
        lpqcommand = talloc_string_sub2(ctx,
-                       lp_lpq_command(talloc_tos(), snum),
+                       lp_lpq_command(snum),
                        "%p",
                        lp_printername(talloc_tos(), snum),
                        false, false, false);
@@ -1737,7 +1737,7 @@ static void print_queue_update(struct messaging_context *msg_ctx,
        }
 
        lprmcommand = talloc_string_sub2(ctx,
-                       lp_lprm_command(talloc_tos(), snum),
+                       lp_lprm_command(snum),
                        "%p",
                        lp_printername(talloc_tos(), snum),
                        false, false, false);
@@ -2199,7 +2199,7 @@ static bool print_job_delete1(struct tevent_context *ev,
        {
                result = (*(current_printif->job_delete))(
                        lp_printername(talloc_tos(), snum),
-                       lp_lprm_command(talloc_tos(), snum),
+                       lp_lprm_command(snum),
                        pjob);
 
                /* Delete the tdb entry if the delete succeeded or the job hasn't
@@ -3027,7 +3027,7 @@ NTSTATUS print_job_end(struct messaging_context *msg_ctx, int snum,
 
        /* don't strip out characters like '$' from the printername */
        lpq_cmd = talloc_string_sub2(tmp_ctx,
-                                    lp_lpq_command(talloc_tos(), snum),
+                                    lp_lpq_command(snum),
                                     "%p",
                                     lp_printername(talloc_tos(), snum),
                                     false, false, false);
index 9ba625da4bf411e6169590d1a67bf849ee684e77..f4e94b6ef7420ac23a85c09ace639d23abe8322e 100644 (file)
@@ -611,7 +611,7 @@ static void do_per_share_checks(int s)
                        "excludes octal 010 (S_IXGRP).\n\n",
                        lp_servicename(talloc_tos(), s));
        }
-       if (lp_printing(s) == PRINT_CUPS && *(lp_print_command(talloc_tos(), s)) != '\0') {
+       if (lp_printing(s) == PRINT_CUPS && *(lp_print_command(s)) != '\0') {
                fprintf(stderr,
                        "Warning: Service %s defines a print command, but "
                        "parameter is ignored when using CUPS libraries.\n\n",