From: Ronald Bultje <rbultje@ronald.bitfreak.net>

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));

_