From f0f0cb23acc155e24a70a718801e807c80349e13 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Fri, 9 Jan 2015 04:18:21 +0000 Subject: for_fd: delay assigning to mq->des until after mq_getattr We do not want to assign to mq->des before verifying we have a valid message queue, otherwise the GC may misclose an invalid MQ descriptor (which may be a valid FD). --- ext/posix_mq/posix_mq.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'ext/posix_mq/posix_mq.c') diff --git a/ext/posix_mq/posix_mq.c b/ext/posix_mq/posix_mq.c index 5e8122e..93e3913 100644 --- a/ext/posix_mq/posix_mq.c +++ b/ext/posix_mq/posix_mq.c @@ -384,13 +384,15 @@ static VALUE for_fd(VALUE klass, VALUE socket) { VALUE mqv = alloc(klass); struct posix_mq *mq = get(mqv, 0); + mqd_t mqd; mq->name = Qnil; - mq->des = FD_TO_MQD(NUM2INT(socket)); + mqd = FD_TO_MQD(NUM2INT(socket)); - if (mq_getattr(mq->des, &mq->attr) < 0) + if (mq_getattr(mqd, &mq->attr) < 0) rb_sys_fail("provided file descriptor is not a POSIX MQ"); + mq->des = mqd; return mqv; } #endif /* FD_TO_MQD */ -- cgit v1.2.3-24-ge0c7