Received: by 2002:a05:6a10:9afc:0:0:0:0 with SMTP id t28csp853390pxm; Thu, 3 Mar 2022 05:56:50 -0800 (PST) X-Google-Smtp-Source: ABdhPJxCwN9KtPigZBhxm4dWlAfY8hczEDrkwk4od3S1NdAATojBdQ3JTecAw/RzGEqic3dOwSvm X-Received: by 2002:aa7:c6d7:0:b0:415:a0fc:1dcd with SMTP id b23-20020aa7c6d7000000b00415a0fc1dcdmr10916381eds.266.1646315810618; Thu, 03 Mar 2022 05:56:50 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1646315810; cv=none; d=google.com; s=arc-20160816; b=kTn5ivv4pFZZlbE52MwENfmFIMQKEYcfqx3mT5YVl5M8/gUdpn5QoijsdWabOUgq7p x90FCKXkFC1LN1/TGK88P9x36WEl8Pn3pAT5p2SDzaBtI8f3Eaa4jrKstiULFS9wGSSp NjGNSlBeM4APXmz+QnrEU7X7QP3yhdXIIKDFJ/RAj7F2TAWMpTaFBAQJl9t1/dL/A1UM d900ziVU+KuuF0QWXNPK3bsnApz4DJf+RgU/5/cnqu/C9HMetOikOCqZ69bxjMx/U5dk lLpIo1cTloFxtuH9ejCLN0GMcMmsPYpWP9IrVGs6KwuQJSkvWoPxFxgdOXjpFqTZ0+ni 7SBA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:mime-version:content-transfer-encoding :content-language:accept-language:in-reply-to:references:message-id :date:thread-index:thread-topic:subject:cc:to:from:dkim-filter; bh=PrI+0xcSGgLIXb1qgSf0oktc3tLOVGSXi9MLWXKVl2U=; b=BwNWannigrTcQ0UvgxXGscdEzgz04aFoUDtJ3eE9hpWi8nkbghcwbsWbEZ9VOMLonb eiPHKYtp71mV6x8j9RBExqYkcWOKyE2SlC8F08sTj4CGMXTtTrSIiPwFGnXQwQB5fp2F tALbFrux+TWhhUs4O3TIPyDDrQmdiWbeFJG6hRuTrc0eNn494fb3RvgE2uB0ah3Fz3vJ gIrz+OKhU2reJc0dbjGAdU+kkLHYf7R6TOk1A9P3EFuqTNiD3vVxGoOXovEGgCJ0DYXf WqRF93JJImOD/g+8JdYIY/E+EZQGPM2qKUHtbEoXaCXeaD3lqi0uGZE6luJtrQQGGOcG Syog== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id ds7-20020a170907724700b006da8dcbb830si1775543ejc.218.2022.03.03.05.56.24; Thu, 03 Mar 2022 05:56:50 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233478AbiCCM5h convert rfc822-to-8bit (ORCPT + 99 others); Thu, 3 Mar 2022 07:57:37 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:35622 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229954AbiCCM5f (ORCPT ); Thu, 3 Mar 2022 07:57:35 -0500 Received: from mxout03.lancloud.ru (mxout03.lancloud.ru [45.84.86.113]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id D21CE186218; Thu, 3 Mar 2022 04:56:46 -0800 (PST) Received: from LanCloud DKIM-Filter: OpenDKIM Filter v2.11.0 mxout03.lancloud.ru AB8C820F1773 Received: from LanCloud Received: from LanCloud Received: from LanCloud Received: from LanCloud From: Denis Glazkov To: Denis Glazkov CC: "dhowells@redhat.com" , "jarkko@kernel.org" , "jmorris@namei.org" , "keyrings@vger.kernel.org" , "linux-kernel@vger.kernel.org" , "linux-security-module@vger.kernel.org" , "mkayaalp@linux.vnet.ibm.com" , "serge@hallyn.com" , "zohar@linux.vnet.ibm.com" Subject: [PATCH v2] KEYS: fix memory leaks when reading certificate Thread-Topic: [PATCH v2] KEYS: fix memory leaks when reading certificate Thread-Index: AQHYLv4hXvGLTwdWtEaXm/lsw1BmKA== Date: Thu, 3 Mar 2022 12:56:42 +0000 Message-ID: <20220303125627.93930-1-d.glazkov@omp.ru> References: <20220303081428.12979-1-d.glazkov@omp.ru> In-Reply-To: <20220303081428.12979-1-d.glazkov@omp.ru> Accept-Language: ru-RU, en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [192.168.11.146] Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 8BIT MIME-Version: 1.0 X-Spam-Status: No, score=0.6 required=5.0 tests=BAYES_00,SORTED_RECIPS, SPF_HELO_NONE,SPF_PASS,T_SCC_BODY_TEXT_LINE,UNPARSEABLE_RELAY autolearn=no autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The `exit()` function usage produce possible memory leaks. This patch removes the use of the `exit()` function and adds memory free in case of a negative scenarios. Fixes: c4c361059585 ("KEYS: Reserve an extra certificate symbol for inserting without recompiling") Signed-off-by: Denis Glazkov --- scripts/insert-sys-cert.c | 51 +++++++++++++++++++++++++-------------- 1 file changed, 33 insertions(+), 18 deletions(-) diff --git a/scripts/insert-sys-cert.c b/scripts/insert-sys-cert.c index 8902836c2342..8046682188f3 100644 --- a/scripts/insert-sys-cert.c +++ b/scripts/insert-sys-cert.c @@ -101,7 +101,7 @@ static void get_symbol_from_map(Elf_Ehdr *hdr, FILE *f, char *name, s->offset = 0; if (fseek(f, 0, SEEK_SET) != 0) { perror("File seek failed"); - exit(EXIT_FAILURE); + return; } while (fgets(l, LINE_SIZE, f)) { p = strchr(l, '\n'); @@ -251,6 +251,7 @@ static char *read_file(char *file_name, int *size) if (read(fd, buf, *size) != *size) { perror("File read failed"); close(fd); + free(buf); return NULL; } close(fd); @@ -277,14 +278,15 @@ int main(int argc, char **argv) char *cert_file = NULL; int vmlinux_size; int cert_size; - Elf_Ehdr *hdr; - char *cert; - FILE *system_map; + Elf_Ehdr *hdr = NULL; + char *cert = NULL; + FILE *system_map = NULL; unsigned long *lsize; int *used; int opt; Elf_Shdr *symtab = NULL; struct sym cert_sym, lsize_sym, used_sym; + int ret = EXIT_FAILURE; while ((opt = getopt(argc, argv, "b:c:s:")) != -1) { switch (opt) { @@ -304,20 +306,20 @@ int main(int argc, char **argv) if (!vmlinux_file || !cert_file) { print_usage(argv[0]); - exit(EXIT_FAILURE); + goto finish; } cert = read_file(cert_file, &cert_size); if (!cert) - exit(EXIT_FAILURE); + goto finish; hdr = map_file(vmlinux_file, &vmlinux_size); if (!hdr) - exit(EXIT_FAILURE); + goto finish; if (vmlinux_size < sizeof(*hdr)) { err("Invalid ELF file.\n"); - exit(EXIT_FAILURE); + goto finish; } if ((hdr->e_ident[EI_MAG0] != ELFMAG0) || @@ -325,22 +327,22 @@ int main(int argc, char **argv) (hdr->e_ident[EI_MAG2] != ELFMAG2) || (hdr->e_ident[EI_MAG3] != ELFMAG3)) { err("Invalid ELF magic.\n"); - exit(EXIT_FAILURE); + goto finish; } if (hdr->e_ident[EI_CLASS] != CURRENT_ELFCLASS) { err("ELF class mismatch.\n"); - exit(EXIT_FAILURE); + goto finish; } if (hdr->e_ident[EI_DATA] != endianness()) { err("ELF endian mismatch.\n"); - exit(EXIT_FAILURE); + goto finish; } if (hdr->e_shoff > vmlinux_size) { err("Could not find section header.\n"); - exit(EXIT_FAILURE); + goto finish; } symtab = get_symbol_table(hdr); @@ -349,13 +351,13 @@ int main(int argc, char **argv) if (!system_map_file) { err("Please provide a System.map file.\n"); print_usage(argv[0]); - exit(EXIT_FAILURE); + goto finish; } system_map = fopen(system_map_file, "r"); if (!system_map) { perror(system_map_file); - exit(EXIT_FAILURE); + goto finish; } get_symbol_from_map(hdr, system_map, CERT_SYM, &cert_sym); get_symbol_from_map(hdr, system_map, USED_SYM, &used_sym); @@ -371,7 +373,7 @@ int main(int argc, char **argv) } if (!cert_sym.offset || !lsize_sym.offset || !used_sym.offset) - exit(EXIT_FAILURE); + goto finish; print_sym(hdr, &cert_sym); print_sym(hdr, &used_sym); @@ -382,14 +384,16 @@ int main(int argc, char **argv) if (cert_sym.size < cert_size) { err("Certificate is larger than the reserved area!\n"); - exit(EXIT_FAILURE); + goto finish; } + ret = EXIT_SUCCESS; + /* If the existing cert is the same, don't overwrite */ if (cert_size == *used && strncmp(cert_sym.content, cert, cert_size) == 0) { warn("Certificate was already inserted.\n"); - exit(EXIT_SUCCESS); + goto finish; } if (*used > 0) @@ -406,5 +410,16 @@ int main(int argc, char **argv) cert_sym.address); info("Used %d bytes out of %d bytes reserved.\n", *used, cert_sym.size); - exit(EXIT_SUCCESS); + +finish: + if (cert != NULL) + free(cert); + + if (hdr != NULL) + munmap(hdr, vmlinux_size); + + if (system_map != NULL) + fclose(system_map); + + return ret; } -- 2.25.1