|
|
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;
|