1
0
mirror of https://github.com/samba-team/samba.git synced 2025-08-03 04:22:09 +03:00

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
This commit is contained in:
Ralph Boehme
2019-10-31 12:46:38 +01:00
committed by Andreas Schneider
parent ede00779ab
commit 8846887a55
10 changed files with 23 additions and 13 deletions

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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);
}
/****************************************************************************

View 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);

View 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",