From patchwork Mon Dec 17 22:46:28 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Michal_Such=C3=A1nek?= X-Patchwork-Id: 10734401 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 35AE113B5 for ; Mon, 17 Dec 2018 22:46:51 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 2A35929B81 for ; Mon, 17 Dec 2018 22:46:51 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 1E63C29BF5; Mon, 17 Dec 2018 22:46:51 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.9 required=2.0 tests=BAYES_00,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 035B129F04 for ; Mon, 17 Dec 2018 22:46:50 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728131AbeLQWqt (ORCPT ); Mon, 17 Dec 2018 17:46:49 -0500 Received: from mx2.suse.de ([195.135.220.15]:60898 "EHLO mx1.suse.de" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1732023AbeLQWqt (ORCPT ); Mon, 17 Dec 2018 17:46:49 -0500 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay1.suse.de (unknown [195.135.220.254]) by mx1.suse.de (Postfix) with ESMTP id F20EEB041; Mon, 17 Dec 2018 22:46:47 +0000 (UTC) From: Michal Suchanek To: linux-modules@vger.kernel.org Cc: Lucas De Marchi , Jean Delvare , Michal Suchanek Subject: [PATCH v3 2/3] depmod: prevent module dependency files corruption due to parallel invocation. Date: Mon, 17 Dec 2018 23:46:28 +0100 Message-Id: <20181217224629.22687-3-msuchanek@suse.de> X-Mailer: git-send-email 2.19.2 In-Reply-To: <20181217224629.22687-1-msuchanek@suse.de> References: <20181207154557.5865-1-msuchanek@suse.de> <20181217224629.22687-1-msuchanek@suse.de> MIME-Version: 1.0 Sender: owner-linux-modules@vger.kernel.org Precedence: bulk List-ID: X-Virus-Scanned: ClamAV using ClamSMTP Depmod does not use unique filename for temporary files. There is no guarantee the user does not attempt to run mutiple depmod processes in parallel. If that happens a temporary file might be created by depmod(1st), truncated by depmod(2nd), and renamed to final name by depmod(1st) resulting in corrupted file seen by user. Due to missing mkstempat() this is more complex than it should be. Adding PID and timestamp to the filename should be reasonably reliable. Adding O_EXCL as mkstemp does fails creating the file rather than corrupting existing file. Signed-off-by: Michal Suchanek --- v3: - remove superfluous code to terminate the string - snprintf should do it - remove superfluous O_TRUNC - not needed with O_EXCL --- tools/depmod.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/tools/depmod.c b/tools/depmod.c index 18c0d61b2db3..0f7e33ccfd59 100644 --- a/tools/depmod.c +++ b/tools/depmod.c @@ -29,6 +29,7 @@ #include #include #include +#include #include #include @@ -2398,6 +2399,9 @@ static int depmod_output(struct depmod *depmod, FILE *out) }; const char *dname = depmod->cfg->dirname; int dfd, err = 0; + struct timeval tv; + + gettimeofday(&tv, NULL); if (out != NULL) dfd = -1; @@ -2416,11 +2420,12 @@ static int depmod_output(struct depmod *depmod, FILE *out) int r, ferr; if (fp == NULL) { - int flags = O_CREAT | O_TRUNC | O_WRONLY; + int flags = O_CREAT | O_EXCL | O_WRONLY; int mode = 0644; int fd; - snprintf(tmp, sizeof(tmp), "%s.tmp", itr->name); + snprintf(tmp, sizeof(tmp), "%s.%i.%li.%li", itr->name, getpid(), + tv.tv_usec, tv.tv_sec); fd = openat(dfd, tmp, flags, mode); if (fd < 0) { ERR("openat(%s, %s, %o, %o): %m\n",