| From 69918130cdd2972f5d2e62a1c5290811e7ecf6bf Mon Sep 17 00:00:00 2001 |
| From: Frederic Barrat <fbarrat@linux.ibm.com> |
| Date: Mon, 9 Dec 2019 11:55:13 +0100 |
| Subject: [PATCH] ocxl: Fix potential memory leak on context creation |
| |
| commit 913e73c77d48aeeb50c16450a653dca9c71ae2e2 upstream. |
| |
| If we couldn't fully init a context, we were leaking memory. |
| |
| Fixes: b9721d275cc2 ("ocxl: Allow external drivers to use OpenCAPI contexts") |
| Signed-off-by: Frederic Barrat <fbarrat@linux.ibm.com> |
| Acked-by: Andrew Donnellan <ajd@linux.ibm.com> |
| Reviewed-by: Greg Kurz <groug@kaod.org> |
| Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> |
| Link: https://lore.kernel.org/r/20191209105513.8566-1-fbarrat@linux.ibm.com |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/drivers/misc/ocxl/context.c b/drivers/misc/ocxl/context.c |
| index bab9c9364184..425bec7b140c 100644 |
| --- a/drivers/misc/ocxl/context.c |
| +++ b/drivers/misc/ocxl/context.c |
| @@ -10,18 +10,17 @@ int ocxl_context_alloc(struct ocxl_context **context, struct ocxl_afu *afu, |
| int pasid; |
| struct ocxl_context *ctx; |
| |
| - *context = kzalloc(sizeof(struct ocxl_context), GFP_KERNEL); |
| - if (!*context) |
| + ctx = kzalloc(sizeof(*ctx), GFP_KERNEL); |
| + if (!ctx) |
| return -ENOMEM; |
| |
| - ctx = *context; |
| - |
| ctx->afu = afu; |
| mutex_lock(&afu->contexts_lock); |
| pasid = idr_alloc(&afu->contexts_idr, ctx, afu->pasid_base, |
| afu->pasid_base + afu->pasid_max, GFP_KERNEL); |
| if (pasid < 0) { |
| mutex_unlock(&afu->contexts_lock); |
| + kfree(ctx); |
| return pasid; |
| } |
| afu->pasid_count++; |
| @@ -43,6 +42,7 @@ int ocxl_context_alloc(struct ocxl_context **context, struct ocxl_afu *afu, |
| * duration of the life of the context |
| */ |
| ocxl_afu_get(afu); |
| + *context = ctx; |
| return 0; |
| } |
| EXPORT_SYMBOL_GPL(ocxl_context_alloc); |
| -- |
| 2.7.4 |
| |