From f5ae79e956d7a8975b3864f34771b5110687f67c Mon Sep 17 00:00:00 2001 From: Andrew Morton Date: Sun, 31 Aug 2003 04:27:59 -0700 Subject: [PATCH] [PATCH] zoran: memleak fixes From: Ronald Bultje This patch fixes several memleaks in error cases when the setup of i2c client drivers for video encoders/decoders fails. We forgot to free some memory in various places. This was noticed by Francois Romieu. --- drivers/media/video/adv7170.c | 2 ++ drivers/media/video/adv7175.c | 2 ++ drivers/media/video/bt856.c | 1 + drivers/media/video/saa7114.c | 10 ++++++++++ drivers/media/video/saa7185.c | 1 + 5 files changed, 16 insertions(+) diff --git a/drivers/media/video/adv7170.c b/drivers/media/video/adv7170.c index 38b508cff4d24..2acd2c1975277 100644 --- a/drivers/media/video/adv7170.c +++ b/drivers/media/video/adv7170.c @@ -442,6 +442,7 @@ adv7170_detect_client (struct i2c_adapter *adapter, dname = adv7171_name; } else { /* We should never get here!!! */ + kfree(client); return 0; } snprintf(I2C_NAME(client), sizeof(I2C_NAME(client)) - 1, @@ -449,6 +450,7 @@ adv7170_detect_client (struct i2c_adapter *adapter, encoder = kmalloc(sizeof(struct adv7170), GFP_KERNEL); if (encoder == NULL) { + kfree(client); return -ENOMEM; } memset(encoder, 0, sizeof(struct adv7170)); diff --git a/drivers/media/video/adv7175.c b/drivers/media/video/adv7175.c index 51a0c9b711dd9..81aa37224c75c 100644 --- a/drivers/media/video/adv7175.c +++ b/drivers/media/video/adv7175.c @@ -463,6 +463,7 @@ adv7175_detect_client (struct i2c_adapter *adapter, dname = adv7176_name; } else { /* We should never get here!!! */ + kfree(client); return 0; } snprintf(I2C_NAME(client), sizeof(I2C_NAME(client)) - 1, @@ -470,6 +471,7 @@ adv7175_detect_client (struct i2c_adapter *adapter, encoder = kmalloc(sizeof(struct adv7175), GFP_KERNEL); if (encoder == NULL) { + kfree(client); return -ENOMEM; } memset(encoder, 0, sizeof(struct adv7175)); diff --git a/drivers/media/video/bt856.c b/drivers/media/video/bt856.c index f3a71267ba8f6..1aa9fcfe196fe 100644 --- a/drivers/media/video/bt856.c +++ b/drivers/media/video/bt856.c @@ -341,6 +341,7 @@ bt856_detect_client (struct i2c_adapter *adapter, encoder = kmalloc(sizeof(struct bt856), GFP_KERNEL); if (encoder == NULL) { + kfree(client); return -ENOMEM; } memset(encoder, 0, sizeof(struct bt856)); diff --git a/drivers/media/video/saa7114.c b/drivers/media/video/saa7114.c index 7f0c1f1e2075e..3c4f271dc5b19 100644 --- a/drivers/media/video/saa7114.c +++ b/drivers/media/video/saa7114.c @@ -995,6 +995,8 @@ saa7114_detect_client (struct i2c_adapter *adapter, KERN_ERR "%s_attach: init error %d at stage %d, leaving attach.\n", I2C_NAME(client), i, err[i]); + kfree(decoder); + kfree(client); return 0; } } @@ -1022,6 +1024,8 @@ saa7114_detect_client (struct i2c_adapter *adapter, KERN_ERR "%s_attach: init error %d at stage %d, leaving attach.\n", I2C_NAME(client), i, err[i]); + kfree(decoder); + kfree(client); return 0; } } @@ -1068,6 +1072,8 @@ saa7114_detect_client (struct i2c_adapter *adapter, KERN_ERR "%s_attach: init error %d at stage %d, leaving attach.\n", I2C_NAME(client), i, err[i]); + kfree(decoder); + kfree(client); return 0; } } @@ -1107,6 +1113,8 @@ saa7114_detect_client (struct i2c_adapter *adapter, KERN_ERR "%s_attach: init error %d at stage %d, leaving attach.\n", I2C_NAME(client), i, err[i]); + kfree(decoder); + kfree(client); return 0; } } @@ -1127,6 +1135,8 @@ saa7114_detect_client (struct i2c_adapter *adapter, KERN_ERR "%s_attach: init error %d at stage %d, leaving attach.\n", I2C_NAME(client), i, err[i]); + kfree(decoder); + kfree(client); return 0; } } diff --git a/drivers/media/video/saa7185.c b/drivers/media/video/saa7185.c index f7e4a47b0e531..628b425c872fb 100644 --- a/drivers/media/video/saa7185.c +++ b/drivers/media/video/saa7185.c @@ -434,6 +434,7 @@ saa7185_detect_client (struct i2c_adapter *adapter, encoder = kmalloc(sizeof(struct saa7185), GFP_KERNEL); if (encoder == NULL) { + kfree(client); return -ENOMEM; } memset(encoder, 0, sizeof(struct saa7185)); -- 2.53.0