diff options
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/bpf/syscall.c | 37 |
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 | } |