[#20036] Re: Roundoff problem with Float and Marshal — matz@... (Yukihiro Matsumoto)

まつもと ゆきひろです

16 messages 2003/04/18
[#20045] Re: Roundoff problem with Float and Marshal — nobu.nakada@... 2003/04/20

なかだです。

[#20063] Re: Roundoff problem with Float and Marshal — matz@... (Yukihiro Matsumoto) 2003/04/22

まつもと ゆきひろです

[#20097] jcode.rb — akira yamada / やまだあきら <akira@...>

25 messages 2003/04/26
[#20098] Re: jcode.rb — matz@... (Yukihiro Matsumoto) 2003/04/27

まつもと ゆきひろです

[#20105] Re: jcode.rb — WATANABE Hirofumi <eban@...> 2003/04/28

わたなべです。

[#20108] Re: jcode.rb — matz@... (Yukihiro Matsumoto) 2003/04/28

まつもと ゆきひろです

[ruby-dev:19965] unpack_sockaddr_in: sockaddr_in size differs

From: GOTOU Yuuzou <gotoyuzo@...>
Date: 2003-04-07 05:55:22 UTC
List: ruby-dev #19965
Socket::unpack_sockaddr_in が struct sockaddr_in6 の場合にエラー
になります。

% ruby -v
ruby 1.8.0 (2003-04-04) [i386-netbsd]
% ruby -r socket -e 'p Socket::unpack_sockaddr_in(Socket::pack_sockaddr_in(0,"::"))' 
-e:1:in `unpack_sockaddr_in': sockaddr_in size differs - 28 required; 16 given (TypeError)
        from -e:1

応急処置でパッチを作ったので添付してみます。
サイズのチェックが甘いですが、sockaddr_in が詰まった長めのバッ
ファを扱うプログラムを書いていたので、長い分にはエラーにならな
いほうが嬉しいと思います。

-- 
ごとうゆうぞう

diff -u -p -r1.91 socket.c
--- ext/socket/socket.c	16 Jan 2003 07:38:40 -0000	1.91
+++ ext/socket/socket.c	7 Apr 2003 05:32:08 -0000
@@ -2324,14 +2324,24 @@ static VALUE
 sock_s_unpack_sockaddr_in(self, addr)
     VALUE self, addr;
 {
+    struct sockaddr_storage buf;
+    size_t len;
     struct sockaddr_in * sockaddr;
     VALUE host;
 
-    sockaddr = (struct sockaddr_in*)StringValuePtr(addr);
-    if (RSTRING(addr)->len != sizeof(struct sockaddr_in)) {
-	rb_raise(rb_eTypeError, "sockaddr_in size differs - %ld required; %d given",
+    StringValue(addr);
+    if (RSTRING(addr)->len < sizeof(struct sockaddr_in)) {
+	rb_raise(rb_eTypeError,
+		 "sockaddr_in size differs - %ld required; %d given",
 		 RSTRING(addr)->len, sizeof(struct sockaddr_in));
     }
+    if(RSTRING(addr)->len < sizeof(struct sockaddr_storage))
+	len = RSTRING(addr)->len;
+    else
+	len = sizeof(struct sockaddr_storage);
+    sockaddr = (struct sockaddr_in*)&buf;
+    memset(sockaddr, 0, sizeof(struct sockaddr_storage));
+    memcpy(sockaddr, RSTRING(addr)->ptr, len);
     host = mkipaddr((struct sockaddr*)sockaddr);
     OBJ_INFECT(host, addr);
     return rb_assoc_new(INT2NUM(ntohs(sockaddr->sin_port)), host);

In This Thread

Prev Next