/* Verifies that mmapd 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 mmapd 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
didnt 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);
}
Reviews
There are no reviews yet.