Fix hex32_arg parsing for short reads (here 7 hex digits instead of the
expected 8), shift result only on successful input parsing.

- before the patch

        $ echo "mpls 0000123" > /proc/net/pktgen/lo\@0
        $ grep mpls /proc/net/pktgen/lo\@0
             mpls: 00001230
        Result: OK: mpls=00001230

- with patch applied

        $ echo "mpls 0000123" > /proc/net/pktgen/lo\@0
        $ grep mpls /proc/net/pktgen/lo\@0
             mpls: 00000123
        Result: OK: mpls=00000123

Signed-off-by: Peter Seiderer <ps.rep...@gmx.net>
Reviewed-by: Simon Horman <ho...@kernel.org>
---
Changes v3 -> v4
  - add rev-by Simon Horman

Changes v2 -> v3:
  - no changes

Changes v1 -> v2:
  - new patch
---
 net/core/pktgen.c | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/net/core/pktgen.c b/net/core/pktgen.c
index 4f8ec6c9bed4..28dbbf70e142 100644
--- a/net/core/pktgen.c
+++ b/net/core/pktgen.c
@@ -753,14 +753,15 @@ static int hex32_arg(const char __user *user_buffer, 
unsigned long maxlen,
        for (; i < maxlen; i++) {
                int value;
                char c;
-               *num <<= 4;
                if (get_user(c, &user_buffer[i]))
                        return -EFAULT;
                value = hex_to_bin(c);
-               if (value >= 0)
+               if (value >= 0) {
+                       *num <<= 4;
                        *num |= value;
-               else
+               } else {
                        break;
+               }
        }
        return i;
 }
-- 
2.48.1

Reply via email to