diff options
Diffstat (limited to 'ext')
-rw-r--r-- | ext/socket/rubysocket.h | 2 | ||||
-rw-r--r-- | ext/socket/socket.c | 15 |
2 files changed, 9 insertions, 8 deletions
diff --git a/ext/socket/rubysocket.h b/ext/socket/rubysocket.h index c68cff1d41..75d735e1bf 100644 --- a/ext/socket/rubysocket.h +++ b/ext/socket/rubysocket.h @@ -342,7 +342,7 @@ void rsock_init_socket_init(void); NORETURN(void rsock_sys_fail_host_port(const char *, VALUE, VALUE)); NORETURN(void rsock_sys_fail_path(const char *, VALUE)); -NORETURN(void rsock_sys_fail_sockaddr(const char *, VALUE addr)); +NORETURN(void rsock_sys_fail_sockaddr(const char *, struct sockaddr *addr, socklen_t len)); NORETURN(void rsock_sys_fail_addrinfo(const char *, VALUE rai)); NORETURN(void rsock_sys_fail_sockaddr_or_addrinfo(const char *, VALUE addr, VALUE rai)); diff --git a/ext/socket/socket.c b/ext/socket/socket.c index 9783313ede..bb8bdac47c 100644 --- a/ext/socket/socket.c +++ b/ext/socket/socket.c @@ -47,14 +47,11 @@ rsock_sys_fail_path(const char *mesg, VALUE path) } void -rsock_sys_fail_sockaddr(const char *mesg, VALUE addr) +rsock_sys_fail_sockaddr(const char *mesg, struct sockaddr *addr, socklen_t len) { VALUE rai; - rai = rsock_addrinfo_new( - (struct sockaddr *)RSTRING_PTR(addr), - (socklen_t)RSTRING_LEN(addr), /* overflow should be checked already */ - PF_UNSPEC, 0, 0, Qnil, Qnil); + rai = rsock_addrinfo_new(addr, len, PF_UNSPEC, 0, 0, Qnil, Qnil); rsock_sys_fail_addrinfo(mesg, rai); } @@ -73,8 +70,12 @@ rsock_sys_fail_addrinfo(const char *mesg, VALUE rai) void rsock_sys_fail_addrinfo_or_sockaddr(const char *mesg, VALUE addr, VALUE rai) { - if (NIL_P(rai)) - rsock_sys_fail_sockaddr(mesg, addr); + if (NIL_P(rai)) { + StringValue(addr); + rsock_sys_fail_sockaddr(mesg, + (struct sockaddr *)RSTRING_PTR(addr), + (socklen_t)RSTRING_LEN(addr)); /* overflow should be checked already */ + } else rsock_sys_fail_addrinfo(mesg, rai); } |