/* Verifies that mmap’d regions are only written back on munmap
if the data was actually modified in memory. */
#include
#include
#include “tests/vm/sample.inc”
#include “tests/lib.h”
#include “tests/main.h”
void
test_main (void)
{
static const char overwrite[] = “Now is the time for all good…”;
static char buffer[sizeof sample – 1];
char *actual = (char *) 0x54321000;
int handle;
mapid_t map;
/* Open file, map, verify data. */
CHECK ((handle = open (“sample.txt”)) > 1, “open \”sample.txt\””);
CHECK ((map = mmap (handle, actual)) != MAP_FAILED, “mmap \”sample.txt\””);
if (memcmp (actual, sample, strlen (sample)))
fail (“read of mmap’d file reported bad data”);
/* Modify file. */
CHECK (write (handle, overwrite, strlen (overwrite))
== (int) strlen (overwrite),
“write \”sample.txt\””);
/* Close mapping. Data should not be written back, because we
didn’t modify it via the mapping. */
msg (“munmap \”sample.txt\””);
munmap (map);
/* Read file back. */
msg (“seek \”sample.txt\””);
seek (handle, 0);
CHECK (read (handle, buffer, sizeof buffer) == sizeof buffer,
“read \”sample.txt\””);
/* Verify that file overwrite worked. */
if (memcmp (buffer, overwrite, strlen (overwrite))
|| memcmp (buffer + strlen (overwrite), sample + strlen (overwrite),
strlen (sample) – strlen (overwrite)))
{
if (!memcmp (buffer, sample, strlen (sample)))
fail (“munmap wrote back clean page”);
else
fail (“read surprising data from file”);
}
else
msg (“file change was retained after munmap”);
}