From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: X-Spam-Status: No, score=-4.1 required=3.0 tests=ALL_TRUSTED,AWL,BAYES_00, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF shortcircuit=no autolearn=ham autolearn_force=no version=3.4.2 Received: from localhost (dcvr.yhbt.net [127.0.0.1]) by dcvr.yhbt.net (Postfix) with ESMTP id C4CF51FAFD for ; Thu, 15 Dec 2022 20:52:58 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=80x24.org; s=selector1; t=1671137578; bh=ckraaUXi6H0Gv8heOvIM2vjN5gFJrLBv8z3nT3oQKWM=; h=From:To:Subject:Date:In-Reply-To:References:From; b=eaTRaPaP13E17Zr7HIOiiYHsJib1hmbUT/BlsMsAWOnLfWeF5suU7U4N3XMOZThRh XnI1+Gg9JVUAd2u2O6FhnPWEfRVbwEizUH6U4TjCHc29NLlu9MTM8rvwLAazwiOOih aAxmzWDKbCofVkGNRpQzLBafaUoyd0RJCoxQMp+E= From: Eric Wong To: mwrap-perl@80x24.org Subject: [PATCH 14/19] mwrap_httpd: do not abort on fork if out-of-resources Date: Thu, 15 Dec 2022 20:52:50 +0000 Message-Id: <20221215205255.27840-15-e@80x24.org> In-Reply-To: <20221215205255.27840-1-e@80x24.org> References: <20221215205255.27840-1-e@80x24.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit List-Id: Instead, we'll leak memory if the pthread_atfork handlers can't stop httpd at fork due to resource limitations. --- mwrap_httpd.h | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/mwrap_httpd.h b/mwrap_httpd.h index f484bdd..fc096c0 100644 --- a/mwrap_httpd.h +++ b/mwrap_httpd.h @@ -1094,6 +1094,12 @@ static int h1d_init(struct mw_h1d *h1d, const char *menv) memcpy(h1d->pid_str, p, h1d->pid_len); if (unlink(sa.un.sun_path) < 0 && errno != ENOENT) return fprintf(stderr, "unlink(%s): %m\n", sa.un.sun_path); + /* + * lfd may be >=0 if h1d_stop_join failed in parent and we're now + * running in a forked child + */ + if (h1d->lfd >= 0) + (void)close(h1d->lfd); h1d->lfd = socket(AF_UNIX, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0); if (h1d->lfd < 0) return fprintf(stderr, "socket: %m\n"); @@ -1204,25 +1210,28 @@ static void h1d_stop_join(struct mw_h1d *h1d) socklen_t len = (socklen_t)sizeof(sa); int e, sfd; void *ret; +#define ERR ": %m (can't stop mwrap-httpd before fork)\n" mwrap_assert(uatomic_read(&h1d->alive) == 0); if (getsockname(h1d->lfd, &sa.any, &len) < 0) { - fprintf(stderr, "getsockname: %m\n"); - abort(); /* TODO: graceful fallback (ENOBUFS) */ + fprintf(stderr, "getsockname"ERR); + return; } sfd = socket(AF_UNIX, SOCK_STREAM|SOCK_CLOEXEC, 0); if (sfd < 0) { - fprintf(stderr, "socket: %m\n"); - abort(); /* TODO: graceful fallback (ENOMEM, EMFILE, ...) */ + fprintf(stderr, "socket"ERR); + return; } if (connect(sfd, &sa.any, len) < 0) { - fprintf(stderr, "connect: %m\n"); - /* TODO: graceful fallback (EAGAIN, ...) */ + fprintf(stderr, "connect"ERR); + close(sfd); + return; } +#undef ERR (void)close(sfd); e = pthread_join(h1d->tid, &ret); if (e) { - fprintf(stderr, "pthread_join: %s\n", strerror(e)); + fprintf(stderr, "BUG? pthread_join: %s\n", strerror(e)); abort(); } (void)close(h1d->lfd);