2011-09-23 10:48:11

by Andy Shevchenko

[permalink] [raw]
Subject: [PATCH 2/2] wireless: at76c50x: use native hex_pack_byte() method

Signed-off-by: Andy Shevchenko <[email protected]>
Cc: "John W. Linville" <[email protected]>
Cc: [email protected]
Cc: [email protected]
---
drivers/net/wireless/at76c50x-usb.c | 5 +----
1 files changed, 1 insertions(+), 4 deletions(-)

diff --git a/drivers/net/wireless/at76c50x-usb.c b/drivers/net/wireless/at76c50x-usb.c
index 2986014..157507a6 100644
--- a/drivers/net/wireless/at76c50x-usb.c
+++ b/drivers/net/wireless/at76c50x-usb.c
@@ -500,7 +500,6 @@ exit:

#define HEX2STR_BUFFERS 4
#define HEX2STR_MAX_LEN 64
-#define BIN2HEX(x) ((x) < 10 ? '0' + (x) : (x) + 'A' - 10)

/* Convert binary data into hex string */
static char *hex2str(void *buf, int len)
@@ -520,10 +519,8 @@ static char *hex2str(void *buf, int len)
}

while (len--) {
- *obuf++ = BIN2HEX(*ibuf >> 4);
- *obuf++ = BIN2HEX(*ibuf & 0xf);
+ obuf = hex_pack_byte(obuf, *ibuf++);
*obuf++ = '-';
- ibuf++;
}
*(--obuf) = '\0';

--
1.7.6.3



2011-09-28 08:11:46

by Andy Shevchenko

[permalink] [raw]
Subject: Re: [PATCHv2.1] wireless: at76c50x: use native hex_pack_byte() method

On Tue, 2011-09-27 at 15:47 -0400, Pavel Roskin wrote:
> On Tue, 27 Sep 2011 15:01:49 +0300
> Andy Shevchenko <[email protected]> wrote:
>
> > Signed-off-by: Andy Shevchenko <[email protected]>
> > Cc: "John W. Linville" <[email protected]>
> > Cc: [email protected]
> > Cc: [email protected]
> > ---
> > drivers/net/wireless/at76c50x-usb.c | 18 +++++++-----------
> > 1 files changed, 7 insertions(+), 11 deletions(-)
> >
> > diff --git a/drivers/net/wireless/at76c50x-usb.c
>
> ...
>
> > b/drivers/net/wireless/at76c50x-usb.c index 2986014..2dde5f6 100644
> > - *obuf++ = BIN2HEX(*ibuf >> 4);
> > - *obuf++ = BIN2HEX(*ibuf & 0xf);
> > + obuf = pack_hex_byte(obuf, *ibuf++);
> > *obuf++ = '-';
> > - ibuf++;
> > }
> > - *(--obuf) = '\0';
> > +
> > + if (*obuf == '-')
> > + obuf--;
>
> This will access uninitialized data and fail to strip the final "-" in
> most cases. The check for len being 0 was there for a reason. Please
> actually test your code.
In case of len == 0 we have either '\0' or hex digit in the first byte
of the array. Otherwise it's a mess in the memory which should not be
happened.

>
> NACK

>
> By the way, I don't think it's necessary to copy linux-kernel and
> netdev about a change affecting just a wireless driver.
>

--
Andy Shevchenko <[email protected]>
Intel Finland Oy

2011-09-27 19:47:50

by Pavel Roskin

[permalink] [raw]
Subject: Re: [PATCHv2.1] wireless: at76c50x: use native hex_pack_byte() method

On Tue, 27 Sep 2011 15:01:49 +0300
Andy Shevchenko <[email protected]> wrote:

> Signed-off-by: Andy Shevchenko <[email protected]>
> Cc: "John W. Linville" <[email protected]>
> Cc: [email protected]
> Cc: [email protected]
> ---
> drivers/net/wireless/at76c50x-usb.c | 18 +++++++-----------
> 1 files changed, 7 insertions(+), 11 deletions(-)
>
> diff --git a/drivers/net/wireless/at76c50x-usb.c

...

> b/drivers/net/wireless/at76c50x-usb.c index 2986014..2dde5f6 100644
> - *obuf++ = BIN2HEX(*ibuf >> 4);
> - *obuf++ = BIN2HEX(*ibuf & 0xf);
> + obuf = pack_hex_byte(obuf, *ibuf++);
> *obuf++ = '-';
> - ibuf++;
> }
> - *(--obuf) = '\0';
> +
> + if (*obuf == '-')
> + obuf--;

This will access uninitialized data and fail to strip the final "-" in
most cases. The check for len being 0 was there for a reason. Please
actually test your code.

NACK

By the way, I don't think it's necessary to copy linux-kernel and
netdev about a change affecting just a wireless driver.

--
Regards,
Pavel Roskin

2011-09-28 20:41:11

by Pavel Roskin

[permalink] [raw]
Subject: Re: [PATCHv3] wireless: at76c50x: use native hex_pack_byte() method

On Wed, 28 Sep 2011 12:30:59 +0300
Andy Shevchenko <[email protected]> wrote:

> Signed-off-by: Andy Shevchenko <[email protected]>
> Cc: "John W. Linville" <[email protected]>

Tested-by: Pavel Roskin <[email protected]>

> ---
> drivers/net/wireless/at76c50x-usb.c | 18 ++++++++----------
> 1 files changed, 8 insertions(+), 10 deletions(-)
>
> diff --git a/drivers/net/wireless/at76c50x-usb.c
> b/drivers/net/wireless/at76c50x-usb.c index 2986014..39322d4 100644
> --- a/drivers/net/wireless/at76c50x-usb.c
> +++ b/drivers/net/wireless/at76c50x-usb.c
> @@ -500,10 +500,9 @@ exit:
>
> #define HEX2STR_BUFFERS 4
> #define HEX2STR_MAX_LEN 64
> -#define BIN2HEX(x) ((x) < 10 ? '0' + (x) : (x) + 'A' - 10)
>
> /* Convert binary data into hex string */
> -static char *hex2str(void *buf, int len)
> +static char *hex2str(void *buf, size_t len)
> {
> static atomic_t a = ATOMIC_INIT(0);
> static char bufs[HEX2STR_BUFFERS][3 * HEX2STR_MAX_LEN + 1];
> @@ -514,18 +513,17 @@ static char *hex2str(void *buf, int len)
> if (len > HEX2STR_MAX_LEN)
> len = HEX2STR_MAX_LEN;
>
> - if (len <= 0) {
> - ret[0] = '\0';
> - return ret;
> - }
> + if (len == 0)
> + goto exit;
>
> while (len--) {
> - *obuf++ = BIN2HEX(*ibuf >> 4);
> - *obuf++ = BIN2HEX(*ibuf & 0xf);
> + obuf = pack_hex_byte(obuf, *ibuf++);
> *obuf++ = '-';
> - ibuf++;
> }
> - *(--obuf) = '\0';
> + obuf--;
> +
> +exit:
> + *obuf = '\0';
>
> return ret;
> }



--
Regards,
Pavel Roskin

2011-09-28 09:31:30

by Andy Shevchenko

[permalink] [raw]
Subject: [PATCHv3] wireless: at76c50x: use native hex_pack_byte() method

Signed-off-by: Andy Shevchenko <[email protected]>
Cc: "John W. Linville" <[email protected]>
---
drivers/net/wireless/at76c50x-usb.c | 18 ++++++++----------
1 files changed, 8 insertions(+), 10 deletions(-)

diff --git a/drivers/net/wireless/at76c50x-usb.c b/drivers/net/wireless/at76c50x-usb.c
index 2986014..39322d4 100644
--- a/drivers/net/wireless/at76c50x-usb.c
+++ b/drivers/net/wireless/at76c50x-usb.c
@@ -500,10 +500,9 @@ exit:

#define HEX2STR_BUFFERS 4
#define HEX2STR_MAX_LEN 64
-#define BIN2HEX(x) ((x) < 10 ? '0' + (x) : (x) + 'A' - 10)

/* Convert binary data into hex string */
-static char *hex2str(void *buf, int len)
+static char *hex2str(void *buf, size_t len)
{
static atomic_t a = ATOMIC_INIT(0);
static char bufs[HEX2STR_BUFFERS][3 * HEX2STR_MAX_LEN + 1];
@@ -514,18 +513,17 @@ static char *hex2str(void *buf, int len)
if (len > HEX2STR_MAX_LEN)
len = HEX2STR_MAX_LEN;

- if (len <= 0) {
- ret[0] = '\0';
- return ret;
- }
+ if (len == 0)
+ goto exit;

while (len--) {
- *obuf++ = BIN2HEX(*ibuf >> 4);
- *obuf++ = BIN2HEX(*ibuf & 0xf);
+ obuf = pack_hex_byte(obuf, *ibuf++);
*obuf++ = '-';
- ibuf++;
}
- *(--obuf) = '\0';
+ obuf--;
+
+exit:
+ *obuf = '\0';

return ret;
}
--
1.7.6.3


2011-09-27 11:51:33

by Andy Shevchenko

[permalink] [raw]
Subject: [PATCHv2] wireless: at76c50x: use native hex_pack_byte() method

Signed-off-by: Andy Shevchenko <[email protected]>
Cc: "John W. Linville" <[email protected]>
Cc: [email protected]
Cc: [email protected]
---
drivers/net/wireless/at76c50x-usb.c | 16 ++++++----------
1 files changed, 6 insertions(+), 10 deletions(-)

diff --git a/drivers/net/wireless/at76c50x-usb.c b/drivers/net/wireless/at76c50x-usb.c
index 2986014..96daaad 100644
--- a/drivers/net/wireless/at76c50x-usb.c
+++ b/drivers/net/wireless/at76c50x-usb.c
@@ -500,7 +500,6 @@ exit:

#define HEX2STR_BUFFERS 4
#define HEX2STR_MAX_LEN 64
-#define BIN2HEX(x) ((x) < 10 ? '0' + (x) : (x) + 'A' - 10)

/* Convert binary data into hex string */
static char *hex2str(void *buf, int len)
@@ -514,18 +513,15 @@ static char *hex2str(void *buf, int len)
if (len > HEX2STR_MAX_LEN)
len = HEX2STR_MAX_LEN;

- if (len <= 0) {
- ret[0] = '\0';
- return ret;
- }
-
while (len--) {
- *obuf++ = BIN2HEX(*ibuf >> 4);
- *obuf++ = BIN2HEX(*ibuf & 0xf);
+ obuf = pack_hex_byte(obuf, *ibuf++);
*obuf++ = '-';
- ibuf++;
}
- *(--obuf) = '\0';
+
+ if (*obuf == '-')
+ obuf--;
+
+ *obuf = '\0';

return ret;
}
--
1.7.6.3


2011-09-27 12:02:20

by Andy Shevchenko

[permalink] [raw]
Subject: [PATCHv2.1] wireless: at76c50x: use native hex_pack_byte() method

Signed-off-by: Andy Shevchenko <[email protected]>
Cc: "John W. Linville" <[email protected]>
Cc: [email protected]
Cc: [email protected]
---
drivers/net/wireless/at76c50x-usb.c | 18 +++++++-----------
1 files changed, 7 insertions(+), 11 deletions(-)

diff --git a/drivers/net/wireless/at76c50x-usb.c b/drivers/net/wireless/at76c50x-usb.c
index 2986014..2dde5f6 100644
--- a/drivers/net/wireless/at76c50x-usb.c
+++ b/drivers/net/wireless/at76c50x-usb.c
@@ -500,10 +500,9 @@ exit:

#define HEX2STR_BUFFERS 4
#define HEX2STR_MAX_LEN 64
-#define BIN2HEX(x) ((x) < 10 ? '0' + (x) : (x) + 'A' - 10)

/* Convert binary data into hex string */
-static char *hex2str(void *buf, int len)
+static char *hex2str(void *buf, size_t len)
{
static atomic_t a = ATOMIC_INIT(0);
static char bufs[HEX2STR_BUFFERS][3 * HEX2STR_MAX_LEN + 1];
@@ -514,18 +513,15 @@ static char *hex2str(void *buf, int len)
if (len > HEX2STR_MAX_LEN)
len = HEX2STR_MAX_LEN;

- if (len <= 0) {
- ret[0] = '\0';
- return ret;
- }
-
while (len--) {
- *obuf++ = BIN2HEX(*ibuf >> 4);
- *obuf++ = BIN2HEX(*ibuf & 0xf);
+ obuf = pack_hex_byte(obuf, *ibuf++);
*obuf++ = '-';
- ibuf++;
}
- *(--obuf) = '\0';
+
+ if (*obuf == '-')
+ obuf--;
+
+ *obuf = '\0';

return ret;
}
--
1.7.6.3