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 -puN drivers/media/video/adv7170.c~zoran-memleak-fixes drivers/media/video/adv7170.c --- 25/drivers/media/video/adv7170.c~zoran-memleak-fixes 2003-08-24 02:07:54.000000000 -0700 +++ 25-akpm/drivers/media/video/adv7170.c 2003-08-24 02:07:54.000000000 -0700 @@ -442,6 +442,7 @@ adv7170_detect_client (struct i2c_adapte 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_adapte encoder = kmalloc(sizeof(struct adv7170), GFP_KERNEL); if (encoder == NULL) { + kfree(client); return -ENOMEM; } memset(encoder, 0, sizeof(struct adv7170)); diff -puN drivers/media/video/adv7175.c~zoran-memleak-fixes drivers/media/video/adv7175.c --- 25/drivers/media/video/adv7175.c~zoran-memleak-fixes 2003-08-24 02:07:54.000000000 -0700 +++ 25-akpm/drivers/media/video/adv7175.c 2003-08-24 02:07:54.000000000 -0700 @@ -463,6 +463,7 @@ adv7175_detect_client (struct i2c_adapte 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_adapte encoder = kmalloc(sizeof(struct adv7175), GFP_KERNEL); if (encoder == NULL) { + kfree(client); return -ENOMEM; } memset(encoder, 0, sizeof(struct adv7175)); diff -puN drivers/media/video/bt856.c~zoran-memleak-fixes drivers/media/video/bt856.c --- 25/drivers/media/video/bt856.c~zoran-memleak-fixes 2003-08-24 02:07:54.000000000 -0700 +++ 25-akpm/drivers/media/video/bt856.c 2003-08-24 02:07:54.000000000 -0700 @@ -341,6 +341,7 @@ bt856_detect_client (struct i2c_adapter encoder = kmalloc(sizeof(struct bt856), GFP_KERNEL); if (encoder == NULL) { + kfree(client); return -ENOMEM; } memset(encoder, 0, sizeof(struct bt856)); diff -puN drivers/media/video/saa7114.c~zoran-memleak-fixes drivers/media/video/saa7114.c --- 25/drivers/media/video/saa7114.c~zoran-memleak-fixes 2003-08-24 02:07:54.000000000 -0700 +++ 25-akpm/drivers/media/video/saa7114.c 2003-08-24 02:07:54.000000000 -0700 @@ -995,6 +995,8 @@ saa7114_detect_client (struct i2c_adapte 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_adapte 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_adapte 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_adapte 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_adapte 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 -puN drivers/media/video/saa7185.c~zoran-memleak-fixes drivers/media/video/saa7185.c --- 25/drivers/media/video/saa7185.c~zoran-memleak-fixes 2003-08-24 02:07:54.000000000 -0700 +++ 25-akpm/drivers/media/video/saa7185.c 2003-08-24 02:07:54.000000000 -0700 @@ -434,6 +434,7 @@ saa7185_detect_client (struct i2c_adapte encoder = kmalloc(sizeof(struct saa7185), GFP_KERNEL); if (encoder == NULL) { + kfree(client); return -ENOMEM; } memset(encoder, 0, sizeof(struct saa7185)); _