[Bug 281953] The fmemopen() function in libc/stdio opens a stream for writing even if the stream is specified as read-only
- Reply: bugzilla-noreply_a_freebsd.org: "[Bug 281953] The fmemopen() function in libc/stdio opens a stream for writing even if the stream is specified as read-only"
- Reply: bugzilla-noreply_a_freebsd.org: "[Bug 281953] The fmemopen() function in libc/stdio opens a stream for writing even if the stream is specified as read-only"
- Reply: bugzilla-noreply_a_freebsd.org: "[Bug 281953] The fmemopen() function in libc/stdio opens a stream for writing even if the stream is specified as read-only"
- Reply: bugzilla-noreply_a_freebsd.org: "[Bug 281953] The fmemopen() function in libc/stdio opens a stream for writing even if the stream is specified as read-only"
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Wed, 09 Oct 2024 12:06:42 UTC
https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=281953
Bug ID: 281953
Summary: The fmemopen() function in libc/stdio opens a stream
for writing even if the stream is specified as
read-only
Product: Base System
Version: 14.1-RELEASE
Hardware: amd64
OS: Any
Status: New
Severity: Affects Some People
Priority: ---
Component: bin
Assignee: bugs@FreeBSD.org
Reporter: erkki.moorits@mail.ee
Attachment #254107 text/plain
mime type:
Created attachment 254107
--> https://bugs.freebsd.org/bugzilla/attachment.cgi?id=254107&action=edit
Test code for fmemopen(.., .., "r")
When memory buffer is opened in read-only mode with the fmemopen(.., .., "r")
function, then the stream opened in read-write mode.
Attached test code with this issue report.
Expected result is (this compiled and run on Ubuntu Linux):
buffer before: 'Hello123'
buffer after: 'Hello123'
fprintf result: -1
Test code, compiled and run on FreeBSD 14.1, give following output:
buffer before: 'Hello123'
buffer after: 'test:1'
fprintf result: 6
Possible cause of this issue are on following lines:
https://cgit.freebsd.org/src/tree/lib/libc/stdio/fmemopen.c#n139
f = funopen(ck,
flags & O_WRONLY ? NULL : fmemopen_read,
flags & O_RDONLY ? NULL : fmemopen_write,
fmemopen_seek, fmemopen_close);
where 'flags & O_RDONLY' give always result 0;
But it should be like this (needs testing):
f = funopen(ck,
(flags & O_ACCMODE) == O_WRONLY ? NULL : fmemopen_read,
(flags & O_ACCMODE) == O_RDONLY ? NULL : fmemopen_write,
fmemopen_seek, fmemopen_close);
Or this (needs testing):
f = funopen(ck,
rc & __SWR ? NULL : fmemopen_read,
rc & __SRD ? NULL : fmemopen_write,
fmemopen_seek, fmemopen_close);
--
You are receiving this mail because:
You are the assignee for the bug.