changeset 4483:7869173584fc

Error on over-long hex character escapes. 2008-07-16 Aidan Kehoe <kehoea@parhasard.net> * lread.c (read_escape): Error if we're handed an over-long hex character escape, something which arises reasonably frequently in code written for GNU.
author Aidan Kehoe <kehoea@parhasard.net>
date Wed, 16 Jul 2008 22:36:03 +0200
parents ec442dc06fe1
children d6e2e2e819d7
files src/ChangeLog src/lread.c
diffstat 2 files changed, 28 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/ChangeLog	Thu Jul 10 23:37:52 2008 +0200
+++ b/src/ChangeLog	Wed Jul 16 22:36:03 2008 +0200
@@ -1,3 +1,9 @@
+2008-07-16  Aidan Kehoe  <kehoea@parhasard.net>
+
+	* lread.c (read_escape): 
+	Error if we're handed an over-long hex character escape, something
+	which arises reasonably frequently in code written for GNU. 
+
 2008-07-07  Aidan Kehoe  <kehoea@parhasard.net>
 
 	Patch to make it up to the device-specific code whether
--- a/src/lread.c	Thu Jul 10 23:37:52 2008 +0200
+++ b/src/lread.c	Wed Jul 16 22:36:03 2008 +0200
@@ -1855,6 +1855,28 @@
 		break;
 	      }
 	  }
+
+        if (count == 3)
+          {
+            c = readchar (readcharfun);
+            if ((c >= '0' && c <= '9') ||
+                (c >= 'a' && c <= 'f') ||
+                (c >= 'A' && c <= 'F'))
+              {
+                Lisp_Object args[2];
+
+                if      (c >= '0' && c <= '9')  i = (i << 4) + (c - '0');
+                else if (c >= 'a' && c <= 'f')  i = (i << 4) + (c - 'a') + 10;
+                else if (c >= 'A' && c <= 'F')  i = (i << 4) + (c - 'A') + 10;
+
+                args[0] = build_string ("?\\x%x");
+                args[1] = make_int (i);
+                syntax_error ("Overlong hex character escape",
+                              Fformat (2, args));
+              }
+            unreadchar (readcharfun, c);
+          }
+
 	return i;
       }
     case 'U':