1*473c84d1SAaron Tomlin // SPDX-License-Identifier: GPL-2.0-or-later 2*473c84d1SAaron Tomlin /* 3*473c84d1SAaron Tomlin * Module kmemleak support 4*473c84d1SAaron Tomlin * 5*473c84d1SAaron Tomlin * Copyright (C) 2009 Catalin Marinas 6*473c84d1SAaron Tomlin */ 7*473c84d1SAaron Tomlin 8*473c84d1SAaron Tomlin #include <linux/module.h> 9*473c84d1SAaron Tomlin #include <linux/kmemleak.h> 10*473c84d1SAaron Tomlin #include "internal.h" 11*473c84d1SAaron Tomlin kmemleak_load_module(const struct module * mod,const struct load_info * info)12*473c84d1SAaron Tomlinvoid kmemleak_load_module(const struct module *mod, 13*473c84d1SAaron Tomlin const struct load_info *info) 14*473c84d1SAaron Tomlin { 15*473c84d1SAaron Tomlin unsigned int i; 16*473c84d1SAaron Tomlin 17*473c84d1SAaron Tomlin /* only scan the sections containing data */ 18*473c84d1SAaron Tomlin kmemleak_scan_area(mod, sizeof(struct module), GFP_KERNEL); 19*473c84d1SAaron Tomlin 20*473c84d1SAaron Tomlin for (i = 1; i < info->hdr->e_shnum; i++) { 21*473c84d1SAaron Tomlin /* Scan all writable sections that's not executable */ 22*473c84d1SAaron Tomlin if (!(info->sechdrs[i].sh_flags & SHF_ALLOC) || 23*473c84d1SAaron Tomlin !(info->sechdrs[i].sh_flags & SHF_WRITE) || 24*473c84d1SAaron Tomlin (info->sechdrs[i].sh_flags & SHF_EXECINSTR)) 25*473c84d1SAaron Tomlin continue; 26*473c84d1SAaron Tomlin 27*473c84d1SAaron Tomlin kmemleak_scan_area((void *)info->sechdrs[i].sh_addr, 28*473c84d1SAaron Tomlin info->sechdrs[i].sh_size, GFP_KERNEL); 29*473c84d1SAaron Tomlin } 30*473c84d1SAaron Tomlin } 31