Skip to content

Commit abe82a0

Browse files
alexdewarkernel-patches-bot
authored andcommitted
net: sockmap: Don't call bpf_prog_put() on NULL pointer
If bpf_prog_inc_not_zero() fails for skb_parser, then bpf_prog_put() is called unconditionally on skb_verdict, even though it may be NULL. Fix and tidy up error path. Addresses-Coverity-ID: 1497799: Null pointer dereferences (FORWARD_NULL) Fixes: 743df8b ("bpf, sockmap: Check skb_verdict and skb_parser programs explicitly") Signed-off-by: Alex Dewar <alex.dewar90@gmail.com>
1 parent a6088d2 commit abe82a0

File tree

1 file changed

+9
-7
lines changed

1 file changed

+9
-7
lines changed

net/core/sock_map.c

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -238,17 +238,18 @@ static int sock_map_link(struct bpf_map *map, struct sk_psock_progs *progs,
238238
int ret;
239239

240240
skb_verdict = READ_ONCE(progs->skb_verdict);
241-
skb_parser = READ_ONCE(progs->skb_parser);
242241
if (skb_verdict) {
243242
skb_verdict = bpf_prog_inc_not_zero(skb_verdict);
244243
if (IS_ERR(skb_verdict))
245244
return PTR_ERR(skb_verdict);
246245
}
246+
247+
skb_parser = READ_ONCE(progs->skb_parser);
247248
if (skb_parser) {
248249
skb_parser = bpf_prog_inc_not_zero(skb_parser);
249250
if (IS_ERR(skb_parser)) {
250-
bpf_prog_put(skb_verdict);
251-
return PTR_ERR(skb_parser);
251+
ret = PTR_ERR(skb_parser);
252+
goto out_put_skb_verdict;
252253
}
253254
}
254255

@@ -257,7 +258,7 @@ static int sock_map_link(struct bpf_map *map, struct sk_psock_progs *progs,
257258
msg_parser = bpf_prog_inc_not_zero(msg_parser);
258259
if (IS_ERR(msg_parser)) {
259260
ret = PTR_ERR(msg_parser);
260-
goto out;
261+
goto out_put_skb_parser;
261262
}
262263
}
263264

@@ -311,11 +312,12 @@ static int sock_map_link(struct bpf_map *map, struct sk_psock_progs *progs,
311312
out_progs:
312313
if (msg_parser)
313314
bpf_prog_put(msg_parser);
314-
out:
315-
if (skb_verdict)
316-
bpf_prog_put(skb_verdict);
315+
out_put_skb_parser:
317316
if (skb_parser)
318317
bpf_prog_put(skb_parser);
318+
out_put_skb_verdict:
319+
if (skb_verdict)
320+
bpf_prog_put(skb_verdict);
319321
return ret;
320322
}
321323

0 commit comments

Comments
 (0)