switch: fix some memory leaks in switch_parse_vlan()
SVN-Revision: 29936
This commit is contained in:
		| @@ -341,6 +341,7 @@ static int handle_vlan_port_write(void *driver, char *buf, int nr) | |||||||
| 	} | 	} | ||||||
| 	adm_wreg(0x13 + nr, (__u16) ports); | 	adm_wreg(0x13 + nr, (__u16) ports); | ||||||
|  |  | ||||||
|  | 	kfree(c); | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -341,10 +341,9 @@ switch_vlan_config *switch_parse_vlan(switch_driver *driver, char *buf) | |||||||
| 	switch_vlan_config *c; | 	switch_vlan_config *c; | ||||||
| 	int j, u, p, s; | 	int j, u, p, s; | ||||||
|  |  | ||||||
| 	c = kmalloc(sizeof(switch_vlan_config), GFP_KERNEL); | 	c = kzalloc(sizeof(switch_vlan_config), GFP_KERNEL); | ||||||
| 	if (!c) | 	if (!c) | ||||||
| 		return NULL; | 		return NULL; | ||||||
| 	memset(c, 0, sizeof(switch_vlan_config)); |  | ||||||
|  |  | ||||||
| 	while (isspace(*buf)) buf++; | 	while (isspace(*buf)) buf++; | ||||||
| 	j = 0; | 	j = 0; | ||||||
| @@ -382,7 +381,10 @@ switch_vlan_config *switch_parse_vlan(switch_driver *driver, char *buf) | |||||||
|  |  | ||||||
| 		while (isspace(*buf)) buf++; | 		while (isspace(*buf)) buf++; | ||||||
| 	} | 	} | ||||||
| 	if (*buf != 0) return NULL; | 	if (*buf != 0) { | ||||||
|  | 		kfree(c); | ||||||
|  | 		return NULL; | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	c->port &= (1 << driver->ports) - 1; | 	c->port &= (1 << driver->ports) - 1; | ||||||
| 	c->untag &= (1 << driver->ports) - 1; | 	c->untag &= (1 << driver->ports) - 1; | ||||||
|   | |||||||
| @@ -459,6 +459,7 @@ static int handle_vlan_port_write(void *driver, char *buf, int nr) | |||||||
| 		robo_write32(ROBO_ARLIO_PAGE, 0x63 + regoff, (c->untag << 9) | c->port); | 		robo_write32(ROBO_ARLIO_PAGE, 0x63 + regoff, (c->untag << 9) | c->port); | ||||||
| 		robo_write16(ROBO_ARLIO_PAGE, 0x61 + regoff, nr); | 		robo_write16(ROBO_ARLIO_PAGE, 0x61 + regoff, nr); | ||||||
| 		robo_write16(ROBO_ARLIO_PAGE, 0x60 + regoff, 1 << 7); | 		robo_write16(ROBO_ARLIO_PAGE, 0x60 + regoff, 1 << 7); | ||||||
|  | 		kfree(c); | ||||||
| 		return 0; | 		return 0; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| @@ -473,6 +474,7 @@ static int handle_vlan_port_write(void *driver, char *buf, int nr) | |||||||
| 		robo_write16(ROBO_VLAN_PAGE, ROBO_VLAN_TABLE_ACCESS, val16); | 		robo_write16(ROBO_VLAN_PAGE, ROBO_VLAN_TABLE_ACCESS, val16); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	kfree(c); | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -520,13 +522,9 @@ static int handle_enable_vlan_write(void *driver, char *buf, int nr) | |||||||
| static int handle_reset(void *driver, char *buf, int nr) | static int handle_reset(void *driver, char *buf, int nr) | ||||||
| { | { | ||||||
| 	switch_driver *d = (switch_driver *) driver; | 	switch_driver *d = (switch_driver *) driver; | ||||||
| 	switch_vlan_config *c = switch_parse_vlan(d, buf); |  | ||||||
| 	int j; | 	int j; | ||||||
| 	__u16 val16; | 	__u16 val16; | ||||||
|  |  | ||||||
| 	if (c == NULL) |  | ||||||
| 		return -EINVAL; |  | ||||||
|  |  | ||||||
| 	/* disable switching */ | 	/* disable switching */ | ||||||
| 	set_switch(0); | 	set_switch(0); | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Hauke Mehrtens
					Hauke Mehrtens