diff options
author | naruse <naruse@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2014-02-05 13:08:32 +0000 |
---|---|---|
committer | naruse <naruse@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2014-02-05 13:08:32 +0000 |
commit | 1b05b4f4abbb7352f04e718ba7a4c62859f91a92 (patch) | |
tree | 804969af513a7b984f83f9201b65a321b1b6bb77 /ext | |
parent | c00e288936dbcfcaa3b9eaadbd14ab94f778389e (diff) |
merge revision(s) 44490,44496: [Backport #9352]
* ext/socket/socket.c (rsock_sys_fail_host_port): save and restore errno
before calling rb_sys_fail_str to prevent [BUG] errno == 0.
Patch by Eric Wong. [ruby-core:59498] [Bug #9352]
* ext/socket/socket.c (rsock_sys_fail_path): ditto
* ext/socket/socket.c (rsock_sys_fail_sockaddr): ditto
* ext/socket/socket.c (rsock_sys_fail_raddrinfo): ditto
* ext/socket/socket.c (rsock_sys_fail_raddrinfo_or_sockaddr): ditto
* ext/socket/socket.c (rsock_syserr_fail_host_port): add errno
argument version anduse rb_syserr_fail_str() instead of
rb_sys_fail_str() with restoring errno.
* ext/socket/socket.c (rsock_syserr_fail_path): ditto, and
rb_syserr_fail().
* ext/socket/socket.c (rsock_sys_fail_sockaddr): ditto, use
rsock_syserr_fail_raddrinfo().
* ext/socket/socket.c (rsock_sys_fail_raddrinfo): ditto.
* ext/socket/socket.c (setup_domain_and_type): ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_1@44842 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'ext')
-rw-r--r-- | ext/socket/rubysocket.h | 6 | ||||
-rw-r--r-- | ext/socket/socket.c | 46 |
2 files changed, 45 insertions, 7 deletions
diff --git a/ext/socket/rubysocket.h b/ext/socket/rubysocket.h index 97c02fc410..c74fb326ec 100644 --- a/ext/socket/rubysocket.h +++ b/ext/socket/rubysocket.h @@ -374,6 +374,12 @@ void rsock_init_sockopt(void); void rsock_init_sockifaddr(void); void rsock_init_socket_init(void); +NORETURN(void rsock_syserr_fail_host_port(int err, const char *, VALUE, VALUE)); +NORETURN(void rsock_syserr_fail_path(int err, const char *, VALUE)); +NORETURN(void rsock_syserr_fail_sockaddr(int err, const char *mesg, struct sockaddr *addr, socklen_t len)); +NORETURN(void rsock_syserr_fail_raddrinfo(int err, const char *mesg, VALUE rai)); +NORETURN(void rsock_syserr_fail_raddrinfo_or_sockaddr(int err, const char *mesg, VALUE addr, VALUE rai)); + 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 *, struct sockaddr *addr, socklen_t len)); diff --git a/ext/socket/socket.c b/ext/socket/socket.c index 5fd74652c6..c7fc5b76cb 100644 --- a/ext/socket/socket.c +++ b/ext/socket/socket.c @@ -15,6 +15,12 @@ static VALUE sock_s_unpack_sockaddr_in(VALUE, VALUE); void rsock_sys_fail_host_port(const char *mesg, VALUE host, VALUE port) { + rsock_syserr_fail_host_port(errno, mesg, host, port); +} + +void +rsock_syserr_fail_host_port(int err, const char *mesg, VALUE host, VALUE port) +{ VALUE message; port = rb_String(port); @@ -22,13 +28,20 @@ rsock_sys_fail_host_port(const char *mesg, VALUE host, VALUE port) message = rb_sprintf("%s for \"%s\" port %s", mesg, StringValueCStr(host), StringValueCStr(port)); - rb_sys_fail_str(message); + rb_syserr_fail_str(err, message); } void rsock_sys_fail_path(const char *mesg, VALUE path) { + rsock_syserr_fail_path(errno, mesg, path); +} + +void +rsock_syserr_fail_path(int err, const char *mesg, VALUE path) +{ VALUE message; + if (RB_TYPE_P(path, T_STRING)) { if (memchr(RSTRING_PTR(path), '\0', RSTRING_LEN(path))) { path = rb_str_inspect(path); @@ -39,45 +52,64 @@ rsock_sys_fail_path(const char *mesg, VALUE path) message = rb_sprintf("%s for \"%s\"", mesg, StringValueCStr(path)); } - rb_sys_fail_str(message); + rb_syserr_fail_str(err, message); } else { - rb_sys_fail(mesg); + rb_syserr_fail(err, mesg); } } void rsock_sys_fail_sockaddr(const char *mesg, struct sockaddr *addr, socklen_t len) { + rsock_syserr_fail_sockaddr(errno, mesg, addr, len); +} + +void +rsock_syserr_fail_sockaddr(int err, const char *mesg, struct sockaddr *addr, socklen_t len) +{ VALUE rai; rai = rsock_addrinfo_new(addr, len, PF_UNSPEC, 0, 0, Qnil, Qnil); - rsock_sys_fail_raddrinfo(mesg, rai); + rsock_syserr_fail_raddrinfo(err, mesg, rai); } void rsock_sys_fail_raddrinfo(const char *mesg, VALUE rai) { + rsock_syserr_fail_raddrinfo(errno, mesg, rai); +} + +void +rsock_syserr_fail_raddrinfo(int err, const char *mesg, VALUE rai) +{ VALUE str, message; str = rsock_addrinfo_inspect_sockaddr(rai); message = rb_sprintf("%s for %s", mesg, StringValueCStr(str)); - rb_sys_fail_str(message); + rb_syserr_fail_str(err, message); } void rsock_sys_fail_raddrinfo_or_sockaddr(const char *mesg, VALUE addr, VALUE rai) { + rsock_syserr_fail_raddrinfo_or_sockaddr(errno, mesg, addr, rai); +} + +void +rsock_syserr_fail_raddrinfo_or_sockaddr(int err, const char *mesg, VALUE addr, VALUE rai) +{ if (NIL_P(rai)) { StringValue(addr); - rsock_sys_fail_sockaddr(mesg, + + rsock_syserr_fail_sockaddr(err, mesg, (struct sockaddr *)RSTRING_PTR(addr), (socklen_t)RSTRING_LEN(addr)); /* overflow should be checked already */ } else - rsock_sys_fail_raddrinfo(mesg, rai); + rsock_syserr_fail_raddrinfo(err, mesg, rai); } static void |