Message ID | 1310977597-9666-1-git-send-email-andriy.shevchenko@linux.intel.com |
---|---|
State | Accepted, archived |
Delegated to: | David Miller |
Headers | show |
Andy Shevchenko wrote: > for (i = 0, dlc_pos++; i < cf.can_dlc; i++) { > - > - tmp = asc2nibble(sl->rbuff[dlc_pos++]); > - if (tmp > 0x0F) > + tmp = hex_to_bin(sl->rbuff[dlc_pos++]); > + if (tmp < 0) > return; > cf.data[i] = (tmp << 4); > - tmp = asc2nibble(sl->rbuff[dlc_pos++]); > - if (tmp > 0x0F) > + tmp = hex_to_bin(sl->rbuff[dlc_pos++]); > + if (tmp < 0) > return; > cf.data[i] |= tmp; > } What about changing void hex2bin(u8 *dst, const char *src, size_t count) to bool hex2bin(u8 *dst, const char *src, size_t count) in order to do error checks like bool hex2bin_with_validation(u8 *dst, const char *src, size_t count) { while (count--) { int c = hex_to_bin(*src++); int d; if (c < 0) return false; d = hex_to_bin(*src++) if (d < 0) return false; *dst++ = (c << 4) | d; } return true; } and use hex2bin() rather than hex_to_bin()? -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Mon, 2011-07-18 at 20:41 +0900, Tetsuo Handa wrote: > Andy Shevchenko wrote: > > for (i = 0, dlc_pos++; i < cf.can_dlc; i++) { > > - > > - tmp = asc2nibble(sl->rbuff[dlc_pos++]); > > - if (tmp > 0x0F) > > + tmp = hex_to_bin(sl->rbuff[dlc_pos++]); > > + if (tmp < 0) > > return; > > cf.data[i] = (tmp << 4); > > - tmp = asc2nibble(sl->rbuff[dlc_pos++]); > > - if (tmp > 0x0F) > > + tmp = hex_to_bin(sl->rbuff[dlc_pos++]); > > + if (tmp < 0) > > return; > > cf.data[i] |= tmp; > > } > > What about changing > > void hex2bin(u8 *dst, const char *src, size_t count) > > to > > bool hex2bin(u8 *dst, const char *src, size_t count) > > in order to do error checks like > > bool hex2bin_with_validation(u8 *dst, const char *src, size_t count) > { > while (count--) { > int c = hex_to_bin(*src++); > int d; > if (c < 0) > return false; > d = hex_to_bin(*src++) > if (d < 0) > return false; > *dst++ = (c << 4) | d; > } > return true; > } > > and use hex2bin() rather than hex_to_bin()? Perhaps, good idea. Could you submit a patch?
On 18.07.2011 10:26, Andy Shevchenko wrote: > Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com> > Cc: Wolfgang Grandegger <wg@grandegger.com> Acked-by: Oliver Hartkopp <socketcan@hartkopp.net> > --- > drivers/net/can/slcan.c | 26 +++++--------------------- > 1 files changed, 5 insertions(+), 21 deletions(-) > > diff --git a/drivers/net/can/slcan.c b/drivers/net/can/slcan.c > index aa8ad73..65e54fd 100644 > --- a/drivers/net/can/slcan.c > +++ b/drivers/net/can/slcan.c > @@ -56,6 +56,7 @@ > #include <linux/sched.h> > #include <linux/delay.h> > #include <linux/init.h> > +#include <linux/kernel.h> > #include <linux/can.h> > > static __initdata const char banner[] = > @@ -142,21 +143,6 @@ static struct net_device **slcan_devs; > * STANDARD SLCAN DECAPSULATION * > ************************************************************************/ > > -static int asc2nibble(char c) > -{ > - > - if ((c >= '0') && (c <= '9')) > - return c - '0'; > - > - if ((c >= 'A') && (c <= 'F')) > - return c - 'A' + 10; > - > - if ((c >= 'a') && (c <= 'f')) > - return c - 'a' + 10; > - > - return 16; /* error */ > -} > - > /* Send one completely decapsulated can_frame to the network layer */ > static void slc_bump(struct slcan *sl) > { > @@ -195,18 +181,16 @@ static void slc_bump(struct slcan *sl) > *(u64 *) (&cf.data) = 0; /* clear payload */ > > for (i = 0, dlc_pos++; i < cf.can_dlc; i++) { > - > - tmp = asc2nibble(sl->rbuff[dlc_pos++]); > - if (tmp > 0x0F) > + tmp = hex_to_bin(sl->rbuff[dlc_pos++]); > + if (tmp < 0) > return; > cf.data[i] = (tmp << 4); > - tmp = asc2nibble(sl->rbuff[dlc_pos++]); > - if (tmp > 0x0F) > + tmp = hex_to_bin(sl->rbuff[dlc_pos++]); > + if (tmp < 0) > return; > cf.data[i] |= tmp; > } > > - > skb = dev_alloc_skb(sizeof(struct can_frame)); > if (!skb) > return; -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
From: Oliver Hartkopp <socketcan@hartkopp.net> Date: Mon, 18 Jul 2011 16:02:49 +0200 > On 18.07.2011 10:26, Andy Shevchenko wrote: >> Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com> >> Cc: Wolfgang Grandegger <wg@grandegger.com> > > Acked-by: Oliver Hartkopp <socketcan@hartkopp.net> Applied. -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/drivers/net/can/slcan.c b/drivers/net/can/slcan.c index aa8ad73..65e54fd 100644 --- a/drivers/net/can/slcan.c +++ b/drivers/net/can/slcan.c @@ -56,6 +56,7 @@ #include <linux/sched.h> #include <linux/delay.h> #include <linux/init.h> +#include <linux/kernel.h> #include <linux/can.h> static __initdata const char banner[] = @@ -142,21 +143,6 @@ static struct net_device **slcan_devs; * STANDARD SLCAN DECAPSULATION * ************************************************************************/ -static int asc2nibble(char c) -{ - - if ((c >= '0') && (c <= '9')) - return c - '0'; - - if ((c >= 'A') && (c <= 'F')) - return c - 'A' + 10; - - if ((c >= 'a') && (c <= 'f')) - return c - 'a' + 10; - - return 16; /* error */ -} - /* Send one completely decapsulated can_frame to the network layer */ static void slc_bump(struct slcan *sl) { @@ -195,18 +181,16 @@ static void slc_bump(struct slcan *sl) *(u64 *) (&cf.data) = 0; /* clear payload */ for (i = 0, dlc_pos++; i < cf.can_dlc; i++) { - - tmp = asc2nibble(sl->rbuff[dlc_pos++]); - if (tmp > 0x0F) + tmp = hex_to_bin(sl->rbuff[dlc_pos++]); + if (tmp < 0) return; cf.data[i] = (tmp << 4); - tmp = asc2nibble(sl->rbuff[dlc_pos++]); - if (tmp > 0x0F) + tmp = hex_to_bin(sl->rbuff[dlc_pos++]); + if (tmp < 0) return; cf.data[i] |= tmp; } - skb = dev_alloc_skb(sizeof(struct can_frame)); if (!skb) return;
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com> Cc: Wolfgang Grandegger <wg@grandegger.com> --- drivers/net/can/slcan.c | 26 +++++--------------------- 1 files changed, 5 insertions(+), 21 deletions(-)