X-Git-Url: https://git.decadent.org.uk/gitweb/?p=nfs-utils.git;a=blobdiff_plain;f=utils%2Fidmapd%2Fidmapd.c;h=9d66225e01d7642aa40223bbacccc0a4a31c8292;hp=9ecab66f2696adec7cb7e82ebb8cac95146b8b37;hb=96892b29a50af1055bfc3ca74930e9782ead6c71;hpb=14e6ec262e58e962c2d7e9161ca9c56529de3170 diff --git a/utils/idmapd/idmapd.c b/utils/idmapd/idmapd.c index 9ecab66..9d66225 100644 --- a/utils/idmapd/idmapd.c +++ b/utils/idmapd/idmapd.c @@ -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;