From a09858af61e63c5b93f5bb858b6fa1c74a3e7dc7 Mon Sep 17 00:00:00 2001 From: Tomoyuki Sahara Date: Fri, 26 Dec 2014 13:27:39 +0900 Subject: syscalls may return sockaddr shorter than sizeof(struct sockaddr) on Linux. --- src/socket.c | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'src') 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); } -- cgit v1.2.3