diff options
author | Geyslan G. Bem <geyslan@gmail.com> | 2013-11-24 06:37:01 -0500 |
---|---|---|
committer | Paul Moore <pmoore@redhat.com> | 2013-11-25 17:00:33 -0500 |
commit | 8e645c345a4cf6b8b13054b4ec2f6371f05876a9 (patch) | |
tree | d81d01ba23cb6dc1b12396d4992fea48e1b5b0ee | |
parent | b5495b4217d3fa64deac479db83dbede149af7d8 (diff) |
selinux: fix possible memory leak
Free 'ctx_str' when necessary.
Signed-off-by: Geyslan G. Bem <geyslan@gmail.com>
Cc: stable@vger.kernel.org
Signed-off-by: Paul Moore <pmoore@redhat.com>
-rw-r--r-- | security/selinux/xfrm.c | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/security/selinux/xfrm.c b/security/selinux/xfrm.c index a91d205ec0c6..cf79a4564e38 100644 --- a/security/selinux/xfrm.c +++ b/security/selinux/xfrm.c | |||
@@ -327,19 +327,22 @@ int selinux_xfrm_state_alloc_acquire(struct xfrm_state *x, | |||
327 | return rc; | 327 | return rc; |
328 | 328 | ||
329 | ctx = kmalloc(sizeof(*ctx) + str_len, GFP_ATOMIC); | 329 | ctx = kmalloc(sizeof(*ctx) + str_len, GFP_ATOMIC); |
330 | if (!ctx) | 330 | if (!ctx) { |
331 | return -ENOMEM; | 331 | rc = -ENOMEM; |
332 | goto out; | ||
333 | } | ||
332 | 334 | ||
333 | ctx->ctx_doi = XFRM_SC_DOI_LSM; | 335 | ctx->ctx_doi = XFRM_SC_DOI_LSM; |
334 | ctx->ctx_alg = XFRM_SC_ALG_SELINUX; | 336 | ctx->ctx_alg = XFRM_SC_ALG_SELINUX; |
335 | ctx->ctx_sid = secid; | 337 | ctx->ctx_sid = secid; |
336 | ctx->ctx_len = str_len; | 338 | ctx->ctx_len = str_len; |
337 | memcpy(ctx->ctx_str, ctx_str, str_len); | 339 | memcpy(ctx->ctx_str, ctx_str, str_len); |
338 | kfree(ctx_str); | ||
339 | 340 | ||
340 | x->security = ctx; | 341 | x->security = ctx; |
341 | atomic_inc(&selinux_xfrm_refcount); | 342 | atomic_inc(&selinux_xfrm_refcount); |
342 | return 0; | 343 | out: |
344 | kfree(ctx_str); | ||
345 | return rc; | ||
343 | } | 346 | } |
344 | 347 | ||
345 | /* | 348 | /* |