View Issue Details
ID | Project | Category | View Status | Date Submitted | Last Update |
---|---|---|---|---|---|
0001153 | 1003.1(2016/18)/Issue7+TC2 | System Interfaces | public | 2017-06-22 08:02 | 2024-06-11 09:09 |
Reporter | Villemoes | Assigned To | ajosey | ||
Priority | normal | Severity | Editorial | Type | Clarification Requested |
Status | Closed | Resolution | Accepted As Marked | ||
Name | Rasmus Villemoes | ||||
Organization | |||||
User Reference | |||||
Section | fmemopen | ||||
Page Number | |||||
Line Number | |||||
Interp Status | --- | ||||
Final Accepted Text | See 0001153:0004186 | ||||
Summary | 0001153: fread/fwrite to/from buffer underlying the memory stream | ||||
Description | In glibc, running the code below under valgrind gives a Source and destination overlap in memcpy Without the setvbuf calls, this doesn't trigger because the reads and writes happen via an internal buffer. I cannot find anything that says the application cannot do fread/fwrite calls on a memory stream, using part of the stream's underlying buffer as destination/source. #include <stdio.h> int main(int argc, char *argv[]) { char x[4] = "123"; char y[4] = "abc"; FILE *f = fmemopen(x, 3, "r"); FILE *g = fmemopen(y, 3, "w"); setvbuf(f, NULL, _IONBF, 0); setvbuf(g, NULL, _IONBF, 0); fread(&x[1], 1, 2, f); fwrite(&y[1], 1, 2, g); printf("x = %s\n", x); printf("y = %s\n", y); fclose(f); fclose(g); printf("x = %s\n", x); printf("y = %s\n", y); return 0; } | ||||
Desired Action | Clarify whether the implementation must behave as if it was using memmove internally, or alternatively, that it is up to the application to avoid fread/fwrite calls on memory streams that will trigger such copies. The latter seems hard to do in general. | ||||
Tags | tc3-2008 |
|
Add a new paragraph (CX shaded) to page 496 line 17237 section 2.5: When a standard I/O stream has an associated memory buffer (whether allocated internally, supplied to setvbuf(), or supplied to fmemopen()), the behavior is undefined if that buffer overlaps with the destination buffer passed to a call that reads from the stream or with the source buffer passed to a call that writes to the stream. |
Date Modified | Username | Field | Change |
---|---|---|---|
2017-06-22 08:02 | Villemoes | New Issue | |
2017-06-22 08:02 | Villemoes | Status | New => Under Review |
2017-06-22 08:02 | Villemoes | Assigned To | => ajosey |
2017-06-22 08:02 | Villemoes | Name | => Rasmus Villemoes |
2017-06-22 08:02 | Villemoes | Section | => fmemopen |
2018-12-13 16:59 | nick | Note Added: 0004186 | |
2018-12-13 17:00 | nick | Interp Status | => --- |
2018-12-13 17:00 | nick | Status | Under Review => Resolved |
2018-12-13 17:00 | nick | Resolution | Open => Accepted As Marked |
2018-12-13 17:00 | nick | Final Accepted Text | => See 0001153:0004186 |
2018-12-13 17:01 | nick | Tag Attached: tc3-2008 | |
2018-12-13 17:02 | geoffclare | Project | 1003.1(2008)/Issue 7 => 1003.1(2016/18)/Issue7+TC2 |
2019-11-07 09:23 | geoffclare | Status | Resolved => Applied |
2024-06-11 09:09 | agadmin | Status | Applied => Closed |