commit 1c9cd2d03ab1561b7eee831af381eff781fcf41e Author: zoulasc Date: Fri Apr 8 15:29:33 2016 -0400 * Make hasmntval() return an 0 on error, 1 on success and place the value in an argument. Update all users and check properly for errors. Get rid of hasmntvalerr(). * Add hasmntvaldelim() which takes a string delimiter. This is now used to chop vers=4.1 to 4, so that we can parse the version correctly (we don't care about the .1 part yet) --- amd/autil.c | 10 ++---- amd/ops_cdfs.c | 7 ++++ amd/ops_nfs.c | 3 -- amd/ops_pcfs.c | 10 ++++-- amd/ops_ufs.c | 6 +++- amd/srvr_nfs.c | 24 ++++++++++------ hlfsd/hlfsd.c | 3 -- include/am_utils.h | 4 +- libamu/mount_fs.c | 79 ++++++++++++++++++++++++++++++++++++++--------------- libamu/mtab.c | 41 ++++++++------------------- 10 files changed, 109 insertions(+), 78 deletions(-) --- am-utils-6.2.orig/amd/autil.c +++ am-utils-6.2/amd/autil.c @@ -279,7 +279,7 @@ am_mounted(am_node *mp) if (amu_hasmntopt(&mnt, "nounmount") || amu_hasmntopt(&mnt, "noumount")) notimeout = 1; /* utimeout=N option: user wants to unmount this option AND set timeout */ - if ((mp->am_timeo = hasmntval(&mnt, "utimeout")) == 0) + if (!hasmntval(&mnt, "utimeout", &mp->am_timeo)) mp->am_timeo = gopt.am_timeo; /* otherwise use default timeout */ else notimeout = 0; @@ -480,8 +480,7 @@ amfs_mount(am_node *mp, mntfs *mf, char mnt.mnt_type = HIDE_MOUNT_TYPE; } - retry = hasmntval(&mnt, MNTTAB_OPT_RETRY); - if (retry <= 0) + if (!hasmntval(&mnt, MNTTAB_OPT_RETRY, &retry) || retry <= 0) retry = 2; /* XXX: default to 2 retries */ /* @@ -526,7 +525,7 @@ again: nfs_args_t nfs_args; am_nfs_handle_t *fhp, anh; #ifndef HAVE_TRANSPORT_TYPE_TLI - u_short port; + int port; struct sockaddr_in sin; #endif /* not HAVE_TRANSPORT_TYPE_TLI */ @@ -547,8 +546,7 @@ again: /* as per POSIX, sin_len need not be set (used internally by kernel) */ sin.sin_family = AF_INET; sin.sin_addr = myipaddr; - port = hasmntval(&mnt, MNTTAB_OPT_PORT); - if (port) { + if (hasmntval(&mnt, MNTTAB_OPT_PORT, &port) && port > 0 && port < 65536) { sin.sin_port = htons(port); } else { plog(XLOG_ERROR, "no port number specified for %s", dir); --- am-utils-6.2.orig/amd/ops_cdfs.c +++ am-utils-6.2/amd/ops_cdfs.c @@ -190,7 +190,12 @@ mount_cdfs(char *mntdir, char *fs_name, #endif /* HAVE_CDFS_ARGS_T_ISO_FLAGS */ #ifdef HAVE_CDFS_ARGS_T_ISO_PGTHRESH - cdfs_args.iso_pgthresh = hasmntval(&mnt, MNTTAB_OPT_PGTHRESH); + { + int thresh; + if (!hasmntval(&mnt, MNTTAB_OPT_PGTHRESH, &thresh) || thresh < 0) + thresh = 0; + cdfs_args.iso_pgthresh = thresh; + } #endif /* HAVE_CDFS_ARGS_T_ISO_PGTHRESH */ #ifdef HAVE_CDFS_ARGS_T_NORRIP --- am-utils-6.2.orig/amd/ops_nfs.c +++ am-utils-6.2/amd/ops_nfs.c @@ -888,8 +888,7 @@ mount_nfs_fh(am_nfs_handle_t *fhp, char plog(XLOG_INFO, "mount_nfs_fh: NFS version %d", (int) nfs_version); plog(XLOG_INFO, "mount_nfs_fh: using NFS transport %s", nfs_proto); - retry = hasmntval(&mnt, MNTTAB_OPT_RETRY); - if (retry <= 0) + if (!hasmntval(&mnt, MNTTAB_OPT_RETRY, &retry) || retry <= 0) retry = 1; /* XXX */ genflags = compute_mount_flags(&mnt); --- am-utils-6.2.orig/amd/ops_pcfs.c +++ am-utils-6.2/amd/ops_pcfs.c @@ -139,17 +139,19 @@ mount_pcfs(char *mntdir, char *fs_name, #endif /* HAVE_PCFS_ARGS_T_FSPEC */ #ifdef HAVE_PCFS_ARGS_T_MASK - pcfs_args.mask = 0777; /* this may be the msdos file modes */ - if ((mask = hasmntval(&mnt, MNTTAB_OPT_MASK)) > 0) + if (hasmntval(&mnt, MNTTAB_OPT_MASK, &mask) && mask > 0) pcfs_args.mask = mask; + else + pcfs_args.mask = 0777; /* this may be the msdos file modes */ if (amuDebug(D_TRACE)) plog(XLOG_DEBUG, "mount_pcfs: mask=%o (octal)", (u_int) pcfs_args.mask); #endif /* HAVE_PCFS_ARGS_T_MASK */ #ifdef HAVE_PCFS_ARGS_T_DIRMASK - pcfs_args.dirmask = 0777; /* this may be the msdos dir modes */ - if ((mask = hasmntval(&mnt, MNTTAB_OPT_DIRMASK)) > 0) + if (hasmntval(&mnt, MNTTAB_OPT_DIRMASK, &mask) && mask > 0) pcfs_args.dirmask = mask; + else + pcfs_args.dirmask = 0777; /* this may be the msdos dir modes */ if (amuDebug(D_TRACE)) plog(XLOG_DEBUG, "mount_pcfs: dirmask=%o (octal)", (u_int) pcfs_args.dirmask); #endif /* HAVE_PCFS_ARGS_T_DIRMASK */ --- am-utils-6.2.orig/amd/ops_ufs.c +++ am-utils-6.2/amd/ops_ufs.c @@ -144,7 +144,11 @@ mount_ufs(char *mntdir, char *fs_name, c #endif /* HAVE_UFS_ARGS_T_FSPEC */ #ifdef HAVE_UFS_ARGS_T_UFS_PGTHRESH - ufs_args.ufs_pgthresh = hasmntval(&mnt, MNTTAB_OPT_PGTHRESH); + { + int thresh; + if (!hasmntval(&mnt, MNTTAB_OPT_PGTHRESH, &thresh) || thresh < 0) + thresh = 0; + ufs_args.ufs_pgthresh = thresh; #endif /* HAVE_UFS_ARGS_T_UFS_PGTHRESH */ /* --- am-utils-6.2.orig/amd/srvr_nfs.c +++ am-utils-6.2/amd/srvr_nfs.c @@ -704,10 +704,10 @@ find_nfs_srvr(mntfs *mf) struct hostent *hp = NULL; struct sockaddr_in *ip = NULL; u_long nfs_version = 0; /* default is no version specified */ + int val; u_long best_nfs_version = 0; char *nfs_proto = NULL; /* no IP protocol either */ - int nfs_port = 0; - int nfs_port_opt = 0; + int nfs_port; int fserver_is_down = 0; if (mf->mf_fo == NULL) { @@ -721,7 +721,8 @@ find_nfs_srvr(mntfs *mf) * are required or not. < 0 = no pings. */ mnt.mnt_opts = mf->mf_mopts; - pingval = hasmntval(&mnt, "ping"); + if (!hasmntval(&mnt, "ping", &pingval) || pingval < 0) + pingval = 0; if (mf->mf_flags & MFF_NFS_SCALEDOWN) { /* @@ -739,7 +740,10 @@ find_nfs_srvr(mntfs *mf) * to decide the highest NFS version to try. */ #ifdef MNTTAB_OPT_VERS - nfs_version = hasmntval(&mnt, MNTTAB_OPT_VERS); + if (!hasmntvaldelim(&mnt, MNTTAB_OPT_VERS, ",.", &val) || val < 0) + nfs_version = 0; + else + nfs_version = val; #endif /* MNTTAB_OPT_VERS */ #ifdef MNTTAB_OPT_PROTO @@ -934,11 +938,11 @@ find_nfs_srvr(mntfs *mf) * If the port has been determined from the portmapper, use that. * Default to NFS_PORT otherwise (cf. RFC 2054, 3). */ - nfs_port_opt = hasmntval(&mnt, MNTTAB_OPT_PORT); - if (nfs_port_opt > 0) - nfs_port = htons(nfs_port_opt); - if (!nfs_port) + if (!hasmntval(&mnt, MNTTAB_OPT_PORT, &nfs_port) + || nfs_port > 65535 || nfs_port <= 0) nfs_port = htons(NFS_PORT); + else + nfs_port = htons(nfs_port); dlog("%s: using port %d for nfs on %s", __func__, (int) ntohs(nfs_port), host); @@ -1050,7 +1054,9 @@ no_dns: fs->fs_flags |= FSF_PING_UNINIT; /* pinger hasn't been initialized */ np = ALLOC(struct nfs_private); memset((voidp) np, 0, sizeof(*np)); - np->np_mountd = htons(hasmntval(&mnt, "mountport")); + if (!hasmntval(&mnt, "mountport", &val) || val < 0) + val = 0; + np->np_mountd = htons(val); if (np->np_mountd == 0) { np->np_mountd_inval = 'Y'; np->np_xid = XID_ALLOC(); --- am-utils-6.2.orig/hlfsd/hlfsd.c +++ am-utils-6.2/hlfsd/hlfsd.c @@ -530,8 +530,7 @@ main(int argc, char *argv[]) genflags = compute_mount_flags(&mnt); - retry = hasmntval(&mnt, MNTTAB_OPT_RETRY); - if (retry <= 0) + if (!hasmntval(&mnt, MNTTAB_OPT_RETRY, &retry) || retry <= 0) retry = 1; /* XXX */ memmove(&anh.v2, root_fhp, sizeof(*root_fhp)); --- am-utils-6.2.orig/include/am_utils.h +++ am-utils-6.2/include/am_utils.h @@ -290,8 +290,8 @@ extern int compute_mount_flags(mntent_t extern void discard_nfs_args(void *, u_long); extern u_long get_amd_program_number(void); extern int getcreds(struct svc_req *, uid_t *, gid_t *, SVCXPRT *); -extern int hasmntval(mntent_t *, char *); -extern unsigned int hasmntvalerr(mntent_t *, char *, int *); +extern int hasmntval(mntent_t *, char *, int *); +extern int hasmntvaldelim(mntent_t *, char *, const char *, int *); extern char *hasmntstr(mntent_t *, char *); extern char *hasmnteq(mntent_t *, char *); extern char *haseq(char *); --- am-utils-6.2.orig/libamu/mount_fs.c +++ am-utils-6.2/libamu/mount_fs.c @@ -188,8 +188,10 @@ static void addvers(char *zopts, size_t l, mntent_t *mnt, u_long have_vers, u_long want_vers) { - if (have_vers == want_vers && - hasmntval(mnt, MNTTAB_OPT_VERS) != want_vers) { + int val; + if (have_vers == want_vers + && hasmntvaldelim(mnt, MNTTAB_OPT_VERS, ".,", &val) + && (u_long)val != want_vers) { char optsbuf[48]; xsnprintf(optsbuf, sizeof(optsbuf), "%s=%d", MNTTAB_OPT_VERS, want_vers); @@ -391,7 +393,7 @@ compute_nfs_attrcache_flags(struct nfs_c * on the values of the attribute caches. */ #ifdef MNTTAB_OPT_ACTIMEO - err_acval = hasmntvalerr(mntp, MNTTAB_OPT_ACTIMEO, &acval); /* attr cache timeout (sec) */ + err_acval = !hasmntval(mntp, MNTTAB_OPT_ACTIMEO, &acval); /* attr cache timeout (sec) */ #endif /* MNTTAB_OPT_ACTIMEO */ /*** acregmin ***/ @@ -402,7 +404,7 @@ compute_nfs_attrcache_flags(struct nfs_c } else { # ifdef MNTTAB_OPT_ACREGMIN int tmp; - err_acrdmm = hasmntvalerr(mntp, MNTTAB_OPT_ACREGMIN, &tmp); + err_acrdmm = !hasmntval(mntp, MNTTAB_OPT_ACREGMIN, &tmp); nap->acregmin = tmp; # else /* not MNTTAB_OPT_ACREGMIN */ nap->acregmin = 0; @@ -423,7 +425,7 @@ compute_nfs_attrcache_flags(struct nfs_c } else { # ifdef MNTTAB_OPT_ACREGMAX int tmp; - err_acrdmm = hasmntvalerr(mntp, MNTTAB_OPT_ACREGMAX, &tmp); + err_acrdmm = !hasmntval(mntp, MNTTAB_OPT_ACREGMAX, &tmp); nap->acregmax = tmp; # else /* not MNTTAB_OPT_ACREGMAX */ nap->acregmax = 0; @@ -444,7 +446,7 @@ compute_nfs_attrcache_flags(struct nfs_c } else { # ifdef MNTTAB_OPT_ACDIRMIN int tmp; - err_acrdmm = hasmntvalerr(mntp, MNTTAB_OPT_ACDIRMIN, &tmp); + err_acrdmm = !hasmntval(mntp, MNTTAB_OPT_ACDIRMIN, &tmp); nap->acdirmin = tmp; # else /* not MNTTAB_OPT_ACDIRMIN */ nap->acdirmin = 0; @@ -465,7 +467,7 @@ compute_nfs_attrcache_flags(struct nfs_c } else { # ifdef MNTTAB_OPT_ACDIRMAX int tmp; - err_acrdmm = hasmntvalerr(mntp, MNTTAB_OPT_ACDIRMAX, &tmp); + err_acrdmm = !hasmntval(mntp, MNTTAB_OPT_ACDIRMAX, &tmp); nap->acdirmax = tmp; # else /* not MNTTAB_OPT_ACDIRMAX */ nap->acdirmax = 0; @@ -492,6 +494,7 @@ static void compute_nfs_common_args(struct nfs_common_args *nap, mntent_t *mntp, const char *nfs_proto, u_long nfs_version) { + int val; #ifdef MNT2_NFS_OPT_TCP if (nfs_proto && STREQ(nfs_proto, "tcp")) nap->flags |= MNT2_NFS_OPT_TCP; @@ -536,7 +539,10 @@ compute_nfs_common_args(struct nfs_commo # endif /* not MNTTAB_OPT_RESVPORT */ #endif /* MNT2_NFS_OPT_RESVPORT */ - nap->rsize = hasmntval(mntp, MNTTAB_OPT_RSIZE); + if (!hasmntval(mntp, MNTTAB_OPT_RSIZE, &val) || val <= 0) + nap->rsize = 0; + else + nap->rsize = val; #ifdef MNT2_NFS_OPT_RSIZE if (nap->rsize) nap->flags |= MNT2_NFS_OPT_RSIZE; @@ -544,7 +550,10 @@ compute_nfs_common_args(struct nfs_commo if (nfs_version == NFS_VERSION && nap->rsize > 8192) nap->rsize = 8192; - nap->wsize = hasmntval(mntp, MNTTAB_OPT_WSIZE); + if (!hasmntval(mntp, MNTTAB_OPT_WSIZE, &val) || val <= 0) + nap->wsize = 0; + else + nap->wsize = val; #ifdef MNT2_NFS_OPT_WSIZE if (nap->wsize) nap->flags |= MNT2_NFS_OPT_WSIZE; @@ -552,13 +561,19 @@ compute_nfs_common_args(struct nfs_commo if (nfs_version == NFS_VERSION && nap->wsize > 8192) nap->wsize = 8192; - nap->timeo = hasmntval(mntp, MNTTAB_OPT_TIMEO); + if (!hasmntval(mntp, MNTTAB_OPT_TIMEO, &val) || val <= 0) + nap->timeo = 0; + else + nap->timeo = val; #ifdef MNT2_NFS_OPT_TIMEO if (nap->timeo) nap->flags |= MNT2_NFS_OPT_TIMEO; #endif /* MNT2_NFS_OPT_TIMEO */ - nap->retrans = hasmntval(mntp, MNTTAB_OPT_RETRANS); + if (!hasmntval(mntp, MNTTAB_OPT_RETRANS, &val) || val <= 0) + nap->retrans = 0; + else + nap->retrans = val; #ifdef MNT2_NFS_OPT_RETRANS if (nap->retrans) nap->flags |= MNT2_NFS_OPT_RETRANS; @@ -861,6 +876,7 @@ compute_nfs23_args(nfs_args_t *nap, char *host_name, char *fs_name) { + int val; struct nfs_common_args a; /* initialize just in case */ memset((voidp) nap, 0, sizeof(nfs_args_t)); @@ -995,18 +1011,30 @@ compute_nfs23_args(nfs_args_t *nap, /************************************************************************/ #ifdef MNT2_NFS_OPT_BIODS - if ((nap->biods = hasmntval(mntp, MNTTAB_OPT_BIODS))) + if (!hasmntval(mntp, MNTTAB_OPT_BIODS, &val) || val <= 0) + nap->biods = 0; + else { + nap->biods = val; nap->flags |= MNT2_NFS_OPT_BIODS; + } #endif /* MNT2_NFS_OPT_BIODS */ #ifdef MNTTAB_OPT_SYMTTL /* symlink cache time-to-live */ - if ((nap->symttl = hasmntval(mntp, MNTTAB_OPT_SYMTTL))) + if (!hasmntval(mntp, MNTTAB_OPT_SYMTTL, &val) || val <= 0) + nap->symttl = 0; + else { + nap->symttl = val; nap->flags |= MNT2_NFS_OPT_SYMTTL; + } #endif /* MNTTAB_OPT_SYMTTL */ #ifdef MNT2_NFS_OPT_PGTHRESH /* paging threshold */ - if ((nap->pg_thresh = hasmntval(mntp, MNTTAB_OPT_PGTHRESH))) + if (!hasmntval(mntp, MNTTAB_OPT_PGTHRESH, &val) || val <= 0) + nap->pg_thresh = 0; + else { + nap->pg_thresh = val; nap->flags |= MNT2_NFS_OPT_PGTHRESH; + } #endif /* MNT2_NFS_OPT_PGTHRESH */ #if defined(MNT2_NFS_OPT_POSIX) && defined(MNTTAB_OPT_POSIX) @@ -1020,7 +1048,7 @@ compute_nfs23_args(nfs_args_t *nap, #ifdef HAVE_TRANSPORT_TYPE_TLI /* set up syncaddr field */ - nap->syncaddr = (struct netbuf *) NULL; + nap->syncaddr = NULL; /* set up knconf field */ if (get_knetconfig(&nap->knconf, nfsncp, nfs_proto) < 0) { @@ -1043,9 +1071,12 @@ compute_nfs23_args(nfs_args_t *nap, #endif /* HAVE_NFS_ARGS_T_OPTSTR */ #if defined(MNT2_NFS_OPT_MAXGRPS) && defined(MNTTAB_OPT_MAXGROUPS) - nap->maxgrouplist = hasmntval(mntp, MNTTAB_OPT_MAXGROUPS); - if (nap->maxgrouplist != 0) + if (!hasmntval(mntp, MNTTAB_OPT_MAXGROUPS, &val) || val <= 0) + nap->maxgrouplist = 0; + else { + nap->maxgrouplist = val; nap->flags |= MNT2_NFS_OPT_MAXGRPS; + } #endif /* defined(MNT2_NFS_OPT_MAXGRPS) && defined(MNTTAB_OPT_MAXGROUPS) */ /************************************************************************/ @@ -1267,6 +1298,7 @@ compute_nfs4_args(nfs4_args_t *nap, { char *s; struct nfs_common_args a; + int val; uint16_t nfs_port; /* initialize just in case */ @@ -1304,11 +1336,10 @@ compute_nfs4_args(nfs4_args_t *nap, nap->host_addr = xmalloc(nap->host_addrlen); memcpy(nap->host_addr, ip_addr, nap->host_addrlen); - nfs_port = hasmntval(mntp, MNTTAB_OPT_PORT); - if (nfs_port == 0) + if (!hasmntval(mntp, MNTTAB_OPT_PORT, &val) || val <= 0 || val > 65536) nfs_port = htons(NFS_PORT); else - nfs_port = htons(nfs_port); + nfs_port = htons(val); ((struct sockaddr_in *)nap->host_addr)->sin_port = nfs_port; @@ -1341,9 +1372,13 @@ compute_nfs4_args(nfs4_args_t *nap, #endif /* MNT2_NFS_OPT_POSIX && MNTTAB_OPT_POSIX */ #if defined(MNT2_NFS_OPT_MAXGRPS) && defined(MNTTAB_OPT_MAXGROUPS) - nap->maxgrouplist = hasmntval(mntp, MNTTAB_OPT_MAXGROUPS); - if (nap->maxgrouplist != 0) + nap->maxgrouplist = + if (!hasmntval(mntp, MNTTAB_OPT_MAXGROUPS, &val) || val <= 0) + nap->maxgrouplist = 0; + else { + nap->maxgrouplist = val; nap->flags |= MNT2_NFS_OPT_MAXGRPS; + } #endif /* defined(MNT2_NFS_OPT_MAXGRPS) && defined(MNTTAB_OPT_MAXGROUPS) */ #ifdef HAVE_NFS_ARGS_T_OPTSTR --- am-utils-6.2.orig/libamu/mtab.c +++ am-utils-6.2/libamu/mtab.c @@ -133,22 +133,12 @@ hasmnteq(mntent_t *mnt, char *opt) /* - * Wrapper around hasmntvalerr(), which retains backwards compatibiliy with - * older use of hasmntval(). - * - * XXX: eventually, all use of hasmntval() should be replaced with - * hasmntvalerr(). + * Wrapper around hasmntvaldelim(), which uses the standard "," delim */ int -hasmntval(mntent_t *mnt, char *opt) +hasmntval(mntent_t *mnt, char *opt, int *valp) { - int err, val = 0; - - err = hasmntvalerr(mnt, opt, &val); - if (err) /* if there was an error (hasmntvalerr returned 1) */ - return 0; /* redundant: val==0 above, but leave here for clarity */ - /* otherwise there was no error */ - return val; + return hasmntvaldelim(mnt, opt, ",", valp); } @@ -158,36 +148,31 @@ hasmntval(mntent_t *mnt, char *opt) * valp (argument won't be touched if no value is set, for example due to an * error). * - * Returns non-zero (1) on error; returns 0 on success. - * - * XXX: eventually, all use of hasmntval() should be replaced with - * hasmntvalerr(). + * Returns 0 on error; returns 1 on success. */ -unsigned int -hasmntvalerr(mntent_t *mnt, char *opt, int *valp) +int +hasmntvaldelim(mntent_t *mnt, char *opt, const char *delim, int *valp) { char *str = amu_hasmntopt(mnt, opt); - int err = 1; /* 1 means no good value was set (an error) */ char *eq, *endptr; long int i; /* exit if no option specificed */ - if (!str) { - goto out; - } + if (!str) + return 0; eq = hasmnteq(mnt, opt); if (!eq) { /* no argument to option ('=' sign was missing) */ plog(XLOG_MAP, "numeric option to \"%s\" missing", opt); - goto out; + return 0; } /* if got here, then we had an '=' after option name */ endptr = NULL; i = strtol(eq, &endptr, 0); /* hex and octal allowed ;-) */ if (!endptr || - (endptr != eq && (*endptr == ',' || *endptr == '\0'))) { + (endptr != eq && (*endptr == '\0' || strchr(delim, *endptr)))) { /* * endptr set means strtol saw a non-digit. If the non-digit is a * comma, it's probably the start of the next option. If the comma is @@ -198,15 +183,13 @@ hasmntvalerr(mntent_t *mnt, char *opt, i * string. */ *valp = (int) i; /* set good value */ - err = 0; /* no error */ + return 1; } else { /* whatever was after the '=' sign wasn't a number */ plog(XLOG_MAP, "invalid numeric option in \"%s\": \"%s\"", opt, str); /* fall through to error/exit processing */ + return 0; } - - out: - return err; }