• K
    mbind(): fix leak of never putback pages · ab8a3e14
    KOSAKI Motohiro 提交于
    If mbind() receives an invalid address, do_mbind leaks a page.  The
    following test program detects this leak.
    
    This patch fixes it.
    
    migrate_efault.c
    =======================================
     #include <numaif.h>
     #include <numa.h>
     #include <sys/mman.h>
     #include <stdio.h>
     #include <unistd.h>
     #include <stdlib.h>
     #include <string.h>
    
    static unsigned long pagesize;
    
    static void* make_hole_mapping(void)
    {
    
    	void* addr;
    
    	addr = mmap(NULL, pagesize*3, PROT_READ|PROT_WRITE,
    		    MAP_ANON|MAP_PRIVATE, 0, 0);
    	if (addr == MAP_FAILED)
    		return NULL;
    
    	/* make page populate */
    	memset(addr, 0, pagesize*3);
    
    	/* make memory hole */
    	munmap(addr+pagesize, pagesize);
    
    	return addr;
    }
    
    int main(int argc, char** argv)
    {
    	void* addr;
    	int ch;
    	int node;
    	struct bitmask *nmask = numa_allocate_nodemask();
    	int err;
    	int node_set = 0;
    
    	while ((ch = getopt(argc, argv, "n:")) != -1){
    		switch (ch){
    		case 'n':
    			node = strtol(optarg, NULL, 0);
    			numa_bitmask_setbit(nmask, node);
    			node_set = 1;
    			break;
    		default:
    			;
    		}
    	}
    	argc -= optind;
    	argv += optind;
    
    	if (!node_set)
    		numa_bitmask_setbit(nmask, 0);
    
    	pagesize = getpagesize();
    
    	addr = make_hole_mapping();
    
    	err = mbind(addr, pagesize*3, MPOL_BIND, nmask->maskp, nmask->size, MPOL_MF_MOVE_ALL);
    	if (err)
    		perror("mbind ");
    
    	return 0;
    }
    =======================================
    Signed-off-by: NKOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
    Acked-by: NChristoph Lameter <cl@linux-foundation.org>
    Cc: <stable@kernel.org>
    Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
    ab8a3e14
mempolicy.c 61.4 KB