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:
committed by
Andreas Schneider
parent
ede00779ab
commit
8846887a55
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
|
@ -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);
|
||||
|
@ -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",
|
||||
|
Reference in New Issue
Block a user