diff options
author | Ralph Boehme <slow@samba.org> | 2019-10-31 12:46:38 +0100 |
---|---|---|
committer | Andreas Schneider <asn@cryptomilk.org> | 2019-11-07 16:01:21 +0000 |
commit | 8846887a55b0c97a1639fc6ecb228941cf16b8f2 (patch) | |
tree | d268d59c43fa3b7506ff88adb252fef7b20b3128 | |
parent | ede00779ab2d881e061adb9d861879e8c68e272b (diff) | |
download | samba-8846887a55b0c97a1639fc6ecb228941cf16b8f2.tar.gz |
s3:printing: Fix %J substition
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
-rw-r--r-- | docs-xml/smbdotconf/printing/lppausecommand.xml | 1 | ||||
-rw-r--r-- | docs-xml/smbdotconf/printing/lpqcommand.xml | 1 | ||||
-rw-r--r-- | docs-xml/smbdotconf/printing/lpresumecommand.xml | 1 | ||||
-rw-r--r-- | docs-xml/smbdotconf/printing/lprmcommand.xml | 1 | ||||
-rw-r--r-- | docs-xml/smbdotconf/printing/printcommand.xml | 1 | ||||
-rw-r--r-- | docs-xml/smbdotconf/printing/queuepausecommand.xml | 1 | ||||
-rw-r--r-- | docs-xml/smbdotconf/printing/queueresumecommand.xml | 1 | ||||
-rw-r--r-- | source3/printing/print_generic.c | 19 | ||||
-rw-r--r-- | source3/printing/printing.c | 8 | ||||
-rw-r--r-- | source3/utils/testparm.c | 2 |
10 files changed, 23 insertions, 13 deletions
diff --git a/docs-xml/smbdotconf/printing/lppausecommand.xml b/docs-xml/smbdotconf/printing/lppausecommand.xml index 3aa134c4377..f2518d3def0 100644 --- a/docs-xml/smbdotconf/printing/lppausecommand.xml +++ b/docs-xml/smbdotconf/printing/lppausecommand.xml @@ -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 diff --git a/docs-xml/smbdotconf/printing/lpqcommand.xml b/docs-xml/smbdotconf/printing/lpqcommand.xml index f3c17f286d1..f0161f3448d 100644 --- a/docs-xml/smbdotconf/printing/lpqcommand.xml +++ b/docs-xml/smbdotconf/printing/lpqcommand.xml @@ -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 diff --git a/docs-xml/smbdotconf/printing/lpresumecommand.xml b/docs-xml/smbdotconf/printing/lpresumecommand.xml index 153ba76a693..2cee574bd73 100644 --- a/docs-xml/smbdotconf/printing/lpresumecommand.xml +++ b/docs-xml/smbdotconf/printing/lpresumecommand.xml @@ -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 diff --git a/docs-xml/smbdotconf/printing/lprmcommand.xml b/docs-xml/smbdotconf/printing/lprmcommand.xml index 4b7f3dd75c3..a595c1225c0 100644 --- a/docs-xml/smbdotconf/printing/lprmcommand.xml +++ b/docs-xml/smbdotconf/printing/lprmcommand.xml @@ -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 diff --git a/docs-xml/smbdotconf/printing/printcommand.xml b/docs-xml/smbdotconf/printing/printcommand.xml index c84e45f404d..42a7188cb9a 100644 --- a/docs-xml/smbdotconf/printing/printcommand.xml +++ b/docs-xml/smbdotconf/printing/printcommand.xml @@ -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 diff --git a/docs-xml/smbdotconf/printing/queuepausecommand.xml b/docs-xml/smbdotconf/printing/queuepausecommand.xml index 5dca45657cc..600a2baa621 100644 --- a/docs-xml/smbdotconf/printing/queuepausecommand.xml +++ b/docs-xml/smbdotconf/printing/queuepausecommand.xml @@ -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 diff --git a/docs-xml/smbdotconf/printing/queueresumecommand.xml b/docs-xml/smbdotconf/printing/queueresumecommand.xml index 4a573330048..431295a804e 100644 --- a/docs-xml/smbdotconf/printing/queueresumecommand.xml +++ b/docs-xml/smbdotconf/printing/queueresumecommand.xml @@ -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 diff --git a/source3/printing/print_generic.c b/source3/printing/print_generic.c index d3c72dd6a9a..574f357c76c 100644 --- a/source3/printing/print_generic.c +++ b/source3/printing/print_generic.c @@ -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); } /**************************************************************************** diff --git a/source3/printing/printing.c b/source3/printing/printing.c index c6bf6ec69dd..0f4db52e011 100644 --- a/source3/printing/printing.c +++ b/source3/printing/printing.c @@ -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); diff --git a/source3/utils/testparm.c b/source3/utils/testparm.c index 9ba625da4bf..f4e94b6ef74 100644 --- a/source3/utils/testparm.c +++ b/source3/utils/testparm.c @@ -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", |