Re: [Xenomai-core] [bug] accept() in non-blocking mode fails with EPERM instead of EAGAIN
Jan Kiszka wrote: > Gilles Chanteperdrix wrote: > >> Jan Kiszka wrote: >> >>> Matthieu Nottale wrote: >>> Hi, I believe I found a bug in the Xenomai Posix skin while trying to use boost::asio: The accept() call in asychronous mode fails with ENOPEM instead of EAGAIN. Other than that, the call 'works' in the sense that calling it again after a connection is established returns a new file descriptor. >>> On what kind of file descriptor descriping what kind of socket are you >>> calling accept()? So far I'm not aware of any RTDM driver providing the >>> corresponding service - well, at least not a public one (our RT-TCP >>> stack is yet to be released). Or is it intended to pass the call to >>> plain Linux, switching the caller into secondary more? >>> >> There's a sample attached. Yes, it is a TCP stream. Howeve accept is >> wrapped, so it may happen that EPERM is the result of the wrapping. >> >> > > Oops, missed that. Indeed, patch below should fix it. > > Jan > > diff --git a/src/skins/posix/rtdm.c b/src/skins/posix/rtdm.c > index 6e347fb..4e6685f 100644 > --- a/src/skins/posix/rtdm.c > +++ b/src/skins/posix/rtdm.c > @@ -404,18 +404,21 @@ int __wrap_accept(int fd, struct sockaddr *addr, > socklen_t * addrlen) > > pthread_setcanceltype(oldtype, NULL); > > - if (fd >= 0) > - fd += __rtdm_fd_start; > + if (fd < 0) > + return set_errno(fd); > + > + return fd + __rtdm_fd_start; > } else { > fd = __real_accept(fd, addr, addrlen); > > if (fd >= __rtdm_fd_start) { > __real_close(fd); > - fd = -EMFILE; > + errno = EMFILE; > + fd = -1; > } > - } > > - return set_errno(fd); > + return fd; > + } > } > > int __wrap_getsockname(int fd, struct sockaddr *name, socklen_t * namelen) > > Thank you very much for this quick correction, without much knowledge of xenomai I was afraid the fix would be much more complicated. Best regards, Matthieu ___ Xenomai-core mailing list Xenomai-core@gna.org https://mail.gna.org/listinfo/xenomai-core
Re: [Xenomai-core] [bug] accept() in non-blocking mode fails with EPERM instead of EAGAIN
Gilles Chanteperdrix wrote: > Jan Kiszka wrote: >> Matthieu Nottale wrote: >>> Hi, >>> >>> I believe I found a bug in the Xenomai Posix skin while trying to use >>> boost::asio: The accept() call in asychronous mode >>> fails with ENOPEM instead of EAGAIN. Other than that, the call 'works' >>> in the sense that calling it again after a connection is established >>> returns a new file descriptor. >> On what kind of file descriptor descriping what kind of socket are you >> calling accept()? So far I'm not aware of any RTDM driver providing the >> corresponding service - well, at least not a public one (our RT-TCP >> stack is yet to be released). Or is it intended to pass the call to >> plain Linux, switching the caller into secondary more? > > There's a sample attached. Yes, it is a TCP stream. Howeve accept is > wrapped, so it may happen that EPERM is the result of the wrapping. > Oops, missed that. Indeed, patch below should fix it. Jan diff --git a/src/skins/posix/rtdm.c b/src/skins/posix/rtdm.c index 6e347fb..4e6685f 100644 --- a/src/skins/posix/rtdm.c +++ b/src/skins/posix/rtdm.c @@ -404,18 +404,21 @@ int __wrap_accept(int fd, struct sockaddr *addr, socklen_t * addrlen) pthread_setcanceltype(oldtype, NULL); - if (fd >= 0) - fd += __rtdm_fd_start; + if (fd < 0) + return set_errno(fd); + + return fd + __rtdm_fd_start; } else { fd = __real_accept(fd, addr, addrlen); if (fd >= __rtdm_fd_start) { __real_close(fd); - fd = -EMFILE; + errno = EMFILE; + fd = -1; } - } - return set_errno(fd); + return fd; + } } int __wrap_getsockname(int fd, struct sockaddr *name, socklen_t * namelen) signature.asc Description: OpenPGP digital signature ___ Xenomai-core mailing list Xenomai-core@gna.org https://mail.gna.org/listinfo/xenomai-core
Re: [Xenomai-core] [bug] accept() in non-blocking mode fails with EPERM instead of EAGAIN
Jan Kiszka wrote: > Matthieu Nottale wrote: >> Hi, >> >> I believe I found a bug in the Xenomai Posix skin while trying to use >> boost::asio: The accept() call in asychronous mode >> fails with ENOPEM instead of EAGAIN. Other than that, the call 'works' >> in the sense that calling it again after a connection is established >> returns a new file descriptor. > > On what kind of file descriptor descriping what kind of socket are you > calling accept()? So far I'm not aware of any RTDM driver providing the > corresponding service - well, at least not a public one (our RT-TCP > stack is yet to be released). Or is it intended to pass the call to > plain Linux, switching the caller into secondary more? There's a sample attached. Yes, it is a TCP stream. Howeve accept is wrapped, so it may happen that EPERM is the result of the wrapping. -- Gilles. ___ Xenomai-core mailing list Xenomai-core@gna.org https://mail.gna.org/listinfo/xenomai-core
Re: [Xenomai-core] [bug] accept() in non-blocking mode fails with EPERM instead of EAGAIN
Matthieu Nottale wrote: > Hi, > > I believe I found a bug in the Xenomai Posix skin while trying to use > boost::asio: The accept() call in asychronous mode > fails with ENOPEM instead of EAGAIN. Other than that, the call 'works' > in the sense that calling it again after a connection is established > returns a new file descriptor. On what kind of file descriptor descriping what kind of socket are you calling accept()? So far I'm not aware of any RTDM driver providing the corresponding service - well, at least not a public one (our RT-TCP stack is yet to be released). Or is it intended to pass the call to plain Linux, switching the caller into secondary more? Jan > > I'm running xenomai rev 50ee47db78117e8711d4d2f5310dff262a425eb7 with > kernel 2.6.31 i686. > > Xenomai is built with no option (other than --enable-shared > --disable-static) to configure. > > I'm joining a simple C file to reproduce the problem. > > Its output when built 'natively', and running "nc localhost 12345" after > some time is: > > -1 11 > accept: Resource temporarily unavailable > -1 11 > accept: Resource temporarily unavailable > <...> > OK 4 > > Its output when built using the posix skin and run as root is: > -1 1 > accept: Operation not permitted > -1 1 > accept: Operation not permitted > <...> > OK 4 > > The consequence of this bug is that all applications doing asynchronous > accept() calls will fail to work, as they will incorrectly believe the > operation failed. > > > Regards, > >Matthieu > > > > > ___ > Xenomai-core mailing list > Xenomai-core@gna.org > https://mail.gna.org/listinfo/xenomai-core signature.asc Description: OpenPGP digital signature ___ Xenomai-core mailing list Xenomai-core@gna.org https://mail.gna.org/listinfo/xenomai-core
[Xenomai-core] [bug] accept() in non-blocking mode fails with EPERM instead of EAGAIN
Hi, I believe I found a bug in the Xenomai Posix skin while trying to use boost::asio: The accept() call in asychronous mode fails with ENOPEM instead of EAGAIN. Other than that, the call 'works' in the sense that calling it again after a connection is established returns a new file descriptor. I'm running xenomai rev 50ee47db78117e8711d4d2f5310dff262a425eb7 with kernel 2.6.31 i686. Xenomai is built with no option (other than --enable-shared --disable-static) to configure. I'm joining a simple C file to reproduce the problem. Its output when built 'natively', and running "nc localhost 12345" after some time is: -1 11 accept: Resource temporarily unavailable -1 11 accept: Resource temporarily unavailable <...> OK 4 Its output when built using the posix skin and run as root is: -1 1 accept: Operation not permitted -1 1 accept: Operation not permitted <...> OK 4 The consequence of this bug is that all applications doing asynchronous accept() calls will fail to work, as they will incorrectly believe the operation failed. Regards, Matthieu #include /* See NOTES */ #include #include #include #include #include #include #include #include #include int main() { int s = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); int t = 1; int res; struct sockaddr_in sa; mlockall(MCL_PRESENT | MCL_FUTURE); if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &t, sizeof(int))) perror("setsockopt"); memset(&sa, 0, sizeof (sa)); sa.sin_family = AF_INET; sa.sin_port = htons(12345); sa.sin_addr.s_addr = INADDR_ANY; if (bind(s, (struct sockaddr *)&sa, sizeof(sa))) perror("bind"); if (listen(s, 128)) perror("listen"); t = 1; if (ioctl(s, FIONBIO, &t)) perror("ioctl"); do { res = accept(s, 0, 0); printf("%d %d\n", (int)res, (int)errno); perror("accept"); usleep(50); } while(res==-1); printf("OK %d\n", (int)res); return 0; } config-2.6.31-xenomai.gz Description: GNU Zip compressed data ___ Xenomai-core mailing list Xenomai-core@gna.org https://mail.gna.org/listinfo/xenomai-core