Commit 733c99ee authored by 王贇's avatar 王贇 Committed by David S. Miller

net: fix NULL pointer reference in cipso_v4_doi_free

In netlbl_cipsov4_add_std() when 'doi_def->map.std' alloc
failed, we sometime observe panic:

  BUG: kernel NULL pointer dereference, address:
  ...
  RIP: 0010:cipso_v4_doi_free+0x3a/0x80
  ...
  Call Trace:
   netlbl_cipsov4_add_std+0xf4/0x8c0
   netlbl_cipsov4_add+0x13f/0x1b0
   genl_family_rcv_msg_doit.isra.15+0x132/0x170
   genl_rcv_msg+0x125/0x240

This is because in cipso_v4_doi_free() there is no check
on 'doi_def->map.std' when 'doi_def->type' equal 1, which
is possibe, since netlbl_cipsov4_add_std() haven't initialize
it before alloc 'doi_def->map.std'.

This patch just add the check to prevent panic happen for similar
cases.
Reported-by: default avatarAbaci <abaci@linux.alibaba.com>
Signed-off-by: default avatarMichael Wang <yun.wang@linux.alibaba.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 96a6b93b
...@@ -465,14 +465,16 @@ void cipso_v4_doi_free(struct cipso_v4_doi *doi_def) ...@@ -465,14 +465,16 @@ void cipso_v4_doi_free(struct cipso_v4_doi *doi_def)
if (!doi_def) if (!doi_def)
return; return;
switch (doi_def->type) { if (doi_def->map.std) {
case CIPSO_V4_MAP_TRANS: switch (doi_def->type) {
kfree(doi_def->map.std->lvl.cipso); case CIPSO_V4_MAP_TRANS:
kfree(doi_def->map.std->lvl.local); kfree(doi_def->map.std->lvl.cipso);
kfree(doi_def->map.std->cat.cipso); kfree(doi_def->map.std->lvl.local);
kfree(doi_def->map.std->cat.local); kfree(doi_def->map.std->cat.cipso);
kfree(doi_def->map.std); kfree(doi_def->map.std->cat.local);
break; kfree(doi_def->map.std);
break;
}
} }
kfree(doi_def); kfree(doi_def);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment