aboutsummaryrefslogtreecommitdiffstats
path: root/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'kernel')
-rw-r--r--kernel/bpf/syscall.c37
1 files changed, 34 insertions, 3 deletions
diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c
index 068a4fc79ddb..c8e987a612b5 100644
--- a/kernel/bpf/syscall.c
+++ b/kernel/bpf/syscall.c
@@ -1970,13 +1970,44 @@ static int bpf_prog_get_info_by_fd(struct bpf_prog *prog,
1970 * for offload. 1970 * for offload.
1971 */ 1971 */
1972 ulen = info.jited_prog_len; 1972 ulen = info.jited_prog_len;
1973 info.jited_prog_len = prog->jited_len; 1973 if (prog->aux->func_cnt) {
1974 u32 i;
1975
1976 info.jited_prog_len = 0;
1977 for (i = 0; i < prog->aux->func_cnt; i++)
1978 info.jited_prog_len += prog->aux->func[i]->jited_len;
1979 } else {
1980 info.jited_prog_len = prog->jited_len;
1981 }
1982
1974 if (info.jited_prog_len && ulen) { 1983 if (info.jited_prog_len && ulen) {
1975 if (bpf_dump_raw_ok()) { 1984 if (bpf_dump_raw_ok()) {
1976 uinsns = u64_to_user_ptr(info.jited_prog_insns); 1985 uinsns = u64_to_user_ptr(info.jited_prog_insns);
1977 ulen = min_t(u32, info.jited_prog_len, ulen); 1986 ulen = min_t(u32, info.jited_prog_len, ulen);
1978 if (copy_to_user(uinsns, prog->bpf_func, ulen)) 1987
1979 return -EFAULT; 1988 /* for multi-function programs, copy the JITed
1989 * instructions for all the functions
1990 */
1991 if (prog->aux->func_cnt) {
1992 u32 len, free, i;
1993 u8 *img;
1994
1995 free = ulen;
1996 for (i = 0; i < prog->aux->func_cnt; i++) {
1997 len = prog->aux->func[i]->jited_len;
1998 len = min_t(u32, len, free);
1999 img = (u8 *) prog->aux->func[i]->bpf_func;
2000 if (copy_to_user(uinsns, img, len))
2001 return -EFAULT;
2002 uinsns += len;
2003 free -= len;
2004 if (!free)
2005 break;
2006 }
2007 } else {
2008 if (copy_to_user(uinsns, prog->bpf_func, ulen))
2009 return -EFAULT;
2010 }
1980 } else { 2011 } else {
1981 info.jited_prog_insns = 0; 2012 info.jited_prog_insns = 0;
1982 } 2013 }