summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorTomoyuki Sahara <[email protected]>2017-06-13 12:13:04 +0900
committerTomoyuki Sahara <[email protected]>2017-06-13 12:13:04 +0900
commit81a0dcdb7a83f618e572d0dd7be3e99587d1a84d (patch)
treeba3b7b42e9b3751c50fa9ce564cb81c0a898143e /src
parent3dad125a1cd93e70a1762e9c6a1d5e01554ad71c (diff)
downloadmruby-81a0dcdb7a83f618e572d0dd7be3e99587d1a84d.tar.gz
mruby-81a0dcdb7a83f618e572d0dd7be3e99587d1a84d.zip
sizeof(optval) must be 1 for IP_MULTICAST_TTL & IP_MULTICAST_LOOP. fixes #34.
Diffstat (limited to 'src')
-rw-r--r--src/socket.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/src/socket.c b/src/socket.c
index e28d7cd5d..44534827a 100644
--- a/src/socket.c
+++ b/src/socket.c
@@ -433,8 +433,13 @@ mrb_basicsocket_setsockopt(mrb_state *mrb, mrb_value self)
mrb_int i = mrb_test(optval) ? 1 : 0;
optval = mrb_str_new(mrb, (char *)&i, sizeof(i));
} else if (mrb_fixnum_p(optval)) {
- mrb_int i = mrb_fixnum(optval);
- optval = mrb_str_new(mrb, (char *)&i, sizeof(i));
+ if (optname == IP_MULTICAST_TTL || optname == IP_MULTICAST_LOOP) {
+ char uc = mrb_fixnum(optval);
+ optval = mrb_str_new(mrb, &uc, sizeof(uc));
+ } else {
+ mrb_int i = mrb_fixnum(optval);
+ optval = mrb_str_new(mrb, (char *)&i, sizeof(i));
+ }
} else {
mrb_raise(mrb, E_ARGUMENT_ERROR, "optval should be true, false, an integer, or a string");
}