09f4122
diff -Nurad netatalk-2.0.3.orig/etc/papd/lp.c netatalk-2.0.3/etc/papd/lp.c
09f4122
--- netatalk-2.0.3.orig/etc/papd/lp.c	2009-01-28 17:04:36.000000000 +0100
09f4122
+++ netatalk-2.0.3/etc/papd/lp.c	2009-01-28 17:05:01.000000000 +0100
09f4122
@@ -212,10 +212,54 @@
09f4122
 
09f4122
 #define is_var(a, b) (strncmp((a), (b), 2) == 0)
09f4122
 
09f4122
+static size_t quote(char *dest, char *src, const size_t bsize, size_t len) {
09f4122
+	size_t used = 0;
09f4122
+
09f4122
+	while (len && used < bsize ) {
09f4122
+		switch (*src) {
09f4122
+			case '$':
09f4122
+			case '\\':
09f4122
+			case '"':
09f4122
+			case ';':
09f4122
+			case '&':
09f4122
+			case '(':
09f4122
+			case ')':
09f4122
+			case ' ':
09f4122
+			case '*':
09f4122
+			case '#':
09f4122
+			case '|':
09f4122
+			case '>':
09f4122
+			case '<':
09f4122
+			case '[':
09f4122
+			case ']':
09f4122
+			case '{':
09f4122
+			case '}':
09f4122
+			case '^':
09f4122
+			case '?':
09f4122
+			case '~':
09f4122
+			case '`':
09f4122
+			case '\x0A':
09f4122
+			case '\xFF':
09f4122
+				if (used + 2 > bsize )
09f4122
+					return used;
09f4122
+				*dest = '\\';
09f4122
+				dest++;
09f4122
+				used++;
09f4122
+				break;
09f4122
+		}
09f4122
+		*dest = *src;
09f4122
+		src++;
09f4122
+		dest++;
09f4122
+		len--;
09f4122
+		used++;
09f4122
+	}
09f4122
+	return used;
09f4122
+}
09f4122
+
09f4122
 static char* pipexlate(char *src)
09f4122
 {
09f4122
     char *p, *q, *dest; 
09f4122
-    static char destbuf[MAXPATHLEN];
09f4122
+    static char destbuf[MAXPATHLEN + 1];
09f4122
     size_t destlen = MAXPATHLEN;
09f4122
     int len = 0;
09f4122
    
09f4122
@@ -224,13 +268,16 @@
09f4122
     if (!src)
09f4122
 	return NULL;
09f4122
 
09f4122
-    strncpy(dest, src, MAXPATHLEN);
09f4122
-    if ((p = strchr(src, '%')) == NULL) /* nothing to do */
09f4122
+    memset(dest, 0, sizeof(destbuf));
09f4122
+    if ((p = strchr(src, '%')) == NULL) { /* nothing to do */
09f4122
+        strncpy(dest, src, sizeof(dest) - 1);
09f4122
         return destbuf;
09f4122
+    }
09f4122
 
09f4122
     /* first part of the path. just forward to the next variable. */
09f4122
     len = MIN((size_t)(p - src), destlen);
09f4122
     if (len > 0) {
09f4122
+        strncpy(dest, src, len);
09f4122
         destlen -= len;
09f4122
         dest += len;
09f4122
     }
09f4122
@@ -246,17 +293,20 @@
09f4122
             q =  lp.lp_created_for;
09f4122
         } else if (is_var(p, "%%")) {
09f4122
             q = "%";
09f4122
-        } else
09f4122
-            q = p;
09f4122
+        }
09f4122
 
09f4122
         /* copy the stuff over. if we don't understand something that we
09f4122
          * should, just skip it over. */
09f4122
         if (q) {
09f4122
-            len = MIN(p == q ? 2 : strlen(q), destlen);
09f4122
+            len = MIN(strlen(q), destlen);
09f4122
+            len = quote(dest, q, destlen, len);
09f4122
+        }
09f4122
+        else {
09f4122
+            len = MIN(2, destlen);
09f4122
             strncpy(dest, q, len);
09f4122
-            dest += len;
09f4122
-            destlen -= len;
09f4122
         }
09f4122
+        dest += len;
09f4122
+        destlen -= len;
09f4122
 
09f4122
         /* stuff up to next $ */
09f4122
         src = p + 2;