static int dequote(char *inplace) {
char *p, *q, buf[4], *bep;
int v;
-
+
p=q=inplace;
assert(*p++ = '"');
while (*p && *p != '"') {
case 'r': *q++= '\r'; continue;
case 't': *q++= '\t'; continue;
case 'x':
- assert(buf[0]= *++p); assert(buf[1]= *++p); buf[2]= 0;
- v= strtoul(buf,&bep,16); assert(bep == buf+2);
- assert(!(v & ~0xff)); *q++= v; p++; continue;
+ p++;
+ if (!((buf[0]= *p++) && (buf[1]= *p++))) {
+ parseerrprint("quoted string ends inside \\x<hex> sequence");
+ return tokv_error;
+ }
+ buf[2]= 0;
+ v= strtoul(buf,&bep,16);
+ if (bep != buf+2) {
+ parseerrprint("invalid \\<hex> sequence \\x%s in quoted string",buf);
+ return tokv_error;
+ }
+ assert(!(v & ~0xff));
+ *q++= v;
+ continue;
default:
if (isalpha(*p)) {
parseerrprint("unknown \\<letter> sequence \\%c in quoted string",*p);
return tokv_error;
} else if (isdigit(*p)) {
- assert(buf[0]= *++p); assert(buf[1]= *++p); assert(buf[2]= *++p);
+ if (!((buf[0]= *p++) && (buf[1]= *p++) && (buf[2]= *p++))) abort();
buf[3]= 0; v= strtoul(buf,&bep,8);
- if (bep != buf+3 || (v & ~0xff)); {
+ if (bep != buf+3 || (v & ~0xff)) {
parseerrprint("invalid \\<octal> sequence \\%s in quoted string",buf);
return tokv_error;
}
- *q++= v; p++; continue;
+ *q++= v; continue;
} else if (ispunct(*p)) {
*q++= *p++; continue;
} else {
while (*p==' ' || *p=='\t') p++;
- assert(*p=='\n');
+ v= *p++; assert(v=='\n');
}
}
}
/* Returned value is invalidated by repeated calls. */
static char *buildbuf;
static int buildbuflen;
+ const char *usetext;
int r, tl;
return tokv_error;
}
if (r == tokv_newline) break;
- tl+= strlen(yytext);
+ usetext= r == tokv_lwsp ? " " : yytext;
+ tl+= strlen(usetext);
if (makeroom(&buildbuf,&buildbuflen,tl)) return stringoverflow("message");
- strcat(buildbuf,yytext);
+ strcat(buildbuf,usetext);
}
*message_r= buildbuf;
return 0;
}
static int pf_callinguser(int ptoken, char ***rvalues) {
- return parm_usernameuid(rvalues,logname,request_mbuf.callinguid);
+ return parm_usernameuid(rvalues,loginname,request_mbuf.callinguid);
}
static int pf_serviceuser(int ptoken, char ***rvalues) {
} else {
if (*p=='.') *q++= ':';
while ((c= *p++)) {
- if (c=='/') { *q++= ':'; c='-'; }
- else if (c==':') { *q++= ':'; }
+ if (c=='/') {
+ *q++= ':';
+ c= '-';
+ } else if (!((c >= '0' && c <= '9') ||
+ (c >= 'a' && c <= 'z') ||
+ c == '-' || c == '_')) {
+ *q++= ':';
+ }
*q++= c;
}
*q++= 0;