[exim-cvs] Unix socket creds: FreeBSD needs level 0 not SOL_…

Startseite
Nachricht löschen
Nachricht beantworten
Autor: Exim Git Commits Mailing List
Datum:  
To: exim-cvs
Betreff: [exim-cvs] Unix socket creds: FreeBSD needs level 0 not SOL_SOCKET
Gitweb: https://git.exim.org/exim.git/commitdiff/4a9f055ce3784e44452eff96d0abad1fbb82f03e
Commit:     4a9f055ce3784e44452eff96d0abad1fbb82f03e
Parent:     3978c243a079d5ed6201a2743a36ea0c966ca4e0
Author:     Jeremy Harris <jgh146exb@???>
AuthorDate: Sat Feb 22 17:11:05 2020 +0000
Committer:  Jeremy Harris <jgh146exb@???>
CommitDate: Sat Feb 22 17:11:05 2020 +0000


    Unix socket creds: FreeBSD needs level 0 not SOL_SOCKET
---
 src/src/daemon.c | 26 ++++++++++++++------------
 1 file changed, 14 insertions(+), 12 deletions(-)


diff --git a/src/src/daemon.c b/src/src/daemon.c
index 12e3413..f39ab01 100644
--- a/src/src/daemon.c
+++ b/src/src/daemon.c
@@ -1000,13 +1000,12 @@ int len;

DEBUG(D_any) debug_printf("creating notifier socket ");

-where = US"socket";
#ifdef SOCK_CLOEXEC
if ((fd = socket(PF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC, 0)) < 0)
- goto bad;
+ { where = US"socket"; goto bad; }
#else
-if ((fd = socket(AF_UNIX, SOCK_DGRAM, 0)) < 0)
- goto bad;
+if ((fd = socket(PF_UNIX, SOCK_DGRAM, 0)) < 0)
+ { where = US"socket"; goto bad; }
(void)fcntl(fd, F_SETFD, fcntl(fd, F_GETFD) | FD_CLOEXEC);
#endif

@@ -1022,27 +1021,30 @@ len = offsetof(struct sockaddr_un, sun_path)
DEBUG(D_any) debug_printf("%s\n", sa_un.sun_path);
#endif

-where = US"bind";
if (bind(fd, (const struct sockaddr *)&sa_un, len) < 0)
- goto bad;
+ { where = US"bind"; goto bad; }

 #ifdef SO_PASSCRED        /* Linux */
-where = US"SO_PASSCRED";
 if (setsockopt(fd, SOL_SOCKET, SO_PASSCRED, &on, sizeof(on)) < 0)
-  goto bad;
+  { where = US"SO_PASSCRED"; goto bad2; }
 #elif defined(LOCAL_CREDS)    /* FreeBSD-ish */
-where = US"LOCAL_CREDS";
-if (setsockopt(fd, SOL_SOCKET, LOCAL_CREDS, &on, sizeof(on)) < 0)
-  goto bad;
+if (setsockopt(fd, 0, LOCAL_CREDS, &on, sizeof(on)) < 0)
+  { where = US"LOCAL_CREDS"; goto bad2; }
 #endif


/* debug_printf("%s: fd %d\n", __FUNCTION__, fd); */
daemon_notifier_fd = fd;
return;

+bad2:
+#ifndef EXIM_HAVE_ABSTRACT_UNIX_SOCKETS
+  Uunlink(sa_un.sun_path);
+#endif
 bad:
-  log_write(0, LOG_MAIN|LOG_PANIC, "%s: %s: %s",
+  log_write(0, LOG_MAIN|LOG_PANIC, "%s %s: %s",
     __FUNCTION__, where, strerror(errno));
+  close(fd);
+  return;
 }