From nobody Tue Oct 29 19:11:57 2024 X-Original-To: dev-commits-src-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4XdKcs4xBqz5bpF1; Tue, 29 Oct 2024 19:11:57 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R10" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4XdKcs4VSLz4DXg; Tue, 29 Oct 2024 19:11:57 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1730229117; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=5gFyGF+F3aHsiBwgZf+JjF0Uo3QQ0oRBzDD0O60Mi6s=; b=CkdDwrA6HXGoTfjeOtcH7WnCppavw653zQKa1bVqcy1884c3CbFHeiK+B5MrVTzy0LygwR yCuyVsyYRzt2KU9xlnJm/4J5UAbV4nNv7in/U1DkYit9lWanZKM/bTT5juJzE0OS55gimi WeTDcBSpVpwqwNCPHGv4OdLyCRmVSXRzZ6x7eX7Plxs1r/WPxFiN7LAy7Vf1rloMGaNi4v I6WL6x9zJ1f6totPV0cdbh7+65mjxgOIocL52qxT8USQg0xnQuKui5DylHmuWFFhpLzGBl skMavSI09wag7FxIKT0oqTIS8Gdy/Lri6yGweymPO7UCGOevA2RSIlJclzMBeA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1730229117; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=5gFyGF+F3aHsiBwgZf+JjF0Uo3QQ0oRBzDD0O60Mi6s=; b=wEREoSaOsOrnp1VSwAP80DTree6CRLrvUL7mQONcLcqxrtss3JVzYTz1wjzASXcpV14q88 R94B98M9Hze1xJx7kcShw9rZT6pnS0GpxUlXifIPXf0im5nHRQfA/n21eAGUBW+XlBZSnB 1F9ul9KLybW1ojlm1I8/8xAUlXokJSeMuEi0zChFWjkgzBkGwNLO+HGtf+PsiqqqrmvrGj k8Y1rqOe1/Tg4gLv1K7SYonforE4tqgYwdiRGifDMnfDRuO0wSqfyEu/QSo5VrWdT/yV0+ slgynVIv1+cTXOVJduLlYL0o9pJ6u0QNs7Fw1OMLqAxeFc/0UjqJXk4gQm6BdQ== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1730229117; a=rsa-sha256; cv=none; b=mC8EoMyHxzK2ZjLcgGQIPnHbjg0l7lO/6NXVzQq33LxGLTAWeR0xOdaePLfL3Hj/au9mN/ SMc/nozIMvdWLCHaNONks7ow5r642lLLgq7w9+mQ/RtL32Nxy8LI1zqd1EopVxAoLW4H5V 2hGg0ocYOtHs2SAZ8//YGgbep3yLgn0t2MmvcqiXSvYFjqTViCIkOtRyAwaQmG84f3Up7v 51dv8HM5fAwznHw+IhcxpzLN9QUz9sGPvVS/iEpOxMd5yx/C2Kz7XHbfx86Ox2UCoQVlmU qUDqgAf7+2Zqouce+xVFaBJXE4/hlXwgUxDKfRKIW0OJMcV5MFmF58mCK2Ryrg== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4XdKcs45K5zbls; Tue, 29 Oct 2024 19:11:57 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.18.1/8.18.1) with ESMTP id 49TJBvg2070983; Tue, 29 Oct 2024 19:11:57 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.18.1/8.18.1/Submit) id 49TJBvam070968; Tue, 29 Oct 2024 19:11:57 GMT (envelope-from git) Date: Tue, 29 Oct 2024 19:11:57 GMT Message-Id: <202410291911.49TJBvam070968@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Ed Maste Subject: git: 4fbd6e0e3ca8 - stable/14 - libc: fix access mode tests in fmemopen(3) List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-all@freebsd.org Sender: owner-dev-commits-src-all@FreeBSD.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: emaste X-Git-Repository: src X-Git-Refname: refs/heads/stable/14 X-Git-Reftype: branch X-Git-Commit: 4fbd6e0e3ca8e69d2d3789ecda6e4dd76c34e06a Auto-Submitted: auto-generated The branch stable/14 has been updated by emaste: URL: https://cgit.FreeBSD.org/src/commit/?id=4fbd6e0e3ca8e69d2d3789ecda6e4dd76c34e06a commit 4fbd6e0e3ca8e69d2d3789ecda6e4dd76c34e06a Author: Ed Maste AuthorDate: 2024-10-23 13:41:51 +0000 Commit: Ed Maste CommitDate: 2024-10-29 19:11:38 +0000 libc: fix access mode tests in fmemopen(3) Previously a stream opened as read-only could be written to. Add a test case for the fix. Also correct another incorrect access mode check that worked by accident, and improve the tests for that. PR: 281953 Reported by: Erkki Moorits, fuz Reviewed by: fuz, khng (earlier) Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D47265 (cherry picked from commit 0953460ce149e6f384aafbcb1e6213dfbf8f6a16) (cherry picked from commit 6b9f7133aba44189d9625c352bc2c2a59baf18ef) --- lib/libc/stdio/fmemopen.c | 10 +++++----- lib/libc/tests/stdio/fmemopen2_test.c | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 5 deletions(-) diff --git a/lib/libc/stdio/fmemopen.c b/lib/libc/stdio/fmemopen.c index 2f835a34951b..dc323921d93a 100644 --- a/lib/libc/stdio/fmemopen.c +++ b/lib/libc/stdio/fmemopen.c @@ -74,10 +74,9 @@ fmemopen(void * __restrict buf, size_t size, const char * __restrict mode) } /* - * There's no point in requiring an automatically allocated buffer - * in write-only mode. + * An automatically allocated buffer is only allowed in read-write mode. */ - if (!(flags & O_RDWR) && buf == NULL) { + if ((flags & O_ACCMODE) != O_RDWR && buf == NULL) { errno = EINVAL; return (NULL); } @@ -136,9 +135,10 @@ fmemopen(void * __restrict buf, size_t size, const char * __restrict mode) break; } + /* Disable read in O_WRONLY mode, and write in O_RDONLY mode. */ f = funopen(ck, - flags & O_WRONLY ? NULL : fmemopen_read, - flags & O_RDONLY ? NULL : fmemopen_write, + (flags & O_ACCMODE) == O_WRONLY ? NULL : fmemopen_read, + (flags & O_ACCMODE) == O_RDONLY ? NULL : fmemopen_write, fmemopen_seek, fmemopen_close); if (f == NULL) { diff --git a/lib/libc/tests/stdio/fmemopen2_test.c b/lib/libc/tests/stdio/fmemopen2_test.c index 2e1b9ea917a5..a558ff3515e9 100644 --- a/lib/libc/tests/stdio/fmemopen2_test.c +++ b/lib/libc/tests/stdio/fmemopen2_test.c @@ -132,9 +132,11 @@ ATF_TC_BODY(test_autoalloc, tc) /* Open a FILE * using a wrong mode */ fp = fmemopen(NULL, 512, "r"); ATF_REQUIRE(fp == NULL); + ATF_REQUIRE(errno == EINVAL); fp = fmemopen(NULL, 512, "w"); ATF_REQUIRE(fp == NULL); + ATF_REQUIRE(errno == EINVAL); } ATF_TC_WITHOUT_HEAD(test_data_length); @@ -271,6 +273,36 @@ ATF_TC_BODY(test_size_0, tc) ATF_REQUIRE(errno == EINVAL); } +/* + * PR281953 - ensure we cannot write in read-only only mode, and cannot read in + * write-only mode. + */ +ATF_TC_WITHOUT_HEAD(test_rdonly_wronly); +ATF_TC_BODY(test_rdonly_wronly, tc) +{ + FILE *fp; + char buf[16]; + char buf_orig[16] = "input data"; + char buf_write[16] = "write"; + size_t sz; + + memcpy(buf, buf_orig, sizeof(buf)); + fp = fmemopen(buf, sizeof(buf), "r"); + ATF_REQUIRE(fp != NULL); + sz = fwrite(buf_write, 1, strlen(buf_write), fp); + ATF_REQUIRE(sz == 0); + ATF_REQUIRE(errno == EBADF); + ATF_REQUIRE(memcmp(buf, buf_orig, sizeof(buf)) == 0); + fclose(fp); + + fp = fmemopen(buf_orig, sizeof(buf), "w"); + ATF_REQUIRE(fp != NULL); + sz = fread(buf, sizeof(buf), 1, fp); + ATF_REQUIRE(sz == 0); + ATF_REQUIRE(errno == EBADF); + fclose(fp); +} + ATF_TP_ADD_TCS(tp) { @@ -280,6 +312,7 @@ ATF_TP_ADD_TCS(tp) ATF_TP_ADD_TC(tp, test_binary); ATF_TP_ADD_TC(tp, test_append_binary_pos); ATF_TP_ADD_TC(tp, test_size_0); + ATF_TP_ADD_TC(tp, test_rdonly_wronly); return (atf_no_error()); }