なかだです。

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はできる。 中田 伸悦