]> git.decadent.org.uk Git - nfs-utils.git/blobdiff - utils/idmapd/idmapd.c
idmapd: allow non-ASCII characters (UTF-8) in NFSv4 domain name
[nfs-utils.git] / utils / idmapd / idmapd.c
index 76a56ef6b58f7a8f0d5efa8c7f2f6350f81e3a14..9d66225e01d7642aa40223bbacccc0a4a31c8292 100644 (file)
@@ -145,7 +145,6 @@ static void svrreopen(int, short, void *);
 static int  nfsopen(struct idmap_client *);
 static void nfscb(int, short, void *);
 static void nfsdcb(int, short, void *);
-static int  validateascii(char *, u_int32_t);
 static int  addfield(char **, ssize_t *, char *);
 static int  getfield(char **, char *, size_t);
 
@@ -642,6 +641,8 @@ out:
 static void
 imconv(struct idmap_client *ic, struct idmap_msg *im)
 {
+       u_int32_t len;
+
        switch (im->im_conv) {
        case IDMAP_CONV_IDTONAME:
                idtonameres(im);
@@ -652,10 +653,10 @@ imconv(struct idmap_client *ic, struct idmap_msg *im)
                            im->im_id, im->im_name);
                break;
        case IDMAP_CONV_NAMETOID:
-               if (validateascii(im->im_name, sizeof(im->im_name)) == -1) {
-                       im->im_status |= IDMAP_STATUS_INVALIDMSG;
+               len = strnlen(im->im_name, IDMAP_NAMESZ - 1);
+               /* Check for NULL termination just to be careful */
+               if (im->im_name[len+1] != '\0')
                        return;
-               }
                nametoidres(im);
                if (verbose > 1)
                        xlog_warn("%s %s: (%s) name \"%s\" -> id \"%d\"",
@@ -778,8 +779,8 @@ nfsopen(struct idmap_client *ic)
        } else {
                event_set(&ic->ic_event, ic->ic_fd, EV_READ, nfscb, ic);
                event_add(&ic->ic_event, NULL);
-               fcntl(ic->ic_dirfd, F_SETSIG, 0);
                fcntl(ic->ic_dirfd, F_NOTIFY, 0);
+               fcntl(ic->ic_dirfd, F_SETSIG, 0);
                if (verbose > 0)
                        xlog_warn("Opened %s", ic->ic_path);
        }
@@ -854,25 +855,6 @@ nametoidres(struct idmap_msg *im)
        }
 }
 
-static int
-validateascii(char *string, u_int32_t len)
-{
-       u_int32_t i;
-
-       for (i = 0; i < len; i++) {
-               if (string[i] == '\0')
-                       break;
-
-               if (string[i] & 0x80)
-                       return (-1);
-       }
-
-       if ((i >= len) || string[i] != '\0')
-               return (-1);
-
-       return (i + 1);
-}
-
 static int
 addfield(char **bpp, ssize_t *bsizp, char *fld)
 {
@@ -925,9 +907,9 @@ getfield(char **bpp, char *fld, size_t fldsz)
                if (*bp == '\\') {
                        if ((n = sscanf(bp, "\\%03o", &val)) != 1)
                                return (-1);
-                       if (val > (char)-1)
+                       if (val > UCHAR_MAX)
                                return (-1);
-                       *fld++ = (char)val;
+                       *fld++ = val;
                        bp += 4;
                } else {
                        *fld++ = *bp;