X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?p=userv.git;a=blobdiff_plain;f=parser.c;h=5f6ebadc7da07b2f2efe6d09bbd7a1b1039b6c23;hp=e73b4c5a56f97d6a927c03e416ffe29c3f786838;hb=70d3947fb471e0e12ef89c35f915f6acec217f4a;hpb=574777cfe5f60257117950ab6861cb6db87279fe diff --git a/parser.c b/parser.c index e73b4c5..5f6ebad 100644 --- a/parser.c +++ b/parser.c @@ -6,7 +6,7 @@ * about m4 quoting &c., but we have to #include it so that the C * objects from the lexer are available. * - * Copyright (C)1996-1997 Ian Jackson + * Copyright (C)1996-1999 Ian Jackson * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by @@ -139,7 +139,7 @@ static void freecharparray(char **array) { static int dequote(char *inplace) { char *p, *q, buf[4], *bep; int v; - + p=q=inplace; assert(*p++ = '"'); while (*p && *p != '"') { @@ -149,26 +149,37 @@ static int dequote(char *inplace) { 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 sequence"); + return tokv_error; + } + buf[2]= 0; + v= strtoul(buf,&bep,16); + if (bep != buf+2) { + parseerrprint("invalid \\ sequence \\x%s in quoted string",buf); + return tokv_error; + } + assert(!(v & ~0xff)); + *q++= v; + continue; default: if (isalpha(*p)) { parseerrprint("unknown \\ 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 \\ 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'); } } } @@ -488,7 +499,7 @@ static int pf_service(int ptoken, char ***rvalues) { } 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) {