[Ruby 1.9 - Bug #5075][Assigned] invalid *fdp in Mac OS X and FreeBSD over recvmsg with SCM_RIGHTS

Issue #5075 has been reported by Yui NARUSE.


Bug #5075: invalid *fdp in Mac OS X and FreeBSD over recvmsg with
SCM_RIGHTS

Author: Yui NARUSE
Status: Assigned
Priority: Normal
Assignee: Akira T.
Category: ext
Target version: 1.9.3
ruby -v: ruby 1.9.4dev (2011-07-22 trunk 32604) [x86_64-freebsd8.2]

Mac OS X と FreeBSD にて、存在しない fd を close してしまう問題について、
現在 r32598 で応急処置が施されていますが、根本的な原因について、
sys/kern/uipc_socket.c を見るに、
http://www.freebsd.org/cgi/cvsweb.cgi/src/sys/kern/uipc_socket.c?rev=1.340.2.6.2.1;content-type=text%2Fplain;only_with_tag=RELENG_8_2_0_RELEASE

  • Process one or more MT_CONTROL mbufs present before any data mbufs
  • in the first mbuf chain on the socket buffer. If MSG_PEEK, we
  • just copy the data; if !MSG_PEEK, we call into the protocol to
  • perform externalization (or freeing if controlp == NULL).

とあるので、recvmsg に MSG_PEEK を与えた場合は invalid なものが返ってくると思うのですが。

ちなみに、以下のような printf パッチをあてて走らせると、discard_cmsg() に来たものは全て invalid になっています。

diff --git a/ext/socket/ancdata.c b/ext/socket/ancdata.c
index 61e0576…ad44fb4 100644
— a/ext/socket/ancdata.c
+++ b/ext/socket/ancdata.c
@@ -1379,6 +1379,7 @@ rb_recvmsg(int fd, struct msghdr *msg, int flags)
static void
discard_cmsg(struct cmsghdr *cmh, char *msg_end)
{

  • fprintf(stderr, “discard_cmsg-begin\n”);
    if (cmh->cmsg_level == SOL_SOCKET && cmh->cmsg_type == SCM_RIGHTS)
    {
    int *fdp = (int *)CMSG_DATA(cmh);
    int *end = (int *)((char *)cmh + cmh->cmsg_len);
    @@ -1391,12 +1392,18 @@ discard_cmsg(struct cmsghdr *cmh, char *msg_end)
    */
    struct stat buf;
    if (fstat(*fdp, &buf) == 0) {
  •       fprintf(stderr, "fdp: %d is valid   (%p %p %p)\n", 
    

*fdp,fdp,end,msg_end);
rb_update_max_fd(*fdp);
close(*fdp);
}

  •       else {
    
  •           fprintf(stderr, "fdp: %d is invalid (%p %p %p)\n", 
    

*fdp,fdp,end,msg_end);

  •           rb_backtrace();
    
  •       }
           fdp++;
       }
    
    }
  • fprintf(stderr, “discard_cmsg-end\n”);
    }
    #endif

@@ -1432,6 +1439,7 @@ make_io_for_unix_rights(VALUE ctl, struct cmsghdr
*cmh, char *msg_end)
(char *)fdp + sizeof(int) <= msg_end) {
int fd = *fdp;
struct stat stbuf;

  • fprintf(stderr,“makeiounixr: %d (%p %p %p)\n”, *fdp,fdp,end,msg_end);
    VALUE io;
    if (fstat(fd, &stbuf) == -1)
    rb_raise(rb_eSocket, “invalid fd in SCM_RIGHTS”);

Issue #5075 has been updated by Motohiro KOSAKI.

xnu/bsd/kern/uipc_socket.c
に全く同じコメントがあるので、FreeBSD由来のコードで同じ問題にあたってるんじゃないですかね。


Bug #5075: invalid *fdp in Mac OS X and FreeBSD over recvmsg with
SCM_RIGHTS

Author: Yui NARUSE
Status: Assigned
Priority: Normal
Assignee: Akira T.
Category: ext
Target version: 1.9.3
ruby -v: ruby 1.9.4dev (2011-07-22 trunk 32604) [x86_64-freebsd8.2]

Mac OS X と FreeBSD にて、存在しない fd を close してしまう問題について、
現在 r32598 で応急処置が施されていますが、根本的な原因について、
sys/kern/uipc_socket.c を見るに、
http://www.freebsd.org/cgi/cvsweb.cgi/src/sys/kern/uipc_socket.c?rev=1.340.2.6.2.1;content-type=text%2Fplain;only_with_tag=RELENG_8_2_0_RELEASE

  • Process one or more MT_CONTROL mbufs present before any data mbufs
  • in the first mbuf chain on the socket buffer. If MSG_PEEK, we
  • just copy the data; if !MSG_PEEK, we call into the protocol to
  • perform externalization (or freeing if controlp == NULL).

とあるので、recvmsg に MSG_PEEK を与えた場合は invalid なものが返ってくると思うのですが。

ちなみに、以下のような printf パッチをあてて走らせると、discard_cmsg() に来たものは全て invalid になっています。

diff --git a/ext/socket/ancdata.c b/ext/socket/ancdata.c
index 61e0576…ad44fb4 100644
— a/ext/socket/ancdata.c
+++ b/ext/socket/ancdata.c
@@ -1379,6 +1379,7 @@ rb_recvmsg(int fd, struct msghdr *msg, int flags)
static void
discard_cmsg(struct cmsghdr *cmh, char *msg_end)
{

  • fprintf(stderr, “discard_cmsg-begin\n”);
    if (cmh->cmsg_level == SOL_SOCKET && cmh->cmsg_type == SCM_RIGHTS)
    {
    int *fdp = (int *)CMSG_DATA(cmh);
    int *end = (int *)((char *)cmh + cmh->cmsg_len);
    @@ -1391,12 +1392,18 @@ discard_cmsg(struct cmsghdr *cmh, char *msg_end)
    */
    struct stat buf;
    if (fstat(*fdp, &buf) == 0) {
  •       fprintf(stderr, "fdp: %d is valid   (%p %p %p)\n", 
    

*fdp,fdp,end,msg_end);
rb_update_max_fd(*fdp);
close(*fdp);
}

  •       else {
    
  •           fprintf(stderr, "fdp: %d is invalid (%p %p %p)\n", 
    

*fdp,fdp,end,msg_end);

  •           rb_backtrace();
    
  •       }
           fdp++;
       }
    
    }
  • fprintf(stderr, “discard_cmsg-end\n”);
    }
    #endif

@@ -1432,6 +1439,7 @@ make_io_for_unix_rights(VALUE ctl, struct cmsghdr
*cmh, char *msg_end)
(char *)fdp + sizeof(int) <= msg_end) {
int fd = *fdp;
struct stat stbuf;

  • fprintf(stderr,“makeiounixr: %d (%p %p %p)\n”, *fdp,fdp,end,msg_end);
    VALUE io;
    if (fstat(fd, &stbuf) == -1)
    rb_raise(rb_eSocket, “invalid fd in SCM_RIGHTS”);

2011/7/22 Yui NARUSE [email protected]:

$B$H$“$k$N$G!”(Brecvmsg $B$K(B MSG_PEEK $B$rM?$($?>l9g$O(B invalid
$B$J$b$N$,JV$C$F$/$k$H;W$&$N$G$9$,!#(B

$B$*$)!"AG@2$i$7$$!#(B

$B$G$O$H$j$“$($:(B FreeBSD $B$H(B MacOS X $B$G(B MSG_PEEK
$B$N$H$-!”$H$$$&>r7o$G$9$+$M!#(B

Issue #5075 has been updated by Akira T…

File recvmsg-msg_peek-freebsd.patch added

$B$o$?$7$N(BOS X
(Lion)$B$OB>$N%P%0$G%F%9%H4D6-$H$7$FITE,@Z$J$N$G(BFreeBSD$B4D6-$N(B
$B?M$K%F%9%H$*4j$$$7$?$$!#(B

$B$"$H!"0JA0$N%a!<%k$GL@3N$K=q$1$F$$$^$;$s$G$7$?$,;d$,3NG’$7$?$N$O(BSnow
Leopard$B$N(B
$B%=!<%9$J$N$G!“C/$+$,(B Snow
Leopard$B0JA0$G$3$NLdBj$,H/@8$7$J$$$3$H$,3NG’$7$F$$$k$J$i(B
$B$o$?$7$,%3!<%I$r8mFI$7$F$$$^$9!#%3%a%s%HCf$K(B “Lion”
$B$HL@5-$7$F$”$k$N$G5$$K$J$C$F$$$^$9!#(B

Issue #5075 has been updated by Akira T…

File recvmsg-msg_peek-freebsd.patch added


Bug #5075: invalid *fdp in Mac OS X and FreeBSD over recvmsg with
SCM_RIGHTS

Author: Yui NARUSE
Status: Assigned
Priority: Normal
Assignee: Akira T.
Category: ext
Target version: 1.9.3
ruby -v: ruby 1.9.4dev (2011-07-22 trunk 32604) [x86_64-freebsd8.2]

Mac OS X と FreeBSD にて、存在しない fd を close してしまう問題について、
現在 r32598 で応急処置が施されていますが、根本的な原因について、
sys/kern/uipc_socket.c を見るに、
http://www.freebsd.org/cgi/cvsweb.cgi/src/sys/kern/uipc_socket.c?rev=1.340.2.6.2.1;content-type=text%2Fplain;only_with_tag=RELENG_8_2_0_RELEASE

  • Process one or more MT_CONTROL mbufs present before any data mbufs
  • in the first mbuf chain on the socket buffer. If MSG_PEEK, we
  • just copy the data; if !MSG_PEEK, we call into the protocol to
  • perform externalization (or freeing if controlp == NULL).

とあるので、recvmsg に MSG_PEEK を与えた場合は invalid なものが返ってくると思うのですが。

ちなみに、以下のような printf パッチをあてて走らせると、discard_cmsg() に来たものは全て invalid になっています。

diff --git a/ext/socket/ancdata.c b/ext/socket/ancdata.c
index 61e0576…ad44fb4 100644
— a/ext/socket/ancdata.c
+++ b/ext/socket/ancdata.c
@@ -1379,6 +1379,7 @@ rb_recvmsg(int fd, struct msghdr *msg, int flags)
static void
discard_cmsg(struct cmsghdr *cmh, char *msg_end)
{

  • fprintf(stderr, “discard_cmsg-begin\n”);
    if (cmh->cmsg_level == SOL_SOCKET && cmh->cmsg_type == SCM_RIGHTS)
    {
    int *fdp = (int *)CMSG_DATA(cmh);
    int *end = (int *)((char *)cmh + cmh->cmsg_len);
    @@ -1391,12 +1392,18 @@ discard_cmsg(struct cmsghdr *cmh, char *msg_end)
    */
    struct stat buf;
    if (fstat(*fdp, &buf) == 0) {
  •       fprintf(stderr, "fdp: %d is valid   (%p %p %p)\n", 
    

*fdp,fdp,end,msg_end);
rb_update_max_fd(*fdp);
close(*fdp);
}

  •       else {
    
  •           fprintf(stderr, "fdp: %d is invalid (%p %p %p)\n", 
    

*fdp,fdp,end,msg_end);

  •           rb_backtrace();
    
  •       }
           fdp++;
       }
    
    }
  • fprintf(stderr, “discard_cmsg-end\n”);
    }
    #endif

@@ -1432,6 +1439,7 @@ make_io_for_unix_rights(VALUE ctl, struct cmsghdr
*cmh, char *msg_end)
(char *)fdp + sizeof(int) <= msg_end) {
int fd = *fdp;
struct stat stbuf;

  • fprintf(stderr,“makeiounixr: %d (%p %p %p)\n”, *fdp,fdp,end,msg_end);
    VALUE io;
    if (fstat(fd, &stbuf) == -1)
    rb_raise(rb_eSocket, “invalid fd in SCM_RIGHTS”);

2011$BG/(B7$B7n(B23$BF|(B8:40 KOSAKI Motohiro
[email protected]:

$B$"$H!"0JA0$N%a!<%k$GL@3N$K=q$1$F$$$^$;$s$G$7$?$,;d$,3NG’$7$?$N$O(BSnow
Leopard$B$N(B
$B%=!<%9$J$N$G!“C/$+$,(B Snow
Leopard$B0JA0$G$3$NLdBj$,H/@8$7$J$$$3$H$,3NG’$7$F$$$k$J$i(B
$B$o$?$7$,%3!<%I$r8mFI$7$F$$$^$9!#%3%a%s%HCf$K(B “Lion”
$B$HL@5-$7$F$”$k$N$G5$$K$J$C$F$$$^$9!#(B

$B$=$3$O$?$7$+$K=q$-J}$rLB$$$^$7$?!#(B
MacOS X Lion $B$GLdBj$r3NG’$7$?$N$O(B nagachika $B$5$s$G$9!#(B

$B$$$^$N$H$3$mC/$b(B MacOS X Snow Leopard
$B0JA0$G$NF0:n3NG’$O$7$F$$$J$$$H;W$$$^$9!#(B
($B6=L#$,$“$k?M$,$$$?$i$J$k$;$5$s$,Ds<($7$?%Q%C%A$rEv$F$F(B test-all
$B$7$F!”(Binvalid $B$,=P$F$/$k$+(B
$B3NG’$7$F$_$F$/$@$5$$!#(B)

In message
[email protected]
on Sat, 23 Jul 2011 01:37:35 +0900,
Tanaka A. [email protected] wrote:

$B$H$“$k$N$G!”(Brecvmsg $B$K(B MSG_PEEK $B$rM?$($?>l9g$O(B invalid
$B$J$b$N$,JV$C$F$/$k$H;W$&$N$G$9$,!#(B

$B$*$)!“AG@2$i$7$$!#(B
$B$3$N%3%a%s%H$O(B NetBSD current
$B$K$b$”$j$^$9!#(BFreeBSD$B$+$i(B2008$BG/(B4$B7n(B14$BF|$K(B
$B<h$j9~$^$l$F$$$F!"%j%j!<%9$G$O(B NetBSD 5$B$K$O4^$^$l$F$$$^$9!#(B

$B0J>e!"(Bjust FYI.

2011$BG/(B7$B7n(B23$BF|(B9:26 Takahiro K. [email protected]:

$B$3$N%3%a%s%H$O(B NetBSD current
$B$K$b$“$j$^$9!#(BFreeBSD$B$+$i(B2008$BG/(B4$B7n(B14$BF|$K(B
$B<h$j9~$^$l$F$$$F!”%j%j!<%9$G$O(B NetBSD 5$B$K$O4^$^$l$F$$$^$9!#(B

$B$G$O>r7o$K(B defined(NetBSD) $B$b$D$1$k$H$$$&$3$H$G!#(B
$B%3%s%Q%$%k;~$K%F%9%H$7$?$$5$$b$7$^$9$,!#(B

$BK\Ev$O!“%+!<%M%k$O%3%s%Q%$%k;~$H$OJQ$o$k$3$H$b$”$k$7!“(B
$BF0E*$K8!::$G$-$k$H$$$$$s$G$9$,!#(B
fd $B$rJV$5$J$$$H$-$K$O!”(B-1 $B$K$7$F$/$l$l$P$$$$$N$K!#(B
($B$b$7$+$7$F!";vA0$K%P%C%U%!$r(B -1 $B$GKd$a?T$/$7$F$*$1$P$$$$!)(B)

$B$G$O>r7o$K(B defined(NetBSD) $B$b$D$1$k$H$$$&$3$H$G!#(B
$B%3%s%Q%$%k;~$K%F%9%H$7$?$$5$$b$7$^$9$,!#(B

$BK\Ev$O!"%+!<%M%k$O%3%s%Q%$%k;~$H$OJQ$o$k$3$H$b$"$k$7!"(B
$BF0E*$K8!::$G$-$k$H$$$$$s$G$9$,!#(B
fd $B$rJV$5$J$$$H$-$K$O!"(B-1 $B$K$7$F$/$l$l$P$$$$$N$K!#(B
($B$b$7$+$7$F!";vA0$K%P%C%U%!$r(B -1 $B$GKd$a?T$/$7$F$*$1$P$$$$!)(B)

$B:#$N$H$3$m%P!<%8%g%s0MB8$NMWAG$OGv$=$&$J$N$G(B
configure$B$GH=Dj$7$F$7$^$C$F(B
$B$$$$$N$G$O$J$$$G$7$g$&$+!#(B
$B3NG’$9$k5$$K$J$l$J$$$1$I(B
Dragonfly$B$H$+$b$-$C$HF1$85sF0$r<($9$H;W$$$^$9$7(B

Issue #5075 has been updated by Tomoyuki C…

わたしが確認したのは Snow Leopard でした。MSG_PEEK をつけた recvmsg() で不正な fd
が取り出されるのを確認しました。

Bug #5075: invalid *fdp in Mac OS X and FreeBSD over recvmsg with
SCM_RIGHTS

Author: Yui NARUSE
Status: Assigned
Priority: Normal
Assignee: Akira T.
Category: ext
Target version: 1.9.3
ruby -v: -

Mac OS X と FreeBSD にて、存在しない fd を close してしまう問題について、
現在 r32598 で応急処置が施されていますが、根本的な原因について、
sys/kern/uipc_socket.c を見るに、
http://www.freebsd.org/cgi/cvsweb.cgi/src/sys/kern/uipc_socket.c?rev=1.340.2.6.2.1;content-type=text%2Fplain;only_with_tag=RELENG_8_2_0_RELEASE

  • Process one or more MT_CONTROL mbufs present before any data mbufs
  • in the first mbuf chain on the socket buffer. If MSG_PEEK, we
  • just copy the data; if !MSG_PEEK, we call into the protocol to
  • perform externalization (or freeing if controlp == NULL).

とあるので、recvmsg に MSG_PEEK を与えた場合は invalid なものが返ってくると思うのですが。

ちなみに、以下のような printf パッチをあてて走らせると、discard_cmsg() に来たものは全て invalid になっています。

diff --git a/ext/socket/ancdata.c b/ext/socket/ancdata.c
index 61e0576…ad44fb4 100644
— a/ext/socket/ancdata.c
+++ b/ext/socket/ancdata.c
@@ -1379,6 +1379,7 @@ rb_recvmsg(int fd, struct msghdr *msg, int flags)
static void
discard_cmsg(struct cmsghdr *cmh, char *msg_end)
{

  • fprintf(stderr, “discard_cmsg-begin\n”);
    if (cmh->cmsg_level == SOL_SOCKET && cmh->cmsg_type == SCM_RIGHTS)
    {
    int *fdp = (int *)CMSG_DATA(cmh);
    int *end = (int *)((char *)cmh + cmh->cmsg_len);
    @@ -1391,12 +1392,18 @@ discard_cmsg(struct cmsghdr *cmh, char *msg_end)
    */
    struct stat buf;
    if (fstat(*fdp, &buf) == 0) {
  •       fprintf(stderr, "fdp: %d is valid   (%p %p %p)\n", 
    

*fdp,fdp,end,msg_end);
rb_update_max_fd(*fdp);
close(*fdp);
}

  •       else {
    
  •           fprintf(stderr, "fdp: %d is invalid (%p %p %p)\n", 
    

*fdp,fdp,end,msg_end);

  •           rb_backtrace();
    
  •       }
           fdp++;
       }
    
    }
  • fprintf(stderr, “discard_cmsg-end\n”);
    }
    #endif

@@ -1432,6 +1439,7 @@ make_io_for_unix_rights(VALUE ctl, struct cmsghdr
*cmh, char *msg_end)
(char *)fdp + sizeof(int) <= msg_end) {
int fd = *fdp;
struct stat stbuf;

  • fprintf(stderr,“makeiounixr: %d (%p %p %p)\n”, *fdp,fdp,end,msg_end);
    VALUE io;
    if (fstat(fd, &stbuf) == -1)
    rb_raise(rb_eSocket, “invalid fd in SCM_RIGHTS”);

Issue #5075 has been updated by Akira T…

File 5075-1.9.2.patch added
Status changed from Closed to Assigned
Assignee changed from Akira T. to Yuki S.
Target version changed from 1.9.3 to 1.9.2

1.9.2 用のパッチを作ったので添付します。

Bug #5075: invalid *fdp in Mac OS X and FreeBSD over recvmsg with
SCM_RIGHTS

Author: Yui NARUSE
Status: Assigned
Priority: Normal
Assignee: Yuki S.
Category: ext
Target version: 1.9.2
ruby -v: -

Mac OS X と FreeBSD にて、存在しない fd を close してしまう問題について、
現在 r32598 で応急処置が施されていますが、根本的な原因について、
sys/kern/uipc_socket.c を見るに、
http://www.freebsd.org/cgi/cvsweb.cgi/src/sys/kern/uipc_socket.c?rev=1.340.2.6.2.1;content-type=text%2Fplain;only_with_tag=RELENG_8_2_0_RELEASE

  • Process one or more MT_CONTROL mbufs present before any data mbufs
  • in the first mbuf chain on the socket buffer. If MSG_PEEK, we
  • just copy the data; if !MSG_PEEK, we call into the protocol to
  • perform externalization (or freeing if controlp == NULL).

とあるので、recvmsg に MSG_PEEK を与えた場合は invalid なものが返ってくると思うのですが。

ちなみに、以下のような printf パッチをあてて走らせると、discard_cmsg() に来たものは全て invalid になっています。

diff --git a/ext/socket/ancdata.c b/ext/socket/ancdata.c
index 61e0576…ad44fb4 100644
— a/ext/socket/ancdata.c
+++ b/ext/socket/ancdata.c
@@ -1379,6 +1379,7 @@ rb_recvmsg(int fd, struct msghdr *msg, int flags)
static void
discard_cmsg(struct cmsghdr *cmh, char *msg_end)
{

  • fprintf(stderr, “discard_cmsg-begin\n”);
    if (cmh->cmsg_level == SOL_SOCKET && cmh->cmsg_type == SCM_RIGHTS)
    {
    int *fdp = (int *)CMSG_DATA(cmh);
    int *end = (int *)((char *)cmh + cmh->cmsg_len);
    @@ -1391,12 +1392,18 @@ discard_cmsg(struct cmsghdr *cmh, char *msg_end)
    */
    struct stat buf;
    if (fstat(*fdp, &buf) == 0) {
  •       fprintf(stderr, "fdp: %d is valid   (%p %p %p)\n", 
    

*fdp,fdp,end,msg_end);
rb_update_max_fd(*fdp);
close(*fdp);
}

  •       else {
    
  •           fprintf(stderr, "fdp: %d is invalid (%p %p %p)\n", 
    

*fdp,fdp,end,msg_end);

  •           rb_backtrace();
    
  •       }
           fdp++;
       }
    
    }
  • fprintf(stderr, “discard_cmsg-end\n”);
    }
    #endif

@@ -1432,6 +1439,7 @@ make_io_for_unix_rights(VALUE ctl, struct cmsghdr
*cmh, char *msg_end)
(char *)fdp + sizeof(int) <= msg_end) {
int fd = *fdp;
struct stat stbuf;

  • fprintf(stderr,“makeiounixr: %d (%p %p %p)\n”, *fdp,fdp,end,msg_end);
    VALUE io;
    if (fstat(fd, &stbuf) == -1)
    rb_raise(rb_eSocket, “invalid fd in SCM_RIGHTS”);

Issue #5075 has been updated by Akira T…

Status changed from Assigned to Closed

コンパイル時に挙動を検査するようにしました。

これで close とします。

Bug #5075: invalid *fdp in Mac OS X and FreeBSD over recvmsg with
SCM_RIGHTS

Author: Yui NARUSE
Status: Closed
Priority: Normal
Assignee: Akira T.
Category: ext
Target version: 1.9.3
ruby -v: -

Mac OS X と FreeBSD にて、存在しない fd を close してしまう問題について、
現在 r32598 で応急処置が施されていますが、根本的な原因について、
sys/kern/uipc_socket.c を見るに、
http://www.freebsd.org/cgi/cvsweb.cgi/src/sys/kern/uipc_socket.c?rev=1.340.2.6.2.1;content-type=text%2Fplain;only_with_tag=RELENG_8_2_0_RELEASE

  • Process one or more MT_CONTROL mbufs present before any data mbufs
  • in the first mbuf chain on the socket buffer. If MSG_PEEK, we
  • just copy the data; if !MSG_PEEK, we call into the protocol to
  • perform externalization (or freeing if controlp == NULL).

とあるので、recvmsg に MSG_PEEK を与えた場合は invalid なものが返ってくると思うのですが。

ちなみに、以下のような printf パッチをあてて走らせると、discard_cmsg() に来たものは全て invalid になっています。

diff --git a/ext/socket/ancdata.c b/ext/socket/ancdata.c
index 61e0576…ad44fb4 100644
— a/ext/socket/ancdata.c
+++ b/ext/socket/ancdata.c
@@ -1379,6 +1379,7 @@ rb_recvmsg(int fd, struct msghdr *msg, int flags)
static void
discard_cmsg(struct cmsghdr *cmh, char *msg_end)
{

  • fprintf(stderr, “discard_cmsg-begin\n”);
    if (cmh->cmsg_level == SOL_SOCKET && cmh->cmsg_type == SCM_RIGHTS)
    {
    int *fdp = (int *)CMSG_DATA(cmh);
    int *end = (int *)((char *)cmh + cmh->cmsg_len);
    @@ -1391,12 +1392,18 @@ discard_cmsg(struct cmsghdr *cmh, char *msg_end)
    */
    struct stat buf;
    if (fstat(*fdp, &buf) == 0) {
  •       fprintf(stderr, "fdp: %d is valid   (%p %p %p)\n", 
    

*fdp,fdp,end,msg_end);
rb_update_max_fd(*fdp);
close(*fdp);
}

  •       else {
    
  •           fprintf(stderr, "fdp: %d is invalid (%p %p %p)\n", 
    

*fdp,fdp,end,msg_end);

  •           rb_backtrace();
    
  •       }
           fdp++;
       }
    
    }
  • fprintf(stderr, “discard_cmsg-end\n”);
    }
    #endif

@@ -1432,6 +1439,7 @@ make_io_for_unix_rights(VALUE ctl, struct cmsghdr
*cmh, char *msg_end)
(char *)fdp + sizeof(int) <= msg_end) {
int fd = *fdp;
struct stat stbuf;

  • fprintf(stderr,“makeiounixr: %d (%p %p %p)\n”, *fdp,fdp,end,msg_end);
    VALUE io;
    if (fstat(fd, &stbuf) == -1)
    rb_raise(rb_eSocket, “invalid fd in SCM_RIGHTS”);