]> 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 9ecab66f2696adec7cb7e82ebb8cac95146b8b37..9d66225e01d7642aa40223bbacccc0a4a31c8292 100644 (file)
@@ -119,8 +119,8 @@ struct idmap_client {
 static struct idmap_client nfsd_ic[2] = {
 {
        .ic_which = IC_IDNAME, 
-       .ic_clid = "Server", 
-       .ic_id = "", 
+       .ic_clid = "", 
+       .ic_id = "Server", 
        .ic_path = IC_IDNAME_CHAN, 
        .ic_fd = -1, 
        .ic_dirfd = -1, 
@@ -128,8 +128,8 @@ static struct idmap_client nfsd_ic[2] = {
 },
 {
        .ic_which = IC_NAMEID, 
-       .ic_clid = "Server", 
-       .ic_id = "", 
+       .ic_clid = "", 
+       .ic_id = "Server", 
        .ic_path = IC_NAMEID_CHAN, 
        .ic_fd = -1, 
        .ic_dirfd = -1, 
@@ -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);
 
@@ -158,10 +157,6 @@ static int nfsdopenone(struct idmap_client *);
 static void nfsdreopen_one(struct idmap_client *);
 static void nfsdreopen(void);
 
-size_t  strlcat(char *, const char *, size_t);
-size_t  strlcpy(char *, const char *, size_t);
-ssize_t atomicio(ssize_t (*f) (int, void*, size_t),
-                int, void *, size_t);
 void    mydaemon(int, int);
 void    release_parent(void);
 
@@ -646,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);
@@ -656,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\"",
@@ -782,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);
        }
@@ -858,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)
 {
@@ -929,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;