libbpf: Initialize the bpf_seq_printf parameters array field by field
[ Upstream commit 83cd92b46484aa8f64cdc0bff8ac6940d1f78519 ]
When initializing the __param array with a one liner, if all args are
const, the initial array value will be placed in the rodata section but
because libbpf does not support relocation in the rodata section, any
pointer in this array will stay NULL.
Fixes: c09add2fbc ("tools/libbpf: Add bpf_iter support")
Signed-off-by: Florent Revest <revest@chromium.org>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Acked-by: Andrii Nakryiko <andrii@kernel.org>
Link: https://lore.kernel.org/bpf/20210419155243.1632274-5-revest@chromium.org
Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
b9e719698f
commit
78d8b34751
@@ -413,20 +413,38 @@ typeof(name(0)) name(struct pt_regs *ctx) \
|
|||||||
} \
|
} \
|
||||||
static __always_inline typeof(name(0)) ____##name(struct pt_regs *ctx, ##args)
|
static __always_inline typeof(name(0)) ____##name(struct pt_regs *ctx, ##args)
|
||||||
|
|
||||||
|
#define ___bpf_fill0(arr, p, x) do {} while (0)
|
||||||
|
#define ___bpf_fill1(arr, p, x) arr[p] = x
|
||||||
|
#define ___bpf_fill2(arr, p, x, args...) arr[p] = x; ___bpf_fill1(arr, p + 1, args)
|
||||||
|
#define ___bpf_fill3(arr, p, x, args...) arr[p] = x; ___bpf_fill2(arr, p + 1, args)
|
||||||
|
#define ___bpf_fill4(arr, p, x, args...) arr[p] = x; ___bpf_fill3(arr, p + 1, args)
|
||||||
|
#define ___bpf_fill5(arr, p, x, args...) arr[p] = x; ___bpf_fill4(arr, p + 1, args)
|
||||||
|
#define ___bpf_fill6(arr, p, x, args...) arr[p] = x; ___bpf_fill5(arr, p + 1, args)
|
||||||
|
#define ___bpf_fill7(arr, p, x, args...) arr[p] = x; ___bpf_fill6(arr, p + 1, args)
|
||||||
|
#define ___bpf_fill8(arr, p, x, args...) arr[p] = x; ___bpf_fill7(arr, p + 1, args)
|
||||||
|
#define ___bpf_fill9(arr, p, x, args...) arr[p] = x; ___bpf_fill8(arr, p + 1, args)
|
||||||
|
#define ___bpf_fill10(arr, p, x, args...) arr[p] = x; ___bpf_fill9(arr, p + 1, args)
|
||||||
|
#define ___bpf_fill11(arr, p, x, args...) arr[p] = x; ___bpf_fill10(arr, p + 1, args)
|
||||||
|
#define ___bpf_fill12(arr, p, x, args...) arr[p] = x; ___bpf_fill11(arr, p + 1, args)
|
||||||
|
#define ___bpf_fill(arr, args...) \
|
||||||
|
___bpf_apply(___bpf_fill, ___bpf_narg(args))(arr, 0, args)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* BPF_SEQ_PRINTF to wrap bpf_seq_printf to-be-printed values
|
* BPF_SEQ_PRINTF to wrap bpf_seq_printf to-be-printed values
|
||||||
* in a structure.
|
* in a structure.
|
||||||
*/
|
*/
|
||||||
#define BPF_SEQ_PRINTF(seq, fmt, args...) \
|
#define BPF_SEQ_PRINTF(seq, fmt, args...) \
|
||||||
({ \
|
({ \
|
||||||
_Pragma("GCC diagnostic push") \
|
static const char ___fmt[] = fmt; \
|
||||||
_Pragma("GCC diagnostic ignored \"-Wint-conversion\"") \
|
unsigned long long ___param[___bpf_narg(args)]; \
|
||||||
static const char ___fmt[] = fmt; \
|
\
|
||||||
unsigned long long ___param[] = { args }; \
|
_Pragma("GCC diagnostic push") \
|
||||||
_Pragma("GCC diagnostic pop") \
|
_Pragma("GCC diagnostic ignored \"-Wint-conversion\"") \
|
||||||
int ___ret = bpf_seq_printf(seq, ___fmt, sizeof(___fmt), \
|
___bpf_fill(___param, args); \
|
||||||
___param, sizeof(___param)); \
|
_Pragma("GCC diagnostic pop") \
|
||||||
___ret; \
|
\
|
||||||
})
|
bpf_seq_printf(seq, ___fmt, sizeof(___fmt), \
|
||||||
|
___param, sizeof(___param)); \
|
||||||
|
})
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
Reference in New Issue
Block a user