[SCM] Samba Shared Repository - branch v4-5-test updated

[email protected] (Karolin Seeger)
Newsgroups gmane.network.samba.cvs
Message-ID <[email protected]>
The branch, v4-5-test has been updated
       via  71aa6de s3-printing: Allow printer names longer than 16 chars
       via  6958a24 s3-printing: Correctly encode CUPS printer URIs
      from  0d08df6 vfs:glusterfs: preallocate result for glfs_realpath

https://git.samba.org/?p=samba.git;a=shortlog;h=v4-5-test


- Log -----------------------------------------------------------------
commit 71aa6de4dc0bdf450481f374d18034a28e85ff37
Author: Andreas Schneider <[email protected]>
Date:   Thu Nov 10 11:47:54 2016 +0100

    s3-printing: Allow printer names longer than 16 chars
    
    Printers with long names are supported in the meantime. However we issue
    a warning that if one printer exceeeds 15 chars we warn about it.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=12195
    
    Signed-off-by: Andreas Schneider <[email protected]>
    Reviewed-by: Jeremy Allison <[email protected]>
    
    (cherry picked from commit 2611fd02a0a6a0a0a506df70fe1a1eb4a2e76062)
    
    Autobuild-User(v4-5-test): Karolin Seeger <[email protected]>
    Autobuild-Date(v4-5-test): Mon Nov 14 16:18:40 CET 2016 on sn-devel-144

commit 6958a2481c26a7b5b6be03c88a32a002efb520f2
Author: Andreas Schneider <[email protected]>
Date:   Wed Nov 9 19:05:49 2016 +0100

    s3-printing: Correctly encode CUPS printer URIs
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=12183
    
    Signed-off-by: Andreas Schneider <[email protected]>
    Reviewed-by: Jeremy Allison <[email protected]>
    
    (cherry picked from commit c160ae9afb222466c50ae170447a6a0805f7169f)

-----------------------------------------------------------------------

Summary of changes:
 source3/printing/print_cups.c     | 128 ++++++++++++++++++++++++++++++++------
 source3/printing/print_standard.c |  55 ++++++++++------
 2 files changed, 147 insertions(+), 36 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/printing/print_cups.c b/source3/printing/print_cups.c
index 756d67a..673a150 100644
--- a/source3/printing/print_cups.c
+++ b/source3/printing/print_cups.c
@@ -615,7 +615,8 @@ static int cups_job_delete(const char *sharename, const char *lprm_command, stru
 			*response = NULL;	/* IPP Response */
 	cups_lang_t	*language = NULL;	/* Default language */
 	char *user = NULL;
-	char		uri[HTTP_MAX_URI]; /* printer-uri attribute */
+	char		uri[HTTP_MAX_URI] = {0}; /* printer-uri attribute */
+	http_uri_status_t ustatus;
 	size_t size;
 
 	DEBUG(5,("cups_job_delete(%s, %p (%d))\n", sharename, pjob, pjob->sysjob));
@@ -657,7 +658,18 @@ static int cups_job_delete(const char *sharename, const char *lprm_command, stru
 	ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
         	     "attributes-natural-language", NULL, language->language);
 
-	slprintf(uri, sizeof(uri) - 1, "ipp://localhost/jobs/%d", pjob->sysjob);
+	ustatus = httpAssembleURIf(HTTP_URI_CODING_ALL,
+				   uri,
+				   sizeof(uri),
+				   "ipp",
+				   NULL, /* username */
+				   "localhost",
+				   ippPort(),
+				   "/jobs/%d",
+				   pjob->sysjob);
+	if (ustatus != HTTP_URI_STATUS_OK) {
+		goto out;
+	}
 
 	ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "job-uri", NULL, uri);
 
@@ -712,7 +724,8 @@ static int cups_job_pause(int snum, struct printjob *pjob)
 			*response = NULL;	/* IPP Response */
 	cups_lang_t	*language = NULL;	/* Default language */
 	char *user = NULL;
-	char		uri[HTTP_MAX_URI]; /* printer-uri attribute */
+	char		uri[HTTP_MAX_URI] = {0}; /* printer-uri attribute */
+	http_uri_status_t ustatus;
 	size_t size;
 
 	DEBUG(5,("cups_job_pause(%d, %p (%d))\n", snum, pjob, pjob->sysjob));
@@ -754,7 +767,18 @@ static int cups_job_pause(int snum, struct printjob *pjob)
 	ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
         	     "attributes-natural-language", NULL, language->language);
 
-	slprintf(uri, sizeof(uri) - 1, "ipp://localhost/jobs/%d", pjob->sysjob);
+	ustatus = httpAssembleURIf(HTTP_URI_CODING_ALL,
+				   uri,
+				   sizeof(uri),
+				   "ipp",
+				   NULL, /* username */
+				   "localhost",
+				   ippPort(),
+				   "/jobs/%d",
+				   pjob->sysjob);
+	if (ustatus != HTTP_URI_STATUS_OK) {
+		goto out;
+	}
 
 	ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "job-uri", NULL, uri);
 
@@ -808,7 +832,8 @@ static int cups_job_resume(int snum, struct printjob *pjob)
 			*response = NULL;	/* IPP Response */
 	cups_lang_t	*language = NULL;	/* Default language */
 	char *user = NULL;
-	char		uri[HTTP_MAX_URI]; /* printer-uri attribute */
+	char		uri[HTTP_MAX_URI] = {0}; /* printer-uri attribute */
+	http_uri_status_t ustatus;
 	size_t size;
 
 	DEBUG(5,("cups_job_resume(%d, %p (%d))\n", snum, pjob, pjob->sysjob));
@@ -850,7 +875,18 @@ static int cups_job_resume(int snum, struct printjob *pjob)
 	ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
         	     "attributes-natural-language", NULL, language->language);
 
-	slprintf(uri, sizeof(uri) - 1, "ipp://localhost/jobs/%d", pjob->sysjob);
+	ustatus = httpAssembleURIf(HTTP_URI_CODING_ALL,
+				   uri,
+				   sizeof(uri),
+				   "ipp",
+				   NULL, /* username */
+				   "localhost",
+				   ippPort(),
+				   "/jobs/%d",
+				   pjob->sysjob);
+	if (ustatus != HTTP_URI_STATUS_OK) {
+		goto out;
+	}
 
 	ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "job-uri", NULL, uri);
 
@@ -906,7 +942,8 @@ static int cups_job_submit(int snum, struct printjob *pjob,
 			*response = NULL;	/* IPP Response */
 	ipp_attribute_t *attr_job_id = NULL;	/* IPP Attribute "job-id" */
 	cups_lang_t	*language = NULL;	/* Default language */
-	char		uri[HTTP_MAX_URI]; /* printer-uri attribute */
+	char		uri[HTTP_MAX_URI] = {0}; /* printer-uri attribute */
+	http_uri_status_t ustatus;
 	char *new_jobname = NULL;
 	int		num_options = 0;
 	cups_option_t 	*options = NULL;
@@ -962,8 +999,18 @@ static int cups_job_submit(int snum, struct printjob *pjob,
 			      &size)) {
 		goto out;
 	}
-	slprintf(uri, sizeof(uri) - 1, "ipp://localhost/printers/%s",
-	         printername);
+	ustatus = httpAssembleURIf(HTTP_URI_CODING_ALL,
+				   uri,
+				   sizeof(uri),
+				   "ipp",
+				   NULL, /* username */
+				   "localhost",
+				   ippPort(),
+				   "/printers/%s",
+				   printername);
+	if (ustatus != HTTP_URI_STATUS_OK) {
+		goto out;
+	}
 
 	ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI,
         	     "printer-uri", NULL, uri);
@@ -1010,7 +1057,18 @@ static int cups_job_submit(int snum, struct printjob *pjob,
 	* Do the request and get back a response...
 	*/
 
-	slprintf(uri, sizeof(uri) - 1, "/printers/%s", printername);
+	ustatus = httpAssembleURIf(HTTP_URI_CODING_ALL,
+				   uri,
+				   sizeof(uri),
+				   "ipp",
+				   NULL, /* username */
+				   "localhost",
+				   ippPort(),
+				   "/printers/%s",
+				   printername);
+	if (ustatus != HTTP_URI_STATUS_OK) {
+		goto out;
+	}
 
 	if (!push_utf8_talloc(frame, &filename, pjob->filename, &size)) {
 		goto out;
@@ -1072,7 +1130,8 @@ static int cups_queue_get(const char *sharename,
 			*response = NULL;	/* IPP Response */
 	ipp_attribute_t	*attr = NULL;		/* Current attribute */
 	cups_lang_t	*language = NULL;	/* Default language */
-	char		uri[HTTP_MAX_URI]; /* printer-uri attribute */
+	char		uri[HTTP_MAX_URI] = {0}; /* printer-uri attribute */
+	http_uri_status_t ustatus;
 	int		qcount = 0,		/* Number of active queue entries */
 			qalloc = 0;		/* Number of queue entries allocated */
 	print_queue_struct *queue = NULL,	/* Queue entries */
@@ -1132,7 +1191,18 @@ static int cups_queue_get(const char *sharename,
         * Generate the printer URI...
 	*/
 
-	slprintf(uri, sizeof(uri) - 1, "ipp://localhost/printers/%s", printername);
+	ustatus = httpAssembleURIf(HTTP_URI_CODING_ALL,
+				   uri,
+				   sizeof(uri),
+				   "ipp",
+				   NULL, /* username */
+				   "localhost",
+				   ippPort(),
+				   "/printers/%s",
+				   printername);
+	if (ustatus != HTTP_URI_STATUS_OK) {
+		goto out;
+	}
 
        /*
 	* Build an IPP_GET_JOBS request, which requires the following
@@ -1415,7 +1485,8 @@ static int cups_queue_pause(int snum)
 	cups_lang_t	*language = NULL;	/* Default language */
 	char *printername = NULL;
 	char *username = NULL;
-	char		uri[HTTP_MAX_URI]; /* printer-uri attribute */
+	char		uri[HTTP_MAX_URI] = {0}; /* printer-uri attribute */
+	http_uri_status_t ustatus;
 	size_t size;
 
 	DEBUG(5,("cups_queue_pause(%d)\n", snum));
@@ -1461,8 +1532,18 @@ static int cups_queue_pause(int snum)
 			      lp_printername(talloc_tos(), snum), &size)) {
 		goto out;
 	}
-	slprintf(uri, sizeof(uri) - 1, "ipp://localhost/printers/%s",
-	         printername);
+	ustatus = httpAssembleURIf(HTTP_URI_CODING_ALL,
+				   uri,
+				   sizeof(uri),
+				   "ipp",
+				   NULL, /* username */
+				   "localhost",
+				   ippPort(),
+				   "/printers/%s",
+				   printername);
+	if (ustatus != HTTP_URI_STATUS_OK) {
+		goto out;
+	}
 
 	ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, uri);
 
@@ -1519,7 +1600,8 @@ static int cups_queue_resume(int snum)
 	cups_lang_t	*language = NULL;	/* Default language */
 	char *printername = NULL;
 	char *username = NULL;
-	char		uri[HTTP_MAX_URI]; /* printer-uri attribute */
+	char		uri[HTTP_MAX_URI] = {0}; /* printer-uri attribute */
+	http_uri_status_t ustatus;
 	size_t size;
 
 	DEBUG(5,("cups_queue_resume(%d)\n", snum));
@@ -1565,8 +1647,18 @@ static int cups_queue_resume(int snum)
 			      &size)) {
 		goto out;
 	}
-	slprintf(uri, sizeof(uri) - 1, "ipp://localhost/printers/%s",
-	         printername);
+	ustatus = httpAssembleURIf(HTTP_URI_CODING_ALL,
+				   uri,
+				   sizeof(uri),
+				   "ipp",
+				   NULL, /* username */
+				   "localhost",
+				   ippPort(),
+				   "/printers/%s",
+				   printername);
+	if (ustatus != HTTP_URI_STATUS_OK) {
+		goto out;
+	}
 
 	ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, uri);
 
diff --git a/source3/printing/print_standard.c b/source3/printing/print_standard.c
index b5f1056..140ca70 100644
--- a/source3/printing/print_standard.c
+++ b/source3/printing/print_standard.c
@@ -61,18 +61,21 @@
 /* handle standard printcap - moved from pcap_printer_fn() */
 bool std_pcap_cache_reload(const char *pcap_name, struct pcap_cache **_pcache)
 {
+	TALLOC_CTX *frame = talloc_stackframe();
 	XFILE *pcap_file;
 	char *pcap_line;
 	struct pcap_cache *pcache = NULL;
+	bool print_warning = false;
 
 	if ((pcap_file = x_fopen(pcap_name, O_RDONLY, 0)) == NULL) {
 		DEBUG(0, ("Unable to open printcap file %s for read!\n", pcap_name));
+		talloc_free(frame);
 		return false;
 	}
 
 	for (; (pcap_line = fgets_slash(NULL, 1024, pcap_file)) != NULL; free(pcap_line)) {
-		char name[MAXPRINTERLEN+1];
-		char comment[62];
+		char *name = NULL;
+		char *comment = NULL;
 		char *p, *q;
 
 		if (*pcap_line == '#' || *pcap_line == 0)
@@ -86,8 +89,8 @@ bool std_pcap_cache_reload(const char *pcap_name, struct pcap_cache **_pcache)
 		 * now find the most likely printer name and comment
 		 * this is pure guesswork, but it's better than nothing
 		 */
-		for (*name = *comment = 0, p = pcap_line; p != NULL; p = q) {
-			bool has_punctuation;
+		for (p = pcap_line; p != NULL; p = q) {
+			bool has_punctuation = false;
 
 			if ((q = strchr_m(p, '|')) != NULL)
 				*q++ = 0;
@@ -101,32 +104,48 @@ bool std_pcap_cache_reload(const char *pcap_name, struct pcap_cache **_pcache)
 			                   strchr_m(p, '(') ||
 			                   strchr_m(p, ')'));
 
-			if (strlen(p) > strlen(comment) && has_punctuation) {
-				strlcpy(comment, p, sizeof(comment));
+			if (name == NULL && !has_punctuation) {
+				name = talloc_strdup(frame, p);
 				continue;
 			}
 
-			if (strlen(p) <= MAXPRINTERLEN && *name == '\0' && !has_punctuation) {
-				strlcpy(name, p, sizeof(name));
+			if (has_punctuation) {
+				comment = talloc_strdup(frame, p);
 				continue;
 			}
+		}
 
-			if (!strchr_m(comment, ' ') &&
-			    strlen(p) > strlen(comment)) {
-				strlcpy(comment, p, sizeof(comment));
-				continue;
+		if (name != NULL) {
+			bool ok;
+
+			if (!print_warning && strlen(name) > MAXPRINTERLEN) {
+				print_warning = true;
 			}
-		}
 
-		if ((*name != '\0')
-		 && !pcap_cache_add_specific(&pcache, name, comment, NULL)) {
-			x_fclose(pcap_file);
-			pcap_cache_destroy_specific(&pcache);
-			return false;
+			ok = pcap_cache_add_specific(&pcache,
+						     name,
+						     comment,
+						     NULL);
+			if (!ok) {
+				x_fclose(pcap_file);
+				pcap_cache_destroy_specific(&pcache);
+				talloc_free(frame);
+				return false;
+			}
 		}
+		TALLOC_FREE(name);
+		TALLOC_FREE(comment);
+	}
+
+	if (print_warning) {
+		DBG_WARNING("WARNING: You have some printer names that are "
+			    "longer than %u characters. These may not be "
+			    "accessible to some older clients!\n",
+			    (unsigned int)MAXPRINTERLEN);
 	}
 
 	x_fclose(pcap_file);
 	*_pcache = pcache;
+	talloc_free(frame);
 	return true;
 }


-- 
Samba Shared Repository
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.