|
 |
db5f83 |
diff -up cups-1.6.3/scheduler/cups-lpd.c.legacy-iso88591 cups-1.6.3/scheduler/cups-lpd.c
|
|
 |
db5f83 |
--- cups-1.6.3/scheduler/cups-lpd.c.legacy-iso88591 2013-06-07 03:12:52.000000000 +0200
|
|
 |
db5f83 |
+++ cups-1.6.3/scheduler/cups-lpd.c 2017-09-21 15:16:28.104331875 +0200
|
|
 |
db5f83 |
@@ -82,7 +82,7 @@ static int remove_jobs(const char *name,
|
|
 |
db5f83 |
static int send_state(const char *name, const char *list,
|
|
 |
db5f83 |
int longstatus);
|
|
 |
db5f83 |
static char *smart_gets(char *s, int len, FILE *fp);
|
|
 |
db5f83 |
-
|
|
 |
db5f83 |
+static void smart_strlcpy(char *dst, const char *src, size_t dstsize);
|
|
 |
db5f83 |
|
|
 |
db5f83 |
/*
|
|
 |
db5f83 |
* 'main()' - Process an incoming LPD request...
|
|
 |
db5f83 |
@@ -1053,15 +1053,15 @@ recv_print_job(
|
|
 |
db5f83 |
switch (line[0])
|
|
 |
db5f83 |
{
|
|
 |
db5f83 |
case 'J' : /* Job name */
|
|
 |
db5f83 |
- strlcpy(title, line + 1, sizeof(title));
|
|
 |
db5f83 |
+ smart_strlcpy(title, line + 1, sizeof(title));
|
|
 |
db5f83 |
break;
|
|
 |
db5f83 |
|
|
 |
db5f83 |
case 'N' : /* Document name */
|
|
 |
db5f83 |
- strlcpy(docname, line + 1, sizeof(docname));
|
|
 |
db5f83 |
+ smart_strlcpy(docname, line + 1, sizeof(docname));
|
|
 |
db5f83 |
break;
|
|
 |
db5f83 |
|
|
 |
db5f83 |
case 'P' : /* User identification */
|
|
 |
db5f83 |
- strlcpy(user, line + 1, sizeof(user));
|
|
 |
db5f83 |
+ smart_strlcpy(user, line + 1, sizeof(user));
|
|
 |
db5f83 |
break;
|
|
 |
db5f83 |
|
|
 |
db5f83 |
case 'L' : /* Print banner page */
|
|
 |
db5f83 |
@@ -1146,7 +1146,7 @@ recv_print_job(
|
|
 |
db5f83 |
switch (line[0])
|
|
 |
db5f83 |
{
|
|
 |
db5f83 |
case 'N' : /* Document name */
|
|
 |
db5f83 |
- strlcpy(docname, line + 1, sizeof(docname));
|
|
 |
db5f83 |
+ smart_strlcpy(docname, line + 1, sizeof(docname));
|
|
 |
db5f83 |
break;
|
|
 |
db5f83 |
|
|
 |
db5f83 |
case 'c' : /* Plot CIF file */
|
|
 |
db5f83 |
@@ -1622,5 +1622,94 @@ smart_gets(char *s, /* I - Pointer to
|
|
 |
db5f83 |
|
|
 |
db5f83 |
|
|
 |
db5f83 |
/*
|
|
 |
db5f83 |
+ * 'smart_strlcpy()' - Copy a string and convert from ISO-8859-1 to UTF-8 as needed.
|
|
 |
db5f83 |
+ */
|
|
 |
db5f83 |
+
|
|
 |
db5f83 |
+static void
|
|
 |
db5f83 |
+smart_strlcpy(char *dst, /* I - Output buffer */
|
|
 |
db5f83 |
+ const char *src, /* I - Input string */
|
|
 |
db5f83 |
+ size_t dstsize) /* I - Size of output buffer */
|
|
 |
db5f83 |
+{
|
|
 |
db5f83 |
+ const unsigned char *srcptr; /* Pointer into input string */
|
|
 |
db5f83 |
+ unsigned char *dstptr, /* Pointer into output buffer */
|
|
 |
db5f83 |
+ *dstend; /* End of output buffer */
|
|
 |
db5f83 |
+ int saw_8859 = 0; /* Saw an extended character that was not UTF-8? */
|
|
 |
db5f83 |
+
|
|
 |
db5f83 |
+
|
|
 |
db5f83 |
+ for (srcptr = (unsigned char *)src, dstptr = (unsigned char *)dst, dstend = dstptr + dstsize - 1; *srcptr;)
|
|
 |
db5f83 |
+ {
|
|
 |
db5f83 |
+ if (*srcptr < 0x80)
|
|
 |
db5f83 |
+ *dstptr++ = *srcptr++; /* ASCII */
|
|
 |
db5f83 |
+ else if (saw_8859)
|
|
 |
db5f83 |
+ {
|
|
 |
db5f83 |
+ /*
|
|
 |
db5f83 |
+ * Map ISO-8859-1 (most likely character set for legacy LPD clients) to
|
|
 |
db5f83 |
+ * UTF-8...
|
|
 |
db5f83 |
+ */
|
|
 |
db5f83 |
+
|
|
 |
db5f83 |
+ if (dstptr > (dstend - 2))
|
|
 |
db5f83 |
+ break;
|
|
 |
db5f83 |
+
|
|
 |
db5f83 |
+ *dstptr++ = 0xc0 | (*srcptr >> 6);
|
|
 |
db5f83 |
+ *dstptr++ = 0x80 | (*srcptr++ & 0x3f);
|
|
 |
db5f83 |
+ }
|
|
 |
db5f83 |
+ else if ((*srcptr & 0xe0) == 0xc0 && (srcptr[1] & 0xc0) == 0x80)
|
|
 |
db5f83 |
+ {
|
|
 |
db5f83 |
+ /*
|
|
 |
db5f83 |
+ * 2-byte UTF-8 sequence...
|
|
 |
db5f83 |
+ */
|
|
 |
db5f83 |
+
|
|
 |
db5f83 |
+ if (dstptr > (dstend - 2))
|
|
 |
db5f83 |
+ break;
|
|
 |
db5f83 |
+
|
|
 |
db5f83 |
+ *dstptr++ = *srcptr++;
|
|
 |
db5f83 |
+ *dstptr++ = *srcptr++;
|
|
 |
db5f83 |
+ }
|
|
 |
db5f83 |
+ else if ((*srcptr & 0xf0) == 0xe0 && (srcptr[1] & 0xc0) == 0x80 && (srcptr[2] & 0xc0) == 0x80)
|
|
 |
db5f83 |
+ {
|
|
 |
db5f83 |
+ /*
|
|
 |
db5f83 |
+ * 3-byte UTF-8 sequence...
|
|
 |
db5f83 |
+ */
|
|
 |
db5f83 |
+
|
|
 |
db5f83 |
+ if (dstptr > (dstend - 3))
|
|
 |
db5f83 |
+ break;
|
|
 |
db5f83 |
+
|
|
 |
db5f83 |
+ *dstptr++ = *srcptr++;
|
|
 |
db5f83 |
+ *dstptr++ = *srcptr++;
|
|
 |
db5f83 |
+ *dstptr++ = *srcptr++;
|
|
 |
db5f83 |
+ }
|
|
 |
db5f83 |
+ else if ((*srcptr & 0xf8) == 0xf0 && (srcptr[1] & 0xc0) == 0x80 && (srcptr[2] & 0xc0) == 0x80 && (srcptr[3] & 0xc0) == 0x80)
|
|
 |
db5f83 |
+ {
|
|
 |
db5f83 |
+ /*
|
|
 |
db5f83 |
+ * 4-byte UTF-8 sequence...
|
|
 |
db5f83 |
+ */
|
|
 |
db5f83 |
+
|
|
 |
db5f83 |
+ if (dstptr > (dstend - 4))
|
|
 |
db5f83 |
+ break;
|
|
 |
db5f83 |
+
|
|
 |
db5f83 |
+ *dstptr++ = *srcptr++;
|
|
 |
db5f83 |
+ *dstptr++ = *srcptr++;
|
|
 |
db5f83 |
+ *dstptr++ = *srcptr++;
|
|
 |
db5f83 |
+ *dstptr++ = *srcptr++;
|
|
 |
db5f83 |
+ }
|
|
 |
db5f83 |
+ else
|
|
 |
db5f83 |
+ {
|
|
 |
db5f83 |
+ /*
|
|
 |
db5f83 |
+ * Bad UTF-8 sequence, this must be an ISO-8859-1 string...
|
|
 |
db5f83 |
+ */
|
|
 |
db5f83 |
+
|
|
 |
db5f83 |
+ saw_8859 = 1;
|
|
 |
db5f83 |
+
|
|
 |
db5f83 |
+ if (dstptr > (dstend - 2))
|
|
 |
db5f83 |
+ break;
|
|
 |
db5f83 |
+
|
|
 |
db5f83 |
+ *dstptr++ = 0xc0 | (*srcptr >> 6);
|
|
 |
db5f83 |
+ *dstptr++ = 0x80 | (*srcptr++ & 0x3f);
|
|
 |
db5f83 |
+ }
|
|
 |
db5f83 |
+ }
|
|
 |
db5f83 |
+
|
|
 |
db5f83 |
+ *dstptr = '\0';
|
|
 |
db5f83 |
+}
|
|
 |
db5f83 |
+/*
|
|
 |
db5f83 |
* End of "$Id: cups-lpd.c 7899 2008-09-03 12:57:17Z mike $".
|
|
 |
db5f83 |
*/
|