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 |