Commit ce36394269ccd9d1d286d6192ba09fa6894365e9

Authored by Tejun Heo
Committed by Linus Torvalds
1 parent d210baf53b

mmap: fix petty bug in anonymous shared mmap offset handling

Anonymous mappings should ignore offset but shared anonymous mapping
forgot to clear it and makes the following legit test program trigger
SIGBUS.

 #include <sys/mman.h>
 #include <stdio.h>
 #include <errno.h>

 #define PAGE_SIZE	4096

 int main(void)
 {
	 char *p;
	 int i;

	 p = mmap(NULL, 2 * PAGE_SIZE, PROT_READ|PROT_WRITE,
		  MAP_SHARED|MAP_ANONYMOUS, -1, PAGE_SIZE);
	 if (p == MAP_FAILED) {
		 perror("mmap");
		 return 1;
	 }

	 for (i = 0; i < 2; i++) {
		 printf("page %d\n", i);
		 p[i * 4096] = i;
	 }
	 return 0;
 }

Fix it.

Signed-off-by: Tejun Heo <tj@kernel.org>
Acked-by: Hugh Dickins <hugh@veritas.com>
Acked-by: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

Showing 1 changed file with 4 additions and 0 deletions Side-by-side Diff

... ... @@ -1030,6 +1030,10 @@
1030 1030 } else {
1031 1031 switch (flags & MAP_TYPE) {
1032 1032 case MAP_SHARED:
  1033 + /*
  1034 + * Ignore pgoff.
  1035 + */
  1036 + pgoff = 0;
1033 1037 vm_flags |= VM_SHARED | VM_MAYSHARE;
1034 1038 break;
1035 1039 case MAP_PRIVATE: