summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorTomoyuki Sahara <[email protected]>2014-12-26 13:27:39 +0900
committerTomoyuki Sahara <[email protected]>2014-12-26 13:27:39 +0900
commita09858af61e63c5b93f5bb858b6fa1c74a3e7dc7 (patch)
treecd3e8dd499386ddc47e8b6b69d1a05e1a2018d3a /src
parenta960a6f93184cdf6af839775dbb55022d5fbde8a (diff)
downloadmruby-a09858af61e63c5b93f5bb858b6fa1c74a3e7dc7.tar.gz
mruby-a09858af61e63c5b93f5bb858b6fa1c74a3e7dc7.zip
syscalls may return sockaddr shorter than sizeof(struct sockaddr) on Linux.
Diffstat (limited to 'src')
-rw-r--r--src/socket.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/src/socket.c b/src/socket.c
index ea958f953..f2e4e2e0b 100644
--- a/src/socket.c
+++ b/src/socket.c
@@ -549,9 +549,15 @@ mrb_socket_sockaddr_family(mrb_state *mrb, mrb_value klass)
mrb_value sa;
mrb_get_args(mrb, "S", &sa);
+#ifdef __linux__
+ if (RSTRING_LEN(sa) < offsetof(struct sockaddr, sa_family) + sizeof(sa_family_t)) {
+ mrb_raisef(mrb, E_SOCKET_ERROR, "invalid sockaddr (too short)");
+ }
+#else
if (RSTRING_LEN(sa) < sizeof(struct sockaddr)) {
mrb_raisef(mrb, E_SOCKET_ERROR, "invalid sockaddr (too short)");
}
+#endif
return mrb_fixnum_value(((struct sockaddr *)RSTRING_PTR(sa))->sa_family);
}