chiark / gitweb /
Regenerated formatted documentation (spec.ps, spec.html).
[userv.git] / parser.c
index e73b4c5..5f6ebad 100644 (file)
--- 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<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');
       }
     }
   }
@@ -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) {