raboof/notion

mod_notionflux: fchmod of socket always fails on FreeBSD

jeffpc opened this issue · 2 comments

On FreeBSD, mod_notionflux fails on start (xmessage opens mentioning an invalid argument error) because of an invalid arg related to the listening socket. start_listening tries to fchmod the newly created socket but on FreeBSD this always fails. The manpage for fchmod says:

     [EINVAL]           The fd argument refers to a socket, not to a file.

The following (hacky) patch fixes the issue and mod_notionflux seems to start up fine.

diff --git a/mod_notionflux/mod_notionflux.c b/mod_notionflux/mod_notionflux.c
index 51949e07..e9176c7c 100644
--- a/mod_notionflux/mod_notionflux.c
+++ b/mod_notionflux/mod_notionflux.c
@@ -328,8 +328,10 @@ static bool start_listening()
     if(listenfd<0)
         goto errwarn;
 
+#ifndef __FreeBSD__
     if(fchmod(listenfd, S_IRUSR|S_IWUSR)<0)
         goto errwarn;
+#endif
 
     addr.sun_family=AF_UNIX;
 

While this should be fine from a security standpoint since we're wrapping the socket into a secured temporary directory, it still feels suboptimal until now that it's coming back to me that FreeBSD doesn't support permissions on socket files no matter whether per chmod or fchmod.

This fchmod is weird - it happens right after socket() - so this fd is a completely new socket and isn't associated with a path yet and so it makes perfect sense that the fchmod would fail. Note that the chmod after we bind the socket (a few lines later) succeeds.