ruby-changes:11364
From: nobu <ko1@a...>
Date: Tue, 17 Mar 2009 10:29:33 +0900 (JST)
Subject: [ruby-changes:11364] Ruby:r22984 (trunk): * dir.c, dln.c, parse.y, re.c, ruby.c, sprintf.c, strftime.c,
nobu 2009-03-17 10:29:17 +0900 (Tue, 17 Mar 2009) New Revision: 22984 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=22984 Log: * dir.c, dln.c, parse.y, re.c, ruby.c, sprintf.c, strftime.c, string.c, util.c, variable.c: use strlcpy, memcpy and snprintf instead of strcpy, strncpy and sprintf. Modified files: trunk/ChangeLog trunk/dir.c trunk/dln.c trunk/parse.y trunk/re.c trunk/ruby.c trunk/sprintf.c trunk/strftime.c trunk/string.c trunk/util.c trunk/variable.c Index: re.c =================================================================== --- re.c (revision 22983) +++ re.c (revision 22984) @@ -366,7 +366,7 @@ else if (!rb_enc_isspace(c, enc)) { char b[8]; - sprintf(b, "\\x%02X", c); + snprintf(b, sizeof(b), "\\x%02X", c); rb_str_buf_cat(str, b, 4); } else { Index: ChangeLog =================================================================== --- ChangeLog (revision 22983) +++ ChangeLog (revision 22984) @@ -1,3 +1,9 @@ +Tue Mar 17 10:29:22 2009 Nobuyoshi Nakada <nobu@r...> + + * dir.c, dln.c, parse.y, re.c, ruby.c, sprintf.c, strftime.c, + string.c, util.c, variable.c: use strlcpy, memcpy and snprintf + instead of strcpy, strncpy and sprintf. + Mon Mar 16 17:15:16 2009 Nobuyoshi Nakada <nobu@r...> * test/dl/test_win32.rb (Win32API): enclosed by DL::TestWin32. Index: variable.c =================================================================== --- variable.c (revision 22983) +++ variable.c (revision 22984) @@ -455,10 +455,11 @@ if (name[0] == '$') id = rb_intern(name); else { - char *buf = ALLOCA_N(char, strlen(name)+2); + size_t len = strlen(name); + char *buf = ALLOCA_N(char, len+1); buf[0] = '$'; - strcpy(buf+1, name); - id = rb_intern(buf); + memcpy(buf+1, name, len); + id = rb_intern2(buf, len+1); } return id; } @@ -733,13 +734,14 @@ rb_f_global_variables(void) { VALUE ary = rb_ary_new(); - char buf[4]; - const char *s = "123456789"; + char buf[2]; + int i; st_foreach_safe(rb_global_tbl, gvar_i, ary); - while (*s) { - sprintf(buf, "$%c", *s++); - rb_ary_push(ary, ID2SYM(rb_intern(buf))); + buf[0] = '$'; + for (i = 1; i <= 9; ++i) { + buf[1] = (char)(i + '0'); + rb_ary_push(ary, ID2SYM(rb_intern2(buf, 2))); } return ary; } Index: string.c =================================================================== --- string.c (revision 22983) +++ string.c (revision 22984) @@ -4347,19 +4347,19 @@ if (MBCLEN_CHARFOUND_P(n)) { int cc = rb_enc_codepoint(p-1, pend, enc); p += n; - sprintf(q, "u{%x}", cc); + snprintf(q, qend-q, "u{%x}", cc); q += strlen(q); continue; } } - sprintf(q, "x%02X", c); + snprintf(q, qend-q, "x%02X", c); q += 3; } } *q++ = '"'; *q = '\0'; if (!rb_enc_asciicompat(enc)) { - sprintf(q, ".force_encoding(\"%s\")", enc->name); + snprintf(q, qend-q, ".force_encoding(\"%s\")", enc->name); enc = rb_ascii8bit_encoding(); } OBJ_INFECT(result, str); Index: dir.c =================================================================== --- dir.c (revision 22983) +++ dir.c (revision 22984) @@ -1463,7 +1463,8 @@ } if (lbrace && rbrace) { - char *buf = GLOB_ALLOC_N(char, strlen(s) + 1); + size_t len = strlen(s) + 1; + char *buf = GLOB_ALLOC_N(char, len); long shift; if (!buf) return -1; @@ -1482,7 +1483,7 @@ Inc(p, pend, enc); } memcpy(buf+shift, t, p-t); - strcpy(buf+shift+(p-t), rbrace+1); + strlcpy(buf+shift+(p-t), rbrace+1, len-(shift+(p-t))); status = ruby_brace_expand(buf, flags, func, arg, enc); if (status) break; } Index: sprintf.c =================================================================== --- sprintf.c (revision 22983) +++ sprintf.c (revision 22984) @@ -988,7 +988,7 @@ buf[blen++] = '+'; else if (flags & FSPACE) blen++; - strncpy(&buf[blen], expr, strlen(expr)); + memcpy(&buf[blen], expr, strlen(expr)); } else { if (!isnan(fval) && fval < 0.0) @@ -997,8 +997,8 @@ buf[blen + need - strlen(expr) - 1] = '+'; else if ((flags & FSPACE) && need > width) blen++; - strncpy(&buf[blen + need - strlen(expr)], expr, - strlen(expr)); + memcpy(&buf[blen + need - strlen(expr)], expr, + strlen(expr)); } blen += strlen(&buf[blen]); break; Index: strftime.c =================================================================== --- strftime.c (revision 22983) +++ strftime.c (revision 22984) @@ -243,7 +243,7 @@ savetz = (char *) malloc(tzlen + 1); if (savetz != NULL) { savetzlen = tzlen + 1; - strcpy(savetz, tz); + memcpy(savetz, tz, savetzlen); } } tzset(); @@ -256,10 +256,10 @@ savetz = (char *) realloc(savetz, i); if (savetz) { savetzlen = i; - strcpy(savetz, tz); + memcpy(savetz, tz, i); } } else - strcpy(savetz, tz); + memcpy(savetz, tz, i); tzset(); } #endif /* POSIX_SEMANTICS */ Index: parse.y =================================================================== --- parse.y (revision 22983) +++ parse.y (revision 22984) @@ -881,10 +881,10 @@ | keyword_alias tGVAR tBACK_REF { /*%%%*/ - char buf[3]; - - sprintf(buf, "$%c", (char)$3->nd_nth); - $$ = NEW_VALIAS($2, rb_intern(buf)); + char buf[2]; + buf[0] = '$'; + buf[1] = (char)$3->nd_nth; + $$ = NEW_VALIAS($2, rb_intern2(buf, 2)); /*% $$ = dispatch2(var_alias, $2, $3); %*/ @@ -7041,7 +7041,7 @@ if (nondigit) { char tmp[30]; trailing_uc: - sprintf(tmp, "trailing `%c' in number", nondigit); + snprintf(tmp, sizeof(tmp), "trailing `%c' in number", nondigit); yyerror(tmp); } if (is_float) { @@ -10011,9 +10011,9 @@ char buf[8]; if (id <= 256) { - buf[0] = id; + buf[0] = (char)id; buf[1] = '\0'; - return ID2SYM(rb_intern(buf)); + return ID2SYM(rb_intern2(buf, 1)); } if ((name = keyword_id_to_str(id))) { return ID2SYM(rb_intern(name)); Index: dln.c =================================================================== --- dln.c (revision 22983) +++ dln.c (revision 22984) @@ -127,7 +127,7 @@ free(*buf);\ rb_memerror();\ }\ - strcpy(tmp, *buf);\ + strlcpy(tmp, *buf, len + 1);\ free(*buf);\ *buf = tmp;\ } while (0) @@ -1224,7 +1224,7 @@ /* Load the file as an object one */ init_funcname(&buf, file); - strcpy(winfile, file); + strlcpy(winfile, file, sizeof(winfile)); /* Load file */ if ((handle = LoadLibrary(winfile)) == NULL) { @@ -1669,7 +1669,7 @@ fprintf(stderr, "\tFile \"%s%s\"\n", fname, extension[j]); continue; } - strcpy(bp + i, extension[j]); + strlcpy(bp + i, extension[j], fspace); if (stat(fbuf, &st) == 0) return fbuf; } Index: util.c =================================================================== --- util.c (revision 22983) +++ util.c (revision 22984) @@ -270,6 +270,7 @@ char *s, *t, *p; long slen; char buf[1024]; + char *const bufend = buf + sizeof(buf); if (RSTRING_LEN(str) > 1000) rb_fatal("Cannot do inplace edit on long filename (%ld characters)", @@ -300,7 +301,7 @@ if (*suffix == '.') { /* Style 1 */ if (strEQ(ext, suffix)) goto fallback; - strcpy(p, suffix); + strlcpy(p, suffix, bufend - p); } else if (suffix[1] == '\0') { /* Style 2 */ if (extlen < 4) { @@ -317,7 +318,7 @@ buf[7] = *suffix; } else goto fallback; - strcpy(p, ext); + strlcpy(p, ext, bufend - p); } else { /* Style 3: Panic */ fallback: Index: ruby.c =================================================================== --- ruby.c (revision 22983) +++ ruby.c (revision 22984) @@ -379,7 +379,7 @@ } } else { - strcpy(libpath, "."); + strlcpy(libpath, ".", sizeof(libpath)); p = libpath + 1; } @@ -522,15 +522,16 @@ char **argv, *p; const char *ap = 0; VALUE argstr, argary; + int len; while (ISSPACE(*s)) s++; if (!*s) return; - argstr = rb_str_tmp_new(strlen(s) + 2); + argstr = rb_str_tmp_new((len = strlen(s)) + 2); argary = rb_str_tmp_new(0); p = RSTRING_PTR(argstr); *p++ = ' '; - strcpy(p, s); + memcpy(p, s, len + 1); ap = 0; rb_str_cat(argary, (char *)&ap, sizeof(ap)); while (*p) { -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/