From patchwork Mon Dec 19 12:25:26 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Schwab X-Patchwork-Id: 62142 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 9DD783858D3C for ; Mon, 19 Dec 2022 12:25:57 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 9DD783858D3C DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1671452757; bh=xhpfqAo/zEvy4A4Wa2jxw1iYBGLrMNjClfdJVK467AQ=; h=To:Subject:Date:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:From; b=YVxizm0fgpACSs6jMpFNwgDnxZQL6OW3CACoEfdtC+7mXEObCc3NtSkaV5vpeple3 GI0J0hZVrM0YYzk6xADflcDP7uOXQ3vAP8A5v7gf+uLqhtHEhorb8YKA1IEcii+ET8 5Mg7miXkUjg3JZ6hpzN8HZk74G2dnv0kvgUeaKZA= X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from smtp-out1.suse.de (smtp-out1.suse.de [195.135.220.28]) by sourceware.org (Postfix) with ESMTPS id 3E96D3858D20 for ; Mon, 19 Dec 2022 12:25:28 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 3E96D3858D20 Received: from relay2.suse.de (relay2.suse.de [149.44.160.134]) by smtp-out1.suse.de (Postfix) with ESMTP id 70FB937967 for ; Mon, 19 Dec 2022 12:25:27 +0000 (UTC) Received: from hawking.suse.de (unknown [10.168.4.11]) by relay2.suse.de (Postfix) with ESMTP id 696D32C141 for ; Mon, 19 Dec 2022 12:25:27 +0000 (UTC) Received: by hawking.suse.de (Postfix, from userid 17005) id CA3D8447831; Mon, 19 Dec 2022 13:25:26 +0100 (CET) To: libc-alpha@sourceware.org Subject: [PATCH] getdelim: ensure error indicator is set on error (bug 29917) X-Yow: Yow! Are you the self-frying president? Date: Mon, 19 Dec 2022 13:25:26 +0100 Message-ID: User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/28.2 (gnu/linux) MIME-Version: 1.0 X-Spam-Status: No, score=-9.1 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Andreas Schwab via Libc-alpha From: Andreas Schwab Reply-To: Andreas Schwab Errors-To: libc-alpha-bounces+patchwork=sourceware.org@sourceware.org Sender: "Libc-alpha" POSIX requires that getdelim and getline set the error indicator on the stream when an error occured, in addition to setting errno. --- libio/iogetdelim.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/libio/iogetdelim.c b/libio/iogetdelim.c index b6c4c07b45..591526e9c1 100644 --- a/libio/iogetdelim.c +++ b/libio/iogetdelim.c @@ -43,11 +43,6 @@ __getdelim (char **lineptr, size_t *n, int delimiter, FILE *fp) ssize_t cur_len = 0; ssize_t len; - if (lineptr == NULL || n == NULL) - { - __set_errno (EINVAL); - return -1; - } CHECK_FILE (fp, -1); _IO_acquire_lock (fp); if (_IO_ferror_unlocked (fp)) @@ -56,12 +51,21 @@ __getdelim (char **lineptr, size_t *n, int delimiter, FILE *fp) goto unlock_return; } + if (lineptr == NULL || n == NULL) + { + __set_errno (EINVAL); + fseterr_unlocked (fp); + result = -1; + goto unlock_return; + } + if (*lineptr == NULL || *n == 0) { *n = 120; *lineptr = (char *) malloc (*n); if (*lineptr == NULL) { + fseterr_unlocked (fp); result = -1; goto unlock_return; } @@ -88,6 +92,7 @@ __getdelim (char **lineptr, size_t *n, int delimiter, FILE *fp) if (__glibc_unlikely (len >= SSIZE_MAX - cur_len)) { __set_errno (EOVERFLOW); + fseterr_unlocked (fp); result = -1; goto unlock_return; } @@ -102,6 +107,7 @@ __getdelim (char **lineptr, size_t *n, int delimiter, FILE *fp) new_lineptr = (char *) realloc (*lineptr, needed); if (new_lineptr == NULL) { + fseterr_unlocked (fp); result = -1; goto unlock_return; }