From patchwork Mon Dec 17 22:46:29 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: 10734403 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 49ED71850 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 3D4A229B81 for ; Mon, 17 Dec 2018 22:46:51 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 31E1529FA9; 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 67C6329C69 for ; Mon, 17 Dec 2018 22:46:50 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1732023AbeLQWqu (ORCPT ); Mon, 17 Dec 2018 17:46:50 -0500 Received: from mx2.suse.de ([195.135.220.15]:60906 "EHLO mx1.suse.de" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1732095AbeLQWqt (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 41254B043; Mon, 17 Dec 2018 22:46:48 +0000 (UTC) From: Michal Suchanek To: linux-modules@vger.kernel.org Cc: Lucas De Marchi , Jean Delvare , Michal Suchanek Subject: [PATCH v3 3/3] depmod: shut up gcc insufficinet buffer warning. Date: Mon, 17 Dec 2018 23:46:29 +0100 Message-Id: <20181217224629.22687-4-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 In a couple of places depmod concatenates the module directory and filename with snprintf. This can technically overflow creating wrong path if module directory name is long. Use openat instead as is done elsewhere in depmod. This avoids the snprintf, the extra buffer on stack, and the gcc warning. Signed-off-by: Michal Suchanek --- v3: - remove superfluous whitespace --- tools/depmod.c | 51 ++++++++++++++++++++++++++++++++++---------------- 1 file changed, 35 insertions(+), 16 deletions(-) diff --git a/tools/depmod.c b/tools/depmod.c index 0f7e33ccfd59..0cf845a0dbc7 100644 --- a/tools/depmod.c +++ b/tools/depmod.c @@ -1389,19 +1389,42 @@ static int depmod_modules_build_array(struct depmod *depmod) return 0; } +static FILE *dfdopen(const char *dname, const char *filename, int flags, const char *mode) +{ + int fd, dfd; + FILE *ret; + + dfd = open(dname, O_RDONLY); + if (dfd < 0) { + WRN("could not open directory %s: %m\n", dname); + return NULL; + } + + fd = openat(dfd, filename, flags); + if (fd < 0) { + WRN("could not open %s at %s: %m\n", filename, dname); + ret = NULL; + } else { + ret = fdopen(fd, mode); + if (!ret) + WRN("could not associate stream with %s: %m\n", filename); + } + close(dfd); + return ret; +} + + + static void depmod_modules_sort(struct depmod *depmod) { - char order_file[PATH_MAX], line[PATH_MAX]; + char line[PATH_MAX]; + const char * order_file = "modules.order"; FILE *fp; unsigned idx = 0, total = 0; - snprintf(order_file, sizeof(order_file), "%s/modules.order", - depmod->cfg->dirname); - fp = fopen(order_file, "r"); - if (fp == NULL) { - WRN("could not open %s: %m\n", order_file); + fp = dfdopen(depmod->cfg->dirname, order_file, O_RDONLY, "r"); + if (fp == NULL) return; - } while (fgets(line, sizeof(line), fp) != NULL) { size_t len = strlen(line); @@ -1409,8 +1432,8 @@ static void depmod_modules_sort(struct depmod *depmod) if (len == 0) continue; if (line[len - 1] != '\n') { - ERR("%s:%u corrupted line misses '\\n'\n", - order_file, idx); + ERR("%s/%s:%u corrupted line misses '\\n'\n", + depmod->cfg->dirname, order_file, idx); goto corrupted; } } @@ -2287,18 +2310,14 @@ static int output_builtin_bin(struct depmod *depmod, FILE *out) { FILE *in; struct index_node *idx; - char infile[PATH_MAX], line[PATH_MAX], modname[PATH_MAX]; + char line[PATH_MAX], modname[PATH_MAX]; if (out == stdout) return 0; - snprintf(infile, sizeof(infile), "%s/modules.builtin", - depmod->cfg->dirname); - in = fopen(infile, "r"); - if (in == NULL) { - WRN("could not open %s: %m\n", infile); + in = dfdopen(depmod->cfg->dirname, "modules.builtin", O_RDONLY, "r"); + if (in == NULL) return 0; - } idx = index_create(); if (idx == NULL) {