@@ -89,6 +89,44 @@ int main() {
89
89
fclose (fd );
90
90
}
91
91
92
+ // Use mmap to read out.txt and modify the contents in memory,
93
+ // but make sure it's not overwritten on munmap
94
+ {
95
+ const char * readonlytext = "readonly mmap\0" ;
96
+ const char * text = "write mmap\0" ;
97
+ const char * path = "/yolo/outreadonly.txt" ;
98
+ size_t readonlytextsize = strlen (readonlytext );
99
+ size_t textsize = strlen (text );
100
+
101
+ int fd = open (path , O_RDWR | O_CREAT , (mode_t )0600 );
102
+ // write contents to the file ( we don't want this to be overwritten on munmap )
103
+ assert (write (fd , readonlytext , readonlytextsize ) != -1 );
104
+ close (fd );
105
+
106
+ fd = open (path , O_RDWR );
107
+ char * map = (char * )mmap (0 , textsize , PROT_READ , MAP_SHARED , fd , 0 );
108
+ assert (map != MAP_FAILED );
109
+
110
+ for (size_t i = 0 ; i < textsize ; i ++ ) {
111
+ map [i ] = text [i ];
112
+ }
113
+
114
+ assert (munmap (map , textsize ) != -1 );
115
+ close (fd );
116
+ }
117
+
118
+ {
119
+ FILE * fd = fopen ("/yolo/outreadonly.txt" , "r" );
120
+ if (fd == NULL ) {
121
+ printf ("failed to open /yolo/outreadonly.txt\n" );
122
+ return 1 ;
123
+ }
124
+ char buffer [14 ];
125
+ fread (buffer , 1 , 15 , fd );
126
+ printf ("/yolo/outreadonly.txt content=%s\n" , buffer );
127
+ fclose (fd );
128
+ }
129
+
92
130
// MAP_PRIVATE
93
131
{
94
132
const char * text = "written mmap" ;
0 commit comments