From: nobu.nakada@... Date: 2002-08-01T13:47:39+09:00 Subject: [ruby-list:35679] Re: STR2CSTR() なかだです。 At Thu, 1 Aug 2002 13:07:36 +0900, OHARA Shigeki wrote: > > |UDPSocket#recvfrom で得た文字列を STR2CSTR() で取り出そうとしたところ、 > > |得られた文字列が NULL 終端されていないことがありました。 > > | > > |STR2CSTR() で得られた文字列は、 > > |NULL 終端されていることが保証されていないのでしょうか? > > > > 保証しているつもりです。どっかにバグがあったんでしょうか。 UDPSocket#recvfromが、RSTRING(str)->lenを書き換えるだけでNUL終 端してませんね。とりあえずresizeしておいたほうがいいと思います が、rb_str2cstr()でも保証したほうがいいでしょうか。 Index: ext/socket/socket.c =================================================================== RCS file: /cvs/ruby/src/ruby/ext/socket/socket.c,v retrieving revision 1.35.2.15 diff -u -2 -p -r1.35.2.15 socket.c --- ext/socket/socket.c 11 Jun 2002 06:58:39 -0000 1.35.2.15 +++ ext/socket/socket.c 1 Aug 2002 04:41:46 -0000 @@ -435,4 +435,5 @@ s_recvfrom(sock, argc, argv, from) socklen_t alen = sizeof buf; VALUE len, flg; + long slen; int fd, flags; @@ -448,14 +449,14 @@ s_recvfrom(sock, argc, argv, from) fd = fileno(fptr->f); - str = rb_tainted_str_new(0, NUM2INT(len)); + str = rb_tainted_str_new(0, slen = NUM2INT(len)); retry: rb_thread_wait_fd(fd); TRAP_BEG; - RSTRING(str)->len = recvfrom(fd, RSTRING(str)->ptr, RSTRING(str)->len, flags, - (struct sockaddr*)buf, &alen); + slen = recvfrom(fd, RSTRING(str)->ptr, slen, flags, + (struct sockaddr*)buf, &alen); TRAP_END; - if (RSTRING(str)->len < 0) { + if (slen < 0) { switch (errno) { case EINTR: @@ -465,4 +466,7 @@ s_recvfrom(sock, argc, argv, from) rb_sys_fail("recvfrom(2)"); } + if (slen < RSTRING(str)->len) { + rb_str_resize(str, slen); + } rb_obj_taint(str); switch (from) { -- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦