Blame SOURCES/cups-1.6.3-legacy-iso88591.patch

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
  */