From ba027d7806e00be6b34b2539f42b9f31e218ab91 Mon Sep 17 00:00:00 2001 From: Cremno Date: Wed, 7 Aug 2013 19:58:06 +0200 Subject: don't use str{cpy,cat} in mruby and mrbc The length of each string is known. It should be used. --- mrbgems/mruby-bin-mruby/tools/mruby/mruby.c | 18 +++++++++++++----- tools/mrbc/mrbc.c | 12 ++++++++---- 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/mrbgems/mruby-bin-mruby/tools/mruby/mruby.c b/mrbgems/mruby-bin-mruby/tools/mruby/mruby.c index 97b55687f..baeb95993 100644 --- a/mrbgems/mruby-bin-mruby/tools/mruby/mruby.c +++ b/mrbgems/mruby-bin-mruby/tools/mruby/mruby.c @@ -91,16 +91,24 @@ parse_args(mrb_state *mrb, int argc, char **argv, struct _args *args) item = argv[0]; append_cmdline: if (!args->cmdline) { + size_t buflen; char *buf; - buf = (char *)mrb_malloc(mrb, strlen(item)+1); - strcpy(buf, item); + buflen = strlen(item) + 1; + buf = (char *)mrb_malloc(mrb, buflen); + memcpy(buf, item, buflen); args->cmdline = buf; } else { - args->cmdline = (char *)mrb_realloc(mrb, args->cmdline, strlen(args->cmdline)+strlen(item)+2); - strcat(args->cmdline, "\n"); - strcat(args->cmdline, item); + size_t cmdlinelen; + size_t itemlen; + + cmdlinelen = strlen(args->cmdline); + itemlen = strlen(item); + args->cmdline = + (char *)mrb_realloc(mrb, args->cmdline, cmdlinelen + itemlen + 2); + args->cmdline[cmdlinelen] = '\n'; + memcpy(args->cmdline + cmdlinelen + 1, item, itemlen + 1); } } else { diff --git a/tools/mrbc/mrbc.c b/tools/mrbc/mrbc.c index 79fcd2bdf..735b22b1d 100644 --- a/tools/mrbc/mrbc.c +++ b/tools/mrbc/mrbc.c @@ -51,15 +51,19 @@ usage(const char *name) static char * get_outfilename(mrb_state *mrb, char *infile, char *ext) { + size_t infilelen; + size_t extlen; char *outfile; char *p; - outfile = (char*)mrb_malloc(mrb, strlen(infile) + strlen(ext) + 1); - strcpy(outfile, infile); + infilelen = strlen(infile); + extlen = strlen(ext); + outfile = (char*)mrb_malloc(mrb, infilelen + extlen + 1); + memcpy(outfile, infile, infilelen + 1); if (*ext) { if ((p = strrchr(outfile, '.')) == NULL) - p = &outfile[strlen(outfile)]; - strcpy(p, ext); + p = outfile + infilelen; + memcpy(p, ext, extlen + 1); } return outfile; -- cgit v1.2.3 From 29381bc819bdb0602ef4005a7d01daf605310fce Mon Sep 17 00:00:00 2001 From: Cremno Date: Wed, 7 Aug 2013 20:12:27 +0200 Subject: parse.y: don't use strcat --- src/parse.y | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/src/parse.y b/src/parse.y index 53349ef63..600cdb85c 100644 --- a/src/parse.y +++ b/src/parse.y @@ -3701,7 +3701,9 @@ parse_string(parser_state *p) int f = 0; int c; char *s = strndup(tok(p), toklen(p)); - char flag[4] = { '\0' }; + char flags[3]; + char *flag = flags; + char *dup; newtok(p); while (c = nextc(p), c != -1 && ISALPHA(c)) { @@ -3720,10 +3722,16 @@ parse_string(parser_state *p) toklen(p) > 1 ? "s" : "", tok(p)); yyerror(p, msg); } - if (f & 1) strcat(flag, "i"); - if (f & 2) strcat(flag, "x"); - if (f & 4) strcat(flag, "m"); - yylval.nd = new_regx(p, s, strdup(flag)); + if (f != 0) { + if (f & 1) *flag++ = 'i'; + if (f & 2) *flag++ = 'x'; + if (f & 4) *flag++ = 'm'; + dup = strndup(flags, (size_t)(flag - flags)); + } + else { + dup = NULL; + } + yylval.nd = new_regx(p, s, dup); return tREGEXP; } -- cgit v1.2.3