We may use hex2bin() instead of custom approach.

Signed-off-by: Andy Shevchenko <[email protected]>
---
 This is blast from the past (2011). Instead of dirty looking bitwise
 types here, though __be16 would be correct, I decide to go with
 an array of two u8 items.

 This patch relies on
 http://marc.info/?l=linux-kernel&m=150150935411183&w=2 being applied,
 which is currently not.

 fs/fat/namei_vfat.c | 35 ++++++++++-------------------------
 1 file changed, 10 insertions(+), 25 deletions(-)

diff --git a/fs/fat/namei_vfat.c b/fs/fat/namei_vfat.c
index 6a7152d0c250..56127f76c41f 100644
--- a/fs/fat/namei_vfat.c
+++ b/fs/fat/namei_vfat.c
@@ -17,6 +17,7 @@
 
 #include <linux/module.h>
 #include <linux/ctype.h>
+#include <linux/kernel.h>
 #include <linux/slab.h>
 #include <linux/namei.h>
 #include "fat.h"
@@ -510,11 +511,10 @@ xlate_to_uni(const unsigned char *name, int len, unsigned 
char *outname,
             struct nls_table *nls)
 {
        const unsigned char *ip;
-       unsigned char nc;
        unsigned char *op;
-       unsigned int ec;
-       int i, k, fill;
+       int i, fill;
        int charlen;
+       u8 hc[2];
 
        if (utf8) {
                *outlen = utf8s_to_utf16s(name, len, UTF16_HOST_ENDIAN,
@@ -532,31 +532,16 @@ xlate_to_uni(const unsigned char *name, int len, unsigned 
char *outname,
                        if (escape && (*ip == ':')) {
                                if (i > len - 5)
                                        return -EINVAL;
-                               ec = 0;
-                               for (k = 1; k < 5; k++) {
-                                       nc = ip[k];
-                                       ec <<= 4;
-                                       if (nc >= '0' && nc <= '9') {
-                                               ec |= nc - '0';
-                                               continue;
-                                       }
-                                       if (nc >= 'a' && nc <= 'f') {
-                                               ec |= nc - ('a' - 10);
-                                               continue;
-                                       }
-                                       if (nc >= 'A' && nc <= 'F') {
-                                               ec |= nc - ('A' - 10);
-                                               continue;
-                                       }
-                                       return -EINVAL;
-                               }
-                               *op++ = ec & 0xFF;
-                               *op++ = ec >> 8;
+
+                               fill = hex2bin(hc, ip + 1, 2);
+                               if (fill)
+                                       return fill;
+                               *op++ = hc[1];
+                               *op++ = hc[0];
                                ip += 5;
                                i += 5;
                        } else {
-                               charlen = nls->char2uni(ip, len - i,
-                                                                       
(wchar_t *)op);
+                               charlen = nls->char2uni(ip, len - i, (wchar_t 
*)op);
                                if (charlen < 0)
                                        return -EINVAL;
                                ip += charlen;
-- 
2.13.2

Reply via email to