まつもと ゆきひろです

In message "[ruby-list:35680] Re: STR2CSTR()"
    on 02/08/01, nobu.nakada / nifty.ne.jp <nobu.nakada / nifty.ne.jp> writes:

|At Thu, 1 Aug 2002 13:37:40 +0900,
|Yukihiro Matsumoto wrote:
|> -    if (RSTRING(str)->len < 0) {
|> +    if (len < 0) {
|
|VALUE lenなので負にはなれないのでは。

その通りです。中田さんのパッチを採用するべきか。

--- ext/socket/socket.c	2002/07/26 06:17:44	1.81
+++ ext/socket/socket.c	2002/08/01 05:10:08
@@ -436,2 +436,3 @@
     VALUE len, flg;
+    long slen;
     int fd, flags;
@@ -449,3 +450,4 @@
 
-    str = rb_tainted_str_new(0, NUM2INT(len));
+    slen = NUM2INT(len);
+    str = rb_tainted_str_new(0, slen);
 
@@ -454,7 +456,6 @@
     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) {
@@ -465,2 +466,6 @@
 	rb_sys_fail("recvfrom(2)");
+    }
+    if (slen < RSTRING(str)->len) {
+	RSTRING(str)->len = slen;
+	RSTRING(str)->ptr[slen] = '\0';
     }