Received: by 2002:a25:ab43:0:0:0:0:0 with SMTP id u61csp4286524ybi; Mon, 3 Jun 2019 08:27:42 -0700 (PDT) X-Google-Smtp-Source: APXvYqww/ZGlDmWR//XJglnEYooDMWRSMO7aclr7PNCiW000G2bohV6fsApt9zW79PEKqxe4Y8rf X-Received: by 2002:a63:788a:: with SMTP id t132mr29666203pgc.52.1559575662421; Mon, 03 Jun 2019 08:27:42 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1559575662; cv=none; d=google.com; s=arc-20160816; b=BYAgDPkczzSzCVu9qncPiVovOnk9FmzeA7yyup8hKoSVuFvm1K1czx1aP+e5mPho0C m65T7g5X+THDxkWRxnT8CZzcKqiB8y7+o46Ew2SntD0ZP+WOlBAA9tx4LDSlhCcKHvZe bexZNPqCUBWNd0R1Nbjb/VEZ827XAXjKao0lr1SVU2fLXES61nNh3aQYwHeuGuLTRJ0/ dFyAQ7s3Eta+dY2tfBxiDY9x+QEUbNrbbeBq+MFuCa1SMQyC4bTX7BZypDU7ZS084kAA TX0b5n/ieRTj3lrZzYP1crKbBOz3fme4YkF4DsWgL0o29Dy2o5ev4Nw037XUYAGOxpGp lheA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:to:subject:message-id:date:from :mime-version:dkim-signature; bh=Zseq1GZeTqMaMENYkGCy4nd4edGfJrBEbxocT6fFXUI=; b=AMXkmxQHde5yD4J9WINlZIWMaKYuvi6Fe6yysnMdXc8xstse3hf+aBhbK2CB8QfjaE o6YKuv58woWxXNuR2uDtEKr47iFesc4aDv0RIo/BluFOoqT44w8pNmAGtJ7lBujmj/9V tL31Zv93cI6FH1O/bD08PV2EGps0RErN3+SV41/aihGExZqi2e7nTiL/cKpVbNVIZ4pa aEN70q9a+mva46D5C7lDKQVe6OeZPh4VVWKqPFq4tvRGIRq0KstXFR+qe2p4geQi6sKi QDzp5AS+0FjILHBeIKguQFYq+Y87rm+mxd/DR8LVa32LZdvUshTWRnWeVboof4qEiPtt Q0dg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=U5d1tm81; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id c19si19961874pfn.0.2019.06.03.08.27.25; Mon, 03 Jun 2019 08:27:42 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=U5d1tm81; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727237AbfFCPYr (ORCPT + 99 others); Mon, 3 Jun 2019 11:24:47 -0400 Received: from mail-vs1-f50.google.com ([209.85.217.50]:41477 "EHLO mail-vs1-f50.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726343AbfFCPYq (ORCPT ); Mon, 3 Jun 2019 11:24:46 -0400 Received: by mail-vs1-f50.google.com with SMTP id g24so9432295vso.8 for ; Mon, 03 Jun 2019 08:24:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:from:date:message-id:subject:to; bh=Zseq1GZeTqMaMENYkGCy4nd4edGfJrBEbxocT6fFXUI=; b=U5d1tm81DWwwhYT2aOwrSvimQ7FC2F1idrQyh3secSIYdt/faQPXZc6i7ibf9FtI1g ErDCRIGxNcf6MdfCNk35vinF5q8B5d4gi7hdhXoVNt4IaPUsnFbU19Rkw3Aa0bdTOoqM cYzJvrpF/eAgzzFhs6mNF0F8V+Zytk6tjIPPW7Ns0KyxwEYNO5qKYRThH7APIiHf3dai S2rnxJpiueDD1BiNC8XtBNpKRVX319qq1dFZZjK0WMXZ2CRtDzvhAGvY20BkhIXofTuE bVi/6QmsLKR5bCuBQOfEHjx0O0cYz5O4xC42moamd418S9Rpd9hBc2N99Wj9geU3DgEo VXJg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:from:date:message-id:subject:to; bh=Zseq1GZeTqMaMENYkGCy4nd4edGfJrBEbxocT6fFXUI=; b=btyYmPRpRAUh7YQ7gmNDkUz/r7BVL4bA5nk1GXdw+dGfdlNzfmvRW8/It3os7Luqy5 Kx9w/AQikuDbQJOkWEtAdvBiSf+1qSIH3kefE0WpXAJhfup4JRupOpF5V7D02bVvnm9S ho/dVI9EePMcwLhhx/tn2NgkiGK6YPO1mwfbPvapeOrqCzPOO442KmDdQ1N/zw0C5gWR iGI/fmyXZ3XitLLUFqrlbHREROXi6Eo0kWpN2m0IL4jBrjnNOZL86Lkv5cES8fjSd3Ur ZBPaAG+x5C9rjsOVFGtn7CCscwXdEIpaugjqeow7XOJquWOU9FQU4Zh40QgvTDI9clAk 1HPw== X-Gm-Message-State: APjAAAVf/ibk62f0nL/MqEzDop1WKVsfhPwWQ+87/k9ma6bu10veTK3z UF7I7/eO95Luo8vn8kbGCzqK2YDRl/BGR+hbXKgaAg== X-Received: by 2002:a67:f3c5:: with SMTP id j5mr12977698vsn.232.1559575485636; Mon, 03 Jun 2019 08:24:45 -0700 (PDT) MIME-Version: 1.0 Received: by 2002:a67:efd3:0:0:0:0:0 with HTTP; Mon, 3 Jun 2019 08:24:44 -0700 (PDT) From: Joshua Hudson Date: Mon, 3 Jun 2019 08:24:44 -0700 Message-ID: Subject: O_CLOFORK use case To: linux-kernel Content-Type: text/plain; charset="UTF-8" Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org I ran headlong into the use case for O_CLOFORK and got into a locking debate over it. The actual use case involves squashing a thread race between two threads. If a file is opened for write in one thread with O_CLOEXEC while another thread calls fork(), a race condition can happen where the thread that closes the handle misses the out of disk error because the child process closed the handle last inside execve(). The decades old idiom for replacing config files isn't safe in multi-threaded code. Yipe. int h = open(".configfile~", O_WRONY | O_EXCL | O_CLOEXEC, 0666); if (h < 0) { perror(".configfile"); return 1; } ssize_t delta = 0; while ((delta = write(h, newconfigdata, newconfiglen)) > 0) { newconfigdata += delta; newconfiglen -= delta; } if (delta < 0) { perror(".configfile"); return 1; } if (close(h)) { perror(".configfile"); return 1; } rename(".configfile~", ".configfile"); To fix it, we have to put locks around close() and fork()/vfork(). Ugh.