Commit 24e25979 authored by Alexander Viro's avatar Alexander Viro Committed by Linus Torvalds

[PATCH] mpoa patch done right

 - conversion to seq_file, overflow fixes
 - qos_parse sanitized (3 sscanf calls instead of insane manual parsing)
	leaks plugged
	code cleaned up

We still have serious races, but they are general problem in atm code - it
has no locking whatsoever for any of the lists (mpcs, qos_head, per-client
lists).
parent dc4d629f
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
#include <linux/timer.h> #include <linux/timer.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/bitops.h> #include <linux/bitops.h>
#include <linux/seq_file.h>
/* We are an ethernet device */ /* We are an ethernet device */
#include <linux/if_ether.h> #include <linux/if_ether.h>
...@@ -224,29 +225,27 @@ int atm_mpoa_delete_qos(struct atm_mpoa_qos *entry) ...@@ -224,29 +225,27 @@ int atm_mpoa_delete_qos(struct atm_mpoa_qos *entry)
return 0; return 0;
} }
void atm_mpoa_disp_qos(char *page, ssize_t *len) /* this is buggered - we need locking for qos_head */
void atm_mpoa_disp_qos(struct seq_file *m)
{ {
unsigned char *ip; unsigned char *ip;
char ipaddr[16]; char ipaddr[16];
struct atm_mpoa_qos *qos; struct atm_mpoa_qos *qos;
qos = qos_head; qos = qos_head;
*len += sprintf(page + *len, "QoS entries for shortcuts:\n"); seq_printf(m, "QoS entries for shortcuts:\n");
*len += sprintf(page + *len, "IP address\n TX:max_pcr pcr min_pcr max_cdv max_sdu\n RX:max_pcr pcr min_pcr max_cdv max_sdu\n"); seq_printf(m, "IP address\n TX:max_pcr pcr min_pcr max_cdv max_sdu\n RX:max_pcr pcr min_pcr max_cdv max_sdu\n");
ipaddr[sizeof(ipaddr)-1] = '\0'; ipaddr[sizeof(ipaddr)-1] = '\0';
while (qos != NULL) { while (qos != NULL) {
ip = (unsigned char *)&qos->ipaddr; ip = (unsigned char *)&qos->ipaddr;
sprintf(ipaddr, "%u.%u.%u.%u", NIPQUAD(ip)); sprintf(ipaddr, "%u.%u.%u.%u", NIPQUAD(ip));
*len += sprintf(page + *len, "%u.%u.%u.%u\n %-7d %-7d %-7d %-7d %-7d\n %-7d %-7d %-7d %-7d %-7d\n", seq_printf(m, "%u.%u.%u.%u\n %-7d %-7d %-7d %-7d %-7d\n %-7d %-7d %-7d %-7d %-7d\n",
NIPQUAD(ipaddr), NIPQUAD(ipaddr),
qos->qos.txtp.max_pcr, qos->qos.txtp.pcr, qos->qos.txtp.min_pcr, qos->qos.txtp.max_cdv, qos->qos.txtp.max_sdu, qos->qos.txtp.max_pcr, qos->qos.txtp.pcr, qos->qos.txtp.min_pcr, qos->qos.txtp.max_cdv, qos->qos.txtp.max_sdu,
qos->qos.rxtp.max_pcr, qos->qos.rxtp.pcr, qos->qos.rxtp.min_pcr, qos->qos.rxtp.max_cdv, qos->qos.rxtp.max_sdu); qos->qos.rxtp.max_pcr, qos->qos.rxtp.pcr, qos->qos.rxtp.min_pcr, qos->qos.rxtp.max_cdv, qos->qos.rxtp.max_sdu);
qos = qos->next; qos = qos->next;
} }
return;
} }
static struct net_device *find_lec_by_itfnum(int itf) static struct net_device *find_lec_by_itfnum(int itf)
......
...@@ -51,6 +51,7 @@ struct atm_mpoa_qos *atm_mpoa_search_qos(uint32_t dst_ip); ...@@ -51,6 +51,7 @@ struct atm_mpoa_qos *atm_mpoa_search_qos(uint32_t dst_ip);
int atm_mpoa_delete_qos(struct atm_mpoa_qos *qos); int atm_mpoa_delete_qos(struct atm_mpoa_qos *qos);
/* Display QoS entries. This is for the procfs */ /* Display QoS entries. This is for the procfs */
void atm_mpoa_disp_qos(char *page, ssize_t *len); struct seq_file;
void atm_mpoa_disp_qos(struct seq_file *m);
#endif /* _MPC_H_ */ #endif /* _MPC_H_ */
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment