ovl: intercept mmap on overlay files
... in order to handle the corner case when the file is copied up after
being opened read-only and mapped shared.
Can be verified with the following script:
- 8< - - - - - 8< - - - - - 8< - - - - - 8< - - - -
cd /
rm -rf /tmp/ovl-rorw-test
mkdir /tmp/ovl-rorw-test
cd /tmp/ovl-rorw-test
cat << EOF > rorw-map.c
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <err.h>
#include <sys/mman.h>
int main(int argc, char *argv[])
{
int rofd, rwfd;
int ret;
char buf[4];
char *addr;
rofd = open(argv[1], O_RDONLY);
if (rofd == -1)
err(1, "ro open");
addr = mmap(NULL, 4, PROT_READ, MAP_SHARED, rofd, 0);
if (addr == MAP_FAILED)
err(1, "ro mmap");
if (memcmp(addr, "bubu", 4) == 0)
errx(1, "identical startup data");
rwfd = open(argv[1], O_WRONLY);
if (rwfd == -1)
err(1, "rw open");
ret = write(rwfd, "bubu", 4);
if (ret == -1)
err(1, "write");
if (ret < 4)
errx(1, "short write");
if (memcmp(addr, "bubu", 4) != 0)
errx(1, "bad mmap data");
ret = read(rofd, buf, 4);
if (ret == -1)
err(1, "read");
if (ret < 4)
errx(1, "short read");
if (memcmp(buf, "bubu", 4) != 0)
errx(1, "bad read data");
return 0;
}
EOF
gcc -o rorw-map rorw-map.c
mkdir -p mnt lower upper work
echo baba > lower/foo
mount -t overlay overlay -olowerdir=lower,upperdir=upper,workdir=work mnt
./rorw-map mnt/foo
umount mnt
- 8< - - - - - 8< - - - - - 8< - - - - - 8< - - - -
No output means success, "rorw-map: bad mmap data" means failure.
Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
4 files changed