mailing list of musl libc
 help / color / mirror / code / Atom feed
* nfs-utils broken with musl: "select: Bad file descriptor"
@ 2015-08-18  2:30 Tastky
  2015-08-18  3:00 ` Rich Felker
  0 siblings, 1 reply; 11+ messages in thread
From: Tastky @ 2015-08-18  2:30 UTC (permalink / raw)
  To: musl

As by this OpenWRT bugreport:
https://dev.openwrt.org/ticket/20038

On various architectures – at least a mips and powerpc one – nfs-utils 
is broken with musl, yielding a never ending stream of "my_svc_run() - 
select: Bad file descriptor" in the system log.

The message originates in the this file:
http://git.linux-nfs.org/?p=steved/nfs-utils.git;a=blob;f=utils/statd/svc_run.c

"Downgrading" to uClibc has the issue vanish.

I verified this myself with recent git versions of both musl and the 
utils on a fresh ar71xx OpenWRT compilation.


^ permalink raw reply	[flat|nested] 11+ messages in thread
* Re: nfs-utils broken with musl: "select: Bad file descriptor"
@ 2015-08-19  1:05 Chuck Lever
  0 siblings, 0 replies; 11+ messages in thread
From: Chuck Lever @ 2015-08-19  1:05 UTC (permalink / raw)
  To: musl

>> i think this call goes wrong:
>> 
>> 
> http://git.linux-nfs.org/?p=steved/nfs-utils.git;a=blob;f=utils/statd/rmtcall.c;hb=HEAD#l56
> 
>> 
>> it loops for 100 iterations and if all ports are used
>> according to getservbyport then it FD_SET(sockfd, &SVC_FDSET);
>> with some random high sockfd (eg. 105) that is closed.
>> 
>> ...so should getservbyport fail there?
>> 
>> (according to strace it tries ports 883 to 982)
> 
> I think the application's expectation is that it fail rather than
> returning a decimal-string-only service entity. However it looks like
> the code is written to handle the case where all 100 iterations fail
> to get an anonymous port. The problem seems to be that, when the loop
> stops due to hitting the iteration count rather than exiting with
> break, i has already been incremented past the last tmp_socket slot,
> so the close loop closes the fd that they actually want to use, later
> causing EBADF. This is purely an application bug, but it happens not
> to get noticed if getservbyport fails anywhere along the way, which
> they expect to happen in the usual case.

statd_get_socket() is hunting for a privileged source port that
is not just unused at the moment, but that is also not going to be
used by some other well-known service. This is a long-lived socket
that statd uses to communicate with the kernel. It must use a
privileged port.

if getservbyport(3) is returning something for every port that
is tried, then statd_get_socket() will fail to find a usable
port.

If it's returning 105, that suggests it has run out of retries.
It should return -1 in this case. That is a logic bug.

But is it true that every port returned by bindresvport(3) is
actually defined in /etc/services? Surely there is one open
port that can be used. What port does bindresvport(3) start
with?

--
Chuck Lever





^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2015-08-19  9:34 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-08-18  2:30 nfs-utils broken with musl: "select: Bad file descriptor" Tastky
2015-08-18  3:00 ` Rich Felker
2015-08-18 16:50   ` Tastky
2015-08-18 17:49     ` Rich Felker
2015-08-18 18:07       ` Tastky
2015-08-18 18:08         ` Tastky
2015-08-18 18:20       ` Felix Janda
2015-08-18 19:18         ` Szabolcs Nagy
2015-08-18 20:51           ` Rich Felker
2015-08-19  9:34           ` Natanael Copa
2015-08-19  1:05 Chuck Lever

Code repositories for project(s) associated with this public inbox

	https://git.vuxu.org/mirror/musl/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).