From: nobu.nakada@... Date: 2002-08-29T19:56:38+09:00 Subject: [ruby-dev:18097] StringValuePtr() instead of StringValue() and RSTRING()->ptr なかだです。 At Thu, 29 Aug 2002 09:08:16 +0000, matz wrote: > * string.c (rb_string_value_ptr): StringValuePtr() should never > return NULL pointer. StringValuePtr()を使わずにStringValue()とRSTRING()->ptrを使って るところで、問題になりそうな部分です。 DL::PtrData#[]=で、実際のデータよりも大きい長さを指定された場合 はエラーにしたほうがいいかも知れませんが。 Index: ext/Win32API/Win32API.c =================================================================== RCS file: /cvs/ruby/src/ruby/ext/Win32API/Win32API.c,v retrieving revision 1.13 diff -u -2 -p -r1.13 Win32API.c --- ext/Win32API/Win32API.c 11 Jun 2002 01:27:47 -0000 1.13 +++ ext/Win32API/Win32API.c 29 Aug 2002 10:01:36 -0000 @@ -250,5 +250,5 @@ Win32API_Call(argc, argv, obj) StringValue(str); rb_str_modify(str); - pParam = RSTRING(str)->ptr; + pParam = StringValuePtr(str) } #if defined(_MSC_VER) || defined(__LCC__) Index: ext/dl/ptr.c =================================================================== RCS file: /cvs/ruby/src/ruby/ext/dl/ptr.c,v retrieving revision 1.9 diff -u -2 -p -r1.9 ptr.c --- ext/dl/ptr.c 5 Aug 2002 01:24:13 -0000 1.9 +++ ext/dl/ptr.c 29 Aug 2002 10:45:37 -0000 @@ -859,17 +859,19 @@ rb_dlptr_aset(int argc, VALUE argv[], VA if( TYPE(key) == T_FIXNUM || TYPE(key) == T_BIGNUM ){ void *dst, *src; - int len; - + long len; + StringValue(val); Data_Get_Struct(self, struct ptr_data, data); dst = (void*)((long)(data->ptr) + DLNUM2LONG(key)); src = RSTRING(val)->ptr; + len = RSTRING(val)->len; if( num == Qnil ){ - len = RSTRING(val)->len; + memcpy(dst, src, len); } else{ - len = NUM2INT(num); + long n = NUM2INT(num); + memcpy(dst, src, n < len ? n : len); + if( n > len ) MEMZERO((char*)dst + len, char, n - len); }; - memcpy(dst, src, len); return val; }; Index: ext/nkf/nkf.c =================================================================== RCS file: /cvs/ruby/src/ruby/ext/nkf/nkf.c,v retrieving revision 1.7 diff -u -2 -p -r1.7 nkf.c --- ext/nkf/nkf.c 18 Jul 2001 05:55:22 -0000 1.7 +++ ext/nkf/nkf.c 29 Aug 2002 09:52:18 -0000 @@ -105,4 +105,5 @@ rb_nkf_guess(obj, src) p = RSTRING(src)->ptr; pend = p + RSTRING(src)->len; + if (p == pend) return INT2FIX(_UNKNOWN); #define INCR do {\ Index: ext/readline/readline.c =================================================================== RCS file: /cvs/ruby/src/ruby/ext/readline/readline.c,v retrieving revision 1.10 diff -u -2 -p -r1.10 readline.c --- ext/readline/readline.c 6 Aug 2002 06:20:07 -0000 1.10 +++ ext/readline/readline.c 29 Aug 2002 10:34:55 -0000 @@ -192,9 +192,7 @@ readline_s_set_completion_append_charact { #ifdef READLINE_21_OR_LATER - if (NIL_P(str)) { + if (NIL_P(str) || !StringValuePtr(str) || !RSTRING(str)->len) { rl_completion_append_character = '\0'; } else { - StringValue(str); - rl_completion_append_character = RSTRING(str)->ptr[0]; } Index: ext/socket/socket.c =================================================================== RCS file: /cvs/ruby/src/ruby/ext/socket/socket.c,v retrieving revision 1.82 diff -u -2 -p -r1.82 socket.c --- ext/socket/socket.c 1 Aug 2002 09:42:38 -0000 1.82 +++ ext/socket/socket.c 29 Aug 2002 10:30:20 -0000 @@ -2168,6 +2168,5 @@ sock_s_getaddrinfo(argc, argv) hints.ai_family = FIX2INT(family); } - else { - StringValue(family); + else if (StringValuePtr(family)) { if (strcmp(RSTRING(family)->ptr, "AF_INET") == 0) { hints.ai_family = PF_INET; @@ -2288,6 +2287,5 @@ sock_s_getnameinfo(argc, argv) hints.ai_family = FIX2INT(af); } - else { - StringValue(af); + else if (StringValuePtr(af)) { if (strcmp(RSTRING(af)->ptr, "AF_INET") == 0) { hints.ai_family = PF_INET; Index: ext/tcltklib/tcltklib.c =================================================================== RCS file: /cvs/ruby/src/ruby/ext/tcltklib/tcltklib.c,v retrieving revision 1.15 diff -u -2 -p -r1.15 tcltklib.c --- ext/tcltklib/tcltklib.c 19 Aug 2002 05:56:07 -0000 1.15 +++ ext/tcltklib/tcltklib.c 29 Aug 2002 10:39:48 -0000 @@ -566,4 +566,5 @@ ip_toUTF8(self, str, encodename) StringValue(str); encoding = Tcl_GetEncoding(interp, RSTRING(encodename)->ptr); + if (!RSTRING(str)->len) return str; buf = ALLOCA_N(char,strlen(RSTRING(str)->ptr)+1); strcpy(buf, RSTRING(str)->ptr); @@ -599,4 +600,5 @@ ip_fromUTF8(self, str, encodename) StringValue(str); encoding = Tcl_GetEncoding(interp,RSTRING(encodename)->ptr); + if (!RSTRING(str)->len) return str; buf = ALLOCA_N(char,strlen(RSTRING(str)->ptr)+1); strcpy(buf,RSTRING(str)->ptr); -- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦