From 07594eed503cf71bd270b8ea5532692326d09679 Mon Sep 17 00:00:00 2001 From: akr Date: Mon, 12 Jan 2009 16:00:03 +0000 Subject: * ext/socket/socket.c (sock_s_unpack_sockaddr_in): check too short sockaddr. (sock_s_unpack_sockaddr_un): ditto. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8@21469 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ext/socket/socket.c | 10 ++++++++++ 1 file changed, 10 insertions(+) (limited to 'ext') diff --git a/ext/socket/socket.c b/ext/socket/socket.c index 9385ad714e..1ff5cda8f6 100644 --- a/ext/socket/socket.c +++ b/ext/socket/socket.c @@ -3802,6 +3802,11 @@ sock_s_unpack_sockaddr_in(self, addr) VALUE host; sockaddr = (struct sockaddr_in*)StringValuePtr(addr); + if (RSTRING_LEN(addr) < + (char*)&((struct sockaddr *)sockaddr)->sa_family + + sizeof(((struct sockaddr *)sockaddr)->sa_family) - + (char*)sockaddr) + rb_raise(rb_eArgError, "too short sockaddr"); if (((struct sockaddr *)sockaddr)->sa_family != AF_INET #ifdef INET6 && ((struct sockaddr *)sockaddr)->sa_family != AF_INET6 @@ -3850,6 +3855,11 @@ sock_s_unpack_sockaddr_un(self, addr) VALUE path; sockaddr = (struct sockaddr_un*)StringValuePtr(addr); + if (RSTRING_LEN(addr) < + (char*)&((struct sockaddr *)sockaddr)->sa_family + + sizeof(((struct sockaddr *)sockaddr)->sa_family) - + (char*)sockaddr) + rb_raise(rb_eArgError, "too short sockaddr"); if (((struct sockaddr *)sockaddr)->sa_family != AF_UNIX) { rb_raise(rb_eArgError, "not an AF_UNIX sockaddr"); } -- cgit v1.2.3