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

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

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


- Log -----------------------------------------------------------------
commit 4e80e19e64b6c705d2b9c28dbf8b7470c27fc2d9
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-4-test): Karolin Seeger <[email protected]>
    Autobuild-Date(v4-4-test): Mon Nov 14 15:56:11 CET 2016 on sn-devel-144

commit bc8d9272da473233acf116f7b733840ecee4a210
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.