diff options
| author | h2so5 <[email protected]> | 2013-04-09 16:19:27 +0900 |
|---|---|---|
| committer | h2so5 <[email protected]> | 2013-04-09 16:21:51 +0900 |
| commit | 337076f9ba9222bb29f49fb5b168d8865a8a95a2 (patch) | |
| tree | 8831d859e64d8e1a401ac79fbf1c777a62b85dab /src | |
| parent | 1b40c057f56ffa87abc7c5db467c91981db610f8 (diff) | |
| download | mruby-337076f9ba9222bb29f49fb5b168d8865a8a95a2.tar.gz mruby-337076f9ba9222bb29f49fb5b168d8865a8a95a2.zip | |
Add validation for C language symbol name
Diffstat (limited to 'src')
| -rw-r--r-- | src/dump.c | 18 |
1 files changed, 17 insertions, 1 deletions
diff --git a/src/dump.c b/src/dump.c index 9579dabd4..1d59e667b 100644 --- a/src/dump.c +++ b/src/dump.c @@ -499,6 +499,22 @@ mrb_dump_irep_binary(mrb_state *mrb, size_t start_index, int debug_info, FILE* f return result; } +static int +is_valid_c_symbol_name(const char *name) +{ + const char *c = NULL; + + if (name == NULL || name[0] == '\0') return 0; + if (!ISALPHA(name[0]) && name[0] != '_') return 0; + + c = &name[1]; + for (; *c != '\0'; ++c) { + if (!ISALNUM(*c) && *c != '_') return 0; + } + + return 1; +} + int mrb_dump_irep_cfunc(mrb_state *mrb, size_t start_index, int debug_info, FILE *fp, const char *initname) { @@ -506,7 +522,7 @@ mrb_dump_irep_cfunc(mrb_state *mrb, size_t start_index, int debug_info, FILE *fp size_t bin_size = 0, bin_idx = 0; int result; - if (fp == NULL || initname == NULL) { + if (fp == NULL || initname == NULL || !is_valid_c_symbol_name(initname)) { return MRB_DUMP_INVALID_ARGUMENT; } |
