From 8442968f9c478fd547a583e25d9811386927e8d5 Mon Sep 17 00:00:00 2001 From: "hyunghwan.chung" Date: Sun, 19 Feb 2017 15:45:51 +0000 Subject: [PATCH] fixed a tokenization bug in getting a empty string literal. allowed a zero-length symbol to be created --- moo/lib/comp.c | 52 ++++++++++++++++++++++++++++++-------------------- moo/lib/sym.c | 9 +-------- 2 files changed, 32 insertions(+), 29 deletions(-) diff --git a/moo/lib/comp.c b/moo/lib/comp.c index d4d6cf2..f468287 100644 --- a/moo/lib/comp.c +++ b/moo/lib/comp.c @@ -1238,30 +1238,42 @@ static int get_strlit (moo_t* moo) * normal-character := character-except-single-quote */ - moo_ooci_t c = moo->c->lxc.c; - SET_TOKEN_TYPE (moo, MOO_IOTOK_STRLIT); + moo_ooci_t oc, c; - do + oc = moo->c->lxc.c; /* opening quote */ + + SET_TOKEN_TYPE (moo, MOO_IOTOK_STRLIT); + GET_CHAR_TO (moo, c); + + if (c != oc) { do { - ADD_TOKEN_CHAR (moo, c); - GET_CHAR_TO (moo, c); - - if (c == MOO_UCI_EOF) + do { - /* string not closed */ - set_syntax_error (moo, MOO_SYNERR_STRNC, TOKEN_LOC(moo) /*&moo->c->lxc.l*/, MOO_NULL); - return -1; - } - } - while (c != '\''); + in_strlit: + ADD_TOKEN_CHAR (moo, c); + GET_CHAR_TO (moo, c); - /* 'c' must be a single quote at this point*/ + if (c == MOO_UCI_EOF) + { + /* string not closed */ + set_syntax_error (moo, MOO_SYNERR_STRNC, TOKEN_LOC(moo) /*&moo->c->lxc.l*/, MOO_NULL); + return -1; + } + } + while (c != oc); + + /* 'c' must be a single quote at this point*/ + GET_CHAR_TO (moo, c); + } + while (c == oc); /* if the next character is a single quote, it becomes a literal single quote character. */ + } + else + { GET_CHAR_TO (moo, c); - } - while (c == '\''); /* if the next character is a single quote, - it becomes a literal single quote character. */ + if (c == oc) goto in_strlit; + } unget_char (moo, &moo->c->lxc); return 0; @@ -1509,7 +1521,6 @@ retry: break; case '\'': /* string literal */ - GET_CHAR (moo); if (get_strlit(moo) <= -1) return -1; break; @@ -1612,9 +1623,8 @@ retry: case '\'': /* quoted symbol literal */ - GET_CHAR (moo); - if (get_strlit(moo) <= -1) return -1; - SET_TOKEN_TYPE (moo, MOO_IOTOK_SYMLIT); + if (get_strlit(moo) <= -1) return -1; /* reuse the string literal tokenizer */ + SET_TOKEN_TYPE (moo, MOO_IOTOK_SYMLIT); /* change the symbol type to symbol */ break; default: diff --git a/moo/lib/sym.c b/moo/lib/sym.c index b9316f1..ad8bdf6 100644 --- a/moo/lib/sym.c +++ b/moo/lib/sym.c @@ -88,14 +88,6 @@ static moo_oop_t find_or_make_symbol (moo_t* moo, const moo_ooch_t* ptr, moo_oow moo_oow_t index; moo_oop_char_t symbol; - MOO_ASSERT (moo, len > 0); - if (len <= 0) - { - /* i don't allow an empty symbol name */ - moo->errnum = MOO_EINVAL; - return MOO_NULL; - } - MOO_ASSERT (moo, MOO_CLASSOF(moo,moo->symtab->bucket) == moo->_array); index = moo_hashoochars(ptr, len) % MOO_OBJ_GET_SIZE(moo->symtab->bucket); @@ -175,6 +167,7 @@ moo_oop_t moo_makesymbol (moo_t* moo, const moo_ooch_t* ptr, moo_oow_t len) { return find_or_make_symbol (moo, ptr, len, 1); } + moo_oop_t moo_findsymbol (moo_t* moo, const moo_ooch_t* ptr, moo_oow_t len) { return find_or_make_symbol (moo, ptr, len, 0);