diff --git a/lib/isc/unix/socket.c b/lib/isc/unix/socket.c index ff1f147871d9c7af4886561ba20d5bb950e7e714..3972c4dd86823c306f28f1d0b26e68687d80b9d9 100644 --- a/lib/isc/unix/socket.c +++ b/lib/isc/unix/socket.c @@ -4242,22 +4242,33 @@ isc_socket_cleanunix(const isc_sockaddr_t *sockaddr, bool active) { #define S_ISSOCK(mode) 0 #endif /* ifndef S_ISSOCK */ - if (active) { - if (stat(sockaddr->type.sunix.sun_path, &sb) < 0) { + if (stat(sockaddr->type.sunix.sun_path, &sb) < 0) { + switch (errno) { + case ENOENT: + if (active) /* We exited cleanly last time */ + break; + /* intentional falltrough */ + default: strerror_r(errno, strbuf, sizeof(strbuf)); isc_log_write(isc_lctx, ISC_LOGCATEGORY_GENERAL, - ISC_LOGMODULE_SOCKET, ISC_LOG_ERROR, + ISC_LOGMODULE_SOCKET, + active ? ISC_LOG_ERROR : ISC_LOG_WARNING, "isc_socket_cleanunix: stat(%s): %s", sockaddr->type.sunix.sun_path, strbuf); return; } + } else { if (!(S_ISSOCK(sb.st_mode) || S_ISFIFO(sb.st_mode))) { isc_log_write(isc_lctx, ISC_LOGCATEGORY_GENERAL, - ISC_LOGMODULE_SOCKET, ISC_LOG_ERROR, + ISC_LOGMODULE_SOCKET, + active ? ISC_LOG_ERROR : ISC_LOG_WARNING, "isc_socket_cleanunix: %s: not a socket", sockaddr->type.sunix.sun_path); return; } + } + + if (active) { if (unlink(sockaddr->type.sunix.sun_path) < 0) { strerror_r(errno, strbuf, sizeof(strbuf)); isc_log_write(isc_lctx, ISC_LOGCATEGORY_GENERAL, @@ -4278,29 +4289,6 @@ isc_socket_cleanunix(const isc_sockaddr_t *sockaddr, bool active) { return; } - if (stat(sockaddr->type.sunix.sun_path, &sb) < 0) { - switch (errno) { - case ENOENT: /* We exited cleanly last time */ - break; - default: - strerror_r(errno, strbuf, sizeof(strbuf)); - isc_log_write(isc_lctx, ISC_LOGCATEGORY_GENERAL, - ISC_LOGMODULE_SOCKET, ISC_LOG_WARNING, - "isc_socket_cleanunix: stat(%s): %s", - sockaddr->type.sunix.sun_path, strbuf); - break; - } - goto cleanup; - } - - if (!(S_ISSOCK(sb.st_mode) || S_ISFIFO(sb.st_mode))) { - isc_log_write(isc_lctx, ISC_LOGCATEGORY_GENERAL, - ISC_LOGMODULE_SOCKET, ISC_LOG_WARNING, - "isc_socket_cleanunix: %s: not a socket", - sockaddr->type.sunix.sun_path); - goto cleanup; - } - if (connect(s, (const struct sockaddr *)&sockaddr->type.sunix, sizeof(sockaddr->type.sunix)) < 0) { @@ -4326,7 +4314,6 @@ isc_socket_cleanunix(const isc_sockaddr_t *sockaddr, bool active) { break; } } -cleanup: close(s); #else /* ifndef _WIN32 */ UNUSED(sockaddr);