X-Git-Url: https://git.decadent.org.uk/gitweb/?p=nfs-utils.git;a=blobdiff_plain;f=utils%2Fmount%2Fnetwork.c;h=f020933dfe87d6ed1d55e6e04b401943d5d768a2;hp=92bba2d72667e6f6043ccea2b089dae9fb460ef9;hb=33203b53ac5f43eef995c100299e45bd441c67d8;hpb=f0d3a4bedccca7cce48296757bc1c8bd59b80828 diff --git a/utils/mount/network.c b/utils/mount/network.c index 92bba2d..f020933 100644 --- a/utils/mount/network.c +++ b/utils/mount/network.c @@ -37,6 +37,7 @@ #include #include #include +#include #include #include #include @@ -1272,7 +1273,8 @@ nfs_nfs_version(struct mount_options *options, unsigned long *version) /* * Returns TRUE if @protocol contains a valid value for this option, - * or FALSE if the option was specified with an invalid value. + * or FALSE if the option was specified with an invalid value. On + * error, errno is set. */ int nfs_nfs_protocol(struct mount_options *options, unsigned long *protocol) @@ -1289,8 +1291,13 @@ nfs_nfs_protocol(struct mount_options *options, unsigned long *protocol) return 1; case 2: /* proto */ option = po_get(options, "proto"); - if (option != NULL) - return nfs_get_proto(option, &family, protocol); + if (option != NULL) { + if (!nfs_get_proto(option, &family, protocol)) { + errno = EPROTONOSUPPORT; + return 0; + } + return 1; + } } /* @@ -1331,21 +1338,38 @@ nfs_nfs_port(struct mount_options *options, unsigned long *port) return 1; } +#ifdef IPV6_SUPPORTED +sa_family_t config_default_family = AF_UNSPEC; + +static int +nfs_verify_family(sa_family_t family) +{ + return 1; +} +#else /* IPV6_SUPPORTED */ +sa_family_t config_default_family = AF_INET; + +static int +nfs_verify_family(sa_family_t family) +{ + if (family != AF_INET) + return 0; + + return 1; +} +#endif /* IPV6_SUPPORTED */ + /* * Returns TRUE and fills in @family if a valid NFS protocol option - * is found, or FALSE if the option was specified with an invalid value. + * is found, or FALSE if the option was specified with an invalid value + * or if the protocol family isn't supported. On error, errno is set. */ int nfs_nfs_proto_family(struct mount_options *options, sa_family_t *family) { unsigned long protocol; char *option; - -#ifdef IPV6_SUPPORTED - *family = AF_UNSPEC; -#else - *family = AF_INET; -#endif + sa_family_t tmp_family = config_default_family; switch (po_rightmost(options, nfs_transport_opttbl)) { case 0: /* udp */ @@ -1354,15 +1378,18 @@ int nfs_nfs_proto_family(struct mount_options *options, return 1; case 2: /* proto */ option = po_get(options, "proto"); - if (option != NULL) - return nfs_get_proto(option, family, &protocol); + if (option != NULL && + !nfs_get_proto(option, &tmp_family, &protocol)) + goto out_err; } - /* - * NFS transport protocol wasn't specified. Return the - * default address family. - */ + if (!nfs_verify_family(tmp_family)) + goto out_err; + *family = tmp_family; return 1; +out_err: + errno = EAFNOSUPPORT; + return 0; } /* @@ -1428,7 +1455,8 @@ nfs_mount_version(struct mount_options *options, unsigned long *version) /* * Returns TRUE if @protocol contains a valid value for this option, - * or FALSE if the option was specified with an invalid value. + * or FALSE if the option was specified with an invalid value. On + * error, errno is set. */ static int nfs_mount_protocol(struct mount_options *options, unsigned long *protocol) @@ -1437,8 +1465,13 @@ nfs_mount_protocol(struct mount_options *options, unsigned long *protocol) char *option; option = po_get(options, "mountproto"); - if (option != NULL) - return nfs_get_proto(option, &family, protocol); + if (option != NULL) { + if (!nfs_get_proto(option, &family, protocol)) { + errno = EPROTONOSUPPORT; + return 0; + } + return 1; + } /* * MNT transport protocol wasn't specified. If the NFS @@ -1480,23 +1513,25 @@ nfs_mount_port(struct mount_options *options, unsigned long *port) /* * Returns TRUE and fills in @family if a valid MNT protocol option - * is found, or FALSE if the option was specified with an invalid value. + * is found, or FALSE if the option was specified with an invalid value + * or if the protocol family isn't supported. On error, errno is set. */ int nfs_mount_proto_family(struct mount_options *options, sa_family_t *family) { unsigned long protocol; char *option; - -#ifdef HAVE_LIBTIRPC - *family = AF_UNSPEC; -#else - *family = AF_INET; -#endif + sa_family_t tmp_family = config_default_family; option = po_get(options, "mountproto"); - if (option != NULL) - return nfs_get_proto(option, family, &protocol); + if (option != NULL) { + if (!nfs_get_proto(option, &tmp_family, &protocol)) + goto out_err; + if (!nfs_verify_family(tmp_family)) + goto out_err; + *family = tmp_family; + return 1; + } /* * MNT transport protocol wasn't specified. If the NFS @@ -1505,6 +1540,9 @@ int nfs_mount_proto_family(struct mount_options *options, * NFS. */ return nfs_nfs_proto_family(options, family); +out_err: + errno = EAFNOSUPPORT; + return 0; } /**