The Samba-Bugzilla – Attachment 15504 Details for
Bug 13745
print command %J substitution
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
[x]
|
Forgot Password
Login:
[x]
[patch]
Tentative patch #2
samba-bz13745-wip-2.patch (text/plain), 13.37 KB, created by
Franz Sirl
on 2019-10-01 09:15:55 UTC
(
hide
)
Description:
Tentative patch #2
Filename:
MIME Type:
Creator:
Franz Sirl
Created:
2019-10-01 09:15:55 UTC
Size:
13.37 KB
patch
obsolete
>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/include/proto.h b/source3/include/proto.h >index ad6f3bbf9c3..dd4aba34fed 100644 >--- a/source3/include/proto.h >+++ b/source3/include/proto.h >@@ -180,15 +180,16 @@ char *talloc_sub_specified(TALLOC_CTX *mem_ctx, > const char *domain, > uid_t uid, > gid_t gid); >+char *talloc_sub_advanced_only(TALLOC_CTX *mem_ctx, >+ const char *servicename, const char *user, >+ const char *connectpath, gid_t gid, >+ const char *smb_name, const char *domain_name, >+ const char *str); > char *talloc_sub_advanced(TALLOC_CTX *mem_ctx, > const char *servicename, const char *user, > const char *connectpath, gid_t gid, > const char *smb_name, const char *domain_name, > const char *str); >-void standard_sub_advanced(const char *servicename, const char *user, >- const char *connectpath, gid_t gid, >- const char *smb_name, const char *domain_name, >- char *str, size_t len); > > /* The following definitions come from lib/sysquotas.c */ > >diff --git a/source3/lib/substitute.c b/source3/lib/substitute.c >index ea227c5ab68..c1bc05b9c15 100644 >--- a/source3/lib/substitute.c >+++ b/source3/lib/substitute.c >@@ -790,7 +790,7 @@ char *talloc_sub_specified(TALLOC_CTX *mem_ctx, > /**************************************************************************** > ****************************************************************************/ > >-char *talloc_sub_advanced(TALLOC_CTX *ctx, >+char *talloc_sub_advanced_only(TALLOC_CTX *ctx, > const char *servicename, > const char *user, > const char *connectpath, >@@ -799,12 +799,12 @@ char *talloc_sub_advanced(TALLOC_CTX *ctx, > const char *domain_name, > const char *str) > { >- char *a_string, *ret_string; >+ char *a_string; > char *b, *p, *s; > > a_string = talloc_strdup(talloc_tos(), str); > if (a_string == NULL) { >- DEBUG(0, ("talloc_sub_advanced: Out of memory!\n")); >+ DEBUG(0, ("talloc_sub_advanced_only: Out of memory!\n")); > return NULL; > } > >@@ -858,25 +858,29 @@ char *talloc_sub_advanced(TALLOC_CTX *ctx, > } > } > >- ret_string = talloc_sub_basic(ctx, smb_name, domain_name, a_string); >- TALLOC_FREE(a_string); >- return ret_string; >+ return a_string; > } > >-void standard_sub_advanced(const char *servicename, const char *user, >- const char *connectpath, gid_t gid, >- const char *smb_name, const char *domain_name, >- char *str, size_t len) >+char *talloc_sub_advanced(TALLOC_CTX *ctx, >+ const char *servicename, >+ const char *user, >+ const char *connectpath, >+ gid_t gid, >+ const char *smb_name, >+ const char *domain_name, >+ const char *str) > { >- char *s = talloc_sub_advanced(talloc_tos(), >- servicename, user, connectpath, >- gid, smb_name, domain_name, str); >+ char *a_string, *ret_string; > >- if (!s) { >- return; >+ a_string = talloc_sub_advanced_only(ctx, servicename, user, connectpath, >+ gid, smb_name, domain_name, str); >+ if (a_string == NULL) { >+ return NULL; > } >- strlcpy( str, s, len ); >- TALLOC_FREE( s ); >+ >+ ret_string = talloc_sub_basic(ctx, smb_name, domain_name, a_string); >+ TALLOC_FREE(a_string); >+ return ret_string; > } > > /****************************************************************************** >diff --git a/source3/printing/print_generic.c b/source3/printing/print_generic.c >index b6b50062caf..c58f8ddce0b 100644 >--- a/source3/printing/print_generic.c >+++ b/source3/printing/print_generic.c >@@ -56,6 +56,8 @@ static int print_run_command(int snum, const char* printername, bool do_sub, > return -1; > } > >+ DEBUG(3, ("Incoming command '%s'\n", syscmd)); >+ > while ((arg = va_arg(ap, char *))) { > char *value = va_arg(ap,char *); > syscmd = talloc_string_sub(ctx, syscmd, arg, value); >@@ -71,6 +73,11 @@ static int print_run_command(int snum, const char* printername, bool do_sub, > return -1; > } > >+ syscmd = lp_string(ctx, syscmd); >+ if (!syscmd) { >+ return -1; >+ } >+ > if (do_sub && snum != -1) { > syscmd = talloc_sub_advanced(ctx, > lp_servicename(talloc_tos(), snum), >@@ -118,7 +125,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); > } >@@ -133,7 +140,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); > } >@@ -255,7 +262,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, >@@ -308,7 +315,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); > } > > /**************************************************************************** >@@ -317,7 +324,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 e6caaa1222f..e7256046fea 100644 >--- a/source3/printing/printing.c >+++ b/source3/printing/printing.c >@@ -1717,14 +1717,14 @@ 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); > if (!lpqcommand) { > return; > } >- lpqcommand = talloc_sub_advanced(ctx, >+ lpqcommand = talloc_sub_advanced_only(ctx, > lp_servicename(talloc_tos(), snum), > current_user_info.unix_name, > "", >@@ -1737,14 +1737,14 @@ 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); > if (!lprmcommand) { > return; > } >- lprmcommand = talloc_sub_advanced(ctx, >+ lprmcommand = talloc_sub_advanced_only(ctx, > lp_servicename(talloc_tos(), snum), > current_user_info.unix_name, > "", >@@ -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 >@@ -2819,7 +2819,7 @@ WERROR print_job_start(const struct auth_session_info *server_info, > struct spoolss_DeviceMode *devmode, uint32_t *_jobid) > { > uint32_t jobid; >- char *path; >+ char *path, *userstr; > struct printjob pjob; > const char *sharename = lp_const_servicename(snum); > struct tdb_print_db *pdb = get_print_db_byname(sharename); >@@ -2866,12 +2866,17 @@ WERROR print_job_start(const struct auth_session_info *server_info, > > fstrcpy(pjob.clientmachine, clientmachine); > >- fstrcpy(pjob.user, lp_printjob_username(snum)); >- standard_sub_advanced(sharename, server_info->unix_info->sanitized_username, >+ userstr = talloc_sub_advanced_only(talloc_tos(), sharename, server_info->unix_info->sanitized_username, > path, server_info->unix_token->gid, > server_info->unix_info->sanitized_username, > server_info->info->domain_name, >- pjob.user, sizeof(pjob.user)); >+ lp_printjob_username(snum)); >+ if (userstr == NULL) { >+ fstrcpy(pjob.user, lp_printjob_username(snum)); >+ } else { >+ strlcpy(pjob.user, userstr, sizeof(pjob.user)); >+ TALLOC_FREE(userstr); >+ } > > fstrcpy(pjob.queuename, lp_const_servicename(snum)); > >@@ -3020,7 +3025,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); >@@ -3028,7 +3033,7 @@ NTSTATUS print_job_end(struct messaging_context *msg_ctx, int snum, > status = NT_STATUS_PRINT_CANCELLED; > goto fail; > } >- lpq_cmd = talloc_sub_advanced(tmp_ctx, >+ lpq_cmd = talloc_sub_advanced_only(tmp_ctx, > lp_servicename(talloc_tos(), snum), > current_user_info.unix_name, > "", >diff --git a/source3/utils/testparm.c b/source3/utils/testparm.c >index efa58a6a417..a2eabaf33e4 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",
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Raw
Actions:
View
Attachments on
bug 13745
:
14933
|
14934
|
15487
|
15504
|
15516
|
15613