1// SPDX-License-Identifier: GPL-2.0-or-later
2/*
3 * Copyright (c) International Business Machines  Corp., 2001
4 *  07/2001 Ported by Wayne Boyer
5 * Copyright (c) 2023 SUSE LLC Avinesh Kumar <avinesh.kumar@suse.com>
6 */
7
8/*\
9 * [Description]
10 *
11 * Verify that, mmap() call with PROT_READ and a file descriptor which is
12 * open for read only, succeeds to map a file creating mapped memory with
13 * read access.
14 */
15
16#include <stdlib.h>
17#include "tst_test.h"
18
19#define TEMPFILE "mmapfile"
20static ssize_t page_sz;
21static int fd;
22static char *addr;
23static char *buf;
24
25static void setup(void)
26{
27	page_sz = getpagesize();
28	buf = SAFE_MALLOC(page_sz);
29	memset(buf, 'A', page_sz);
30
31	fd = SAFE_OPEN(TEMPFILE, O_RDWR | O_CREAT, 0666);
32	SAFE_WRITE(SAFE_WRITE_ALL, fd, buf, page_sz);
33
34	SAFE_FCHMOD(fd, 0444);
35	SAFE_CLOSE(fd);
36	fd = SAFE_OPEN(TEMPFILE, O_RDONLY);
37}
38
39static void run(void)
40{
41	addr = SAFE_MMAP(NULL, page_sz, PROT_READ, MAP_FILE | MAP_SHARED, fd, 0);
42
43	if (memcmp(buf, addr, page_sz) == 0)
44		tst_res(TPASS, "mmap() functionality successful");
45	else
46		tst_res(TFAIL, "mapped memory area contains invalid data");
47
48	SAFE_MUNMAP(addr, page_sz);
49}
50
51static void cleanup(void)
52{
53	if (fd > 0)
54		SAFE_CLOSE(fd);
55
56	free(buf);
57}
58
59static struct tst_test test = {
60	.setup = setup,
61	.cleanup = cleanup,
62	.test_all = run,
63	.needs_tmpdir = 1
64};
65