Skip to contentSkip to conversation

fix unsafe usage of list_for_each in i2c-core

PATCH In review Andreas Schultz 2 participants 2 messages Jun 5, 2003 I2C

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 fix unsafe usage of list_for_each in i2c-core

Hi,

i2c-core.c contains 2 loops that iterate over the list of the clients attached to an adapter and detaches them. Detaching the clients will actually remove them from the list the loop is iterating over. Therefore the list_for_each_safe() method has to be used.

Andreas

===== i2c-core.c 1.38 vs edited =====

i2c-core.c renamed from drivers/i2c/i2c-core.c +4 -5
@@ -124,7 +125,7 @@
 
 int i2c_del_adapter(struct i2c_adapter *adap)
 {
-	struct list_head  *item;
+	struct list_head  *item, *_n;
 	struct i2c_driver *driver;
 	struct i2c_client *client;
 	int res = 0;
@@ -144,7 +145,7 @@
 
 	/* detach any active clients. This must be done first, because
 	 * it can fail; in which case we give upp. */
-	list_for_each(item,&adap->clients) {
+	list_for_each_safe(item, _n, &adap->clients) {
 		client = list_entry(item, struct i2c_client, list);
 
 		/* detaching devices is unconditional of the set notify
@@ -215,8 +216,7 @@
 
 int i2c_del_driver(struct i2c_driver *driver)
 {
-	struct list_head   *item1;
-	struct list_head   *item2;
+	struct list_head   *item1, *item2, *_n;
 	struct i2c_client  *client;
 	struct i2c_adapter *adap;
 	
@@ -245,7 +245,7 @@
 				goto out_unlock;
 			}
 		} else {
-			list_for_each(item2,&adap->clients) {
+			list_for_each_safe(item2, _n, &adap->clients) {
 				client = list_entry(item2, struct i2c_client, list);
 				if (client->driver != driver)
 					continue;
#1 lore raw
Quoted 6 lines · Andreas Schultz

Hi,

i2c-core.c contains 2 loops that iterate over the list of the clients attached to an adapter and detaches them. Detaching the clients will actually remove them from the list the loop is iterating over. Therefore the list_for_each_safe() method has to be used.

Ah, nice catch. Applied, thanks.

I'm guessing this fixes your other i2c problems you were having?

thanks,

greg k-h