From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-1.1 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS, URIBL_BLOCKED autolearn=no autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 25039C433E0 for ; Wed, 20 May 2020 12:18:52 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 02911207D3 for ; Wed, 20 May 2020 12:18:52 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1589977132; bh=8CP83BNx4w4eSN3vzsufLxH4B9JagHCoVP0PGOxrYBQ=; h=References:In-Reply-To:From:Date:Subject:To:Cc:List-ID:From; b=q8Q23v5qza+Oa8CkBLr53zqOpZwEY00noqau08U5363sZn2rkq1dg+a1ESfIQC9wI RPXKq/a4gw7iADPa462YWH+KjkFjTFG6GZSc+naifmU+ZOo33eBvliJE+Zfm7dnoCX f8chwqM7rWpUl5IkvbekJM06s3/pWXrtt00ndAok= Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726840AbgETMSv (ORCPT ); Wed, 20 May 2020 08:18:51 -0400 Received: from conssluserg-06.nifty.com ([210.131.2.91]:41287 "EHLO conssluserg-06.nifty.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726452AbgETMSt (ORCPT ); Wed, 20 May 2020 08:18:49 -0400 Received: from mail-vs1-f47.google.com (mail-vs1-f47.google.com [209.85.217.47]) (authenticated) by conssluserg-06.nifty.com with ESMTP id 04KCIMJ9022097; Wed, 20 May 2020 21:18:22 +0900 DKIM-Filter: OpenDKIM Filter v2.10.3 conssluserg-06.nifty.com 04KCIMJ9022097 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nifty.com; s=dec2015msa; t=1589977103; bh=g0zQPGJX5aE8iJ6qIRev+jPwAR5NWJr805RkASX1zTI=; h=References:In-Reply-To:From:Date:Subject:To:Cc:From; b=zJCoavnr9CixnplYluA9RyMAFjamyvoqQIyAE+p+amiGPrfqveVZHLzxsYL3jBM0Z pqC+OQRHyzu4cxF5TvQZUsh09zyAdPU4uM+pl0Yi5qtnG+Y9YqLOoE7razAEK0gbb/ sZsG2u58E0UJknDCzuT1V5y7p4h8dOItt/Twd7Ti3VHw7yvAZqcpHGQDkZRZxjqbQ/ F6P48TyibU63KS87UtN3umI0cpbz8fNqIoUR8s0B/onheyh5rZmZbzbmB2ZaYZjwq7 dyeGsbBr7jGYBMabATN9MYcB4YKoE4CSww3k1X0jtbZY33zKQUp5tzsSGfg0RRb6CY F9JLfnNEConGw== X-Nifty-SrcIP: [209.85.217.47] Received: by mail-vs1-f47.google.com with SMTP id 1so1661502vsl.9; Wed, 20 May 2020 05:18:22 -0700 (PDT) X-Gm-Message-State: AOAM531N5abF0iWdqDlqQVdE+bW7qYnS9GN4a4jiY9/H8XqCbTJwkEqI crYYGtSc7kmovWw9m+dmOR9xRL7fttcu0vqRkbQ= X-Google-Smtp-Source: ABdhPJwS8xCBVayubCaHlqPYv6nB0mPqnUm6GC4Vnnq6e4EwAfmP7hY7SDE4Ws5oW5RVzm9M3oIuNl09taV32lbtlB0= X-Received: by 2002:a67:d016:: with SMTP id r22mr2799400vsi.215.1589977101116; Wed, 20 May 2020 05:18:21 -0700 (PDT) MIME-Version: 1.0 References: <20200517094859.2376211-1-masahiroy@kernel.org> <20200517094859.2376211-4-masahiroy@kernel.org> <20200519102133.GA279905@hirez.programming.kicks-ass.net> In-Reply-To: <20200519102133.GA279905@hirez.programming.kicks-ass.net> From: Masahiro Yamada Date: Wed, 20 May 2020 21:17:45 +0900 X-Gmail-Original-Message-ID: Message-ID: Subject: Re: [PATCH 03/29] modpost: add read_text_file() and get_line() helpers To: Peter Zijlstra Cc: Linux Kbuild mailing list , Jessica Yu , Michal Marek , Linux Kernel Mailing List 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 On Tue, May 19, 2020 at 7:21 PM Peter Zijlstra wrote: > > On Sun, May 17, 2020 at 06:48:33PM +0900, Masahiro Yamada wrote: > > > +char *read_text_file(const char *filename) > > +{ > > + struct stat st; > > + int fd; > > + char *buf; > > + > > + fd = open(filename, O_RDONLY); > > + if (fd < 0) > > + return NULL; > > + > > + if (fstat(fd, &st) < 0) > > + return NULL; > > + > > + buf = NOFAIL(malloc(st.st_size + 1)); > > + > > + if (read(fd, buf, st.st_size) != st.st_size) { > > Is this sensible coding ? I've always been taught read() can return > early/short for a number of reasons and we must not assume this is an > error. > > The 'normal' way to read a file is something like: > > for (;;) { > ssize_t ret = read(fd, buf + size, st.st_size - size); > if (ret < 0) { > free(buf); > buf = NULL; > goto close; > } > if (!ret) > break; > > size += ret; > } > > > + free(buf); > > + buf = NULL; > > + goto close; > > + } > > + buf[st.st_size] = '\0'; > > +close: > > + close(fd); > > + > > + return buf; > > +} In theory, I think yes. But, is it necessary when we know it is reading a regular file? The specification [1] says this: "The value returned may be less than nbyte if the number of bytes left in the file is less than nbyte, if the read() request was interrupted by a signal, or if the file is a pipe or FIFO or special file and has fewer than nbyte bytes immediately available for reading." This case does not meet any of 'if ...' parts. [1] https://pubs.opengroup.org/onlinepubs/000095399/functions/read.html -- Best Regards Masahiro Yamada