[svn:parrot] r49087 - trunk/src/string
nwellnhof at svn.parrot.org
nwellnhof at svn.parrot.org
Fri Sep 17 17:50:37 UTC 2010
Author: nwellnhof
Date: Fri Sep 17 17:50:36 2010
New Revision: 49087
URL: https://trac.parrot.org/parrot/changeset/49087
Log:
[str] Missing checks for end of string in Parrot_str_unescape_string
Modified:
trunk/src/string/api.c
Modified: trunk/src/string/api.c
==============================================================================
--- trunk/src/string/api.c Fri Sep 17 16:53:21 2010 (r49086)
+++ trunk/src/string/api.c Fri Sep 17 17:50:36 2010 (r49087)
@@ -2570,6 +2570,7 @@
pending = 0;
next = c;
if (c == '\\') {
+ if (itersrc.bytepos >= srclen) break;
c = STRING_iter_get_and_advance(interp, src, &itersrc);
switch (c) {
/* Common one char sequences */
@@ -2583,6 +2584,7 @@
case 'e': next = '\x1B'; break;
/* Escape character */
case 'c':
+ if (itersrc.bytepos >= srclen) break;
c = STRING_iter_get_and_advance(interp, src, &itersrc);
/* This assumes ascii-alike encoding */
if (c < 'A' || c > 'Z')
@@ -2591,6 +2593,7 @@
break;
case 'x':
digcount = 0;
+ if (itersrc.bytepos >= srclen) break;
c = STRING_iter_get_and_advance(interp, src, &itersrc);
if (c == '{') {
/* \x{h..h} 1..8 hex digits */
@@ -2630,6 +2633,7 @@
case 'u':
/* \uhhhh 4 hex digits */
for (digcount = 0; digcount < 4; ++digcount) {
+ if (itersrc.bytepos >= srclen) break;
c = STRING_iter_get_and_advance(interp, src, &itersrc);
if (!isxdigit(c))
throw_illegal_escape(interp);
@@ -2641,6 +2645,7 @@
case 'U':
/* \Uhhhhhhhh 8 hex digits */
for (digcount = 0; digcount < 8; ++digcount) {
+ if (itersrc.bytepos >= srclen) break;
c = STRING_iter_get_and_advance(interp, src, &itersrc);
if (!isxdigit(c))
throw_illegal_escape(interp);
@@ -2654,6 +2659,7 @@
/* \ooo 1..3 oct digits */
digbuf[0] = c;
for (digcount = 1; digcount < 3; ++digcount) {
+ if (itersrc.bytepos >= srclen) break;
c = STRING_iter_get_and_advance(interp, src, &itersrc);
if (c < '0' || c > '7')
break;
@@ -2661,7 +2667,7 @@
}
digbuf[digcount] = '\0';
next = strtol(digbuf, NULL, 8);
- if (digcount < 3)
+ if (itersrc.bytepos < srclen && digcount < 3)
pending = 1;
break;
default:
More information about the parrot-commits
mailing list