diff options
| author | Garrett D'Amore <garrett@damore.org> | 2018-07-05 11:29:00 -0700 |
|---|---|---|
| committer | Garrett D'Amore <garrett@damore.org> | 2018-07-05 11:53:34 -0700 |
| commit | d2fc63fe726e5d708c2dc90a945ee4094658bbc6 (patch) | |
| tree | ebb81405e8d552193cc4e51f8226c4883940908c /src/platform | |
| parent | 68d117eb856b42e57cc3e912496d84d7bd8002fd (diff) | |
| download | nng-d2fc63fe726e5d708c2dc90a945ee4094658bbc6.tar.gz nng-d2fc63fe726e5d708c2dc90a945ee4094658bbc6.tar.bz2 nng-d2fc63fe726e5d708c2dc90a945ee4094658bbc6.zip | |
fixes #576 IPC listen unlinks UNIX socket on failure
Diffstat (limited to 'src/platform')
| -rw-r--r-- | src/platform/posix/posix_epdesc.c | 23 |
1 files changed, 13 insertions, 10 deletions
diff --git a/src/platform/posix/posix_epdesc.c b/src/platform/posix/posix_epdesc.c index 69026051..74c92dbd 100644 --- a/src/platform/posix/posix_epdesc.c +++ b/src/platform/posix/posix_epdesc.c @@ -44,6 +44,7 @@ struct nni_posix_epdesc { nni_list acceptq; bool closed; bool started; + bool ipcbound; // if true unlink socket on exit struct sockaddr_storage locaddr; struct sockaddr_storage remaddr; socklen_t loclen; @@ -176,8 +177,7 @@ nni_epdesc_doclose(nni_posix_epdesc *ed) } // clean up stale UNIX socket when closing the server. - if ((ed->mode == NNI_EP_MODE_LISTEN) && (ed->loclen != 0) && - (ed->locaddr.ss_family == AF_UNIX)) { + if (ed->ipcbound) { struct sockaddr_un *sun = (void *) &ed->locaddr; (void) unlink(sun->sun_path); } @@ -271,14 +271,17 @@ nni_posix_epdesc_listen(nni_posix_epdesc *ed) // it is done *before* the listen() operation, whereas fchmod seems to // have no impact. This behavior was observed on both macOS and Linux. // YMMV on other platforms. - if ((ss->ss_family == AF_UNIX) && (ed->perms != 0)) { - struct sockaddr_un *sun = (void *) ss; - mode_t perms = ed->perms & ~(S_IFMT); - if ((rv = chmod(sun->sun_path, perms)) != 0) { - rv = nni_plat_errno(errno); - nni_mtx_unlock(&ed->mtx); - nni_posix_pfd_fini(pfd); - return (rv); + if (ss->ss_family == AF_UNIX) { + ed->ipcbound = true; + if (ed->perms != 0) { + struct sockaddr_un *sun = (void *) ss; + mode_t perms = ed->perms & ~(S_IFMT); + if ((rv = chmod(sun->sun_path, perms)) != 0) { + rv = nni_plat_errno(errno); + nni_mtx_unlock(&ed->mtx); + nni_posix_pfd_fini(pfd); + return (rv); + } } } |
