Removing nfs-utils-1.2.0-v4root-rel9.patch
This commit is contained in:
		
							parent
							
								
									80be375668
								
							
						
					
					
						commit
						97d06d17fc
					
				| @ -1,396 +0,0 @@ | ||||
| diff --git a/support/export/xtab.c b/support/export/xtab.c
 | ||||
| index 3b1dcce..2a43193 100644
 | ||||
| --- a/support/export/xtab.c
 | ||||
| +++ b/support/export/xtab.c
 | ||||
| @@ -19,7 +19,9 @@
 | ||||
|  #include "exportfs.h" | ||||
|  #include "xio.h" | ||||
|  #include "xlog.h" | ||||
| +#include "v4root.h"
 | ||||
|   | ||||
| +int v4root_needed;
 | ||||
|  static void cond_rename(char *newfile, char *oldfile); | ||||
|   | ||||
|  static int | ||||
| @@ -36,6 +38,8 @@ xtab_read(char *xtab, char *lockfn, int is_export)
 | ||||
|  	if ((lockid = xflock(lockfn, "r")) < 0) | ||||
|  		return 0; | ||||
|  	setexportent(xtab, "r"); | ||||
| +	if (is_export == 1)
 | ||||
| +		v4root_needed = 1;
 | ||||
|  	while ((xp = getexportent(is_export==0, 0)) != NULL) { | ||||
|  		if (!(exp = export_lookup(xp->e_hostname, xp->e_path, is_export != 1)) && | ||||
|  		    !(exp = export_create(xp, is_export!=1))) { | ||||
| @@ -48,6 +52,8 @@ xtab_read(char *xtab, char *lockfn, int is_export)
 | ||||
|  		case 1: | ||||
|  			exp->m_xtabent = 1; | ||||
|  			exp->m_mayexport = 1; | ||||
| +			if ((xp->e_flags & NFSEXP_FSID) && xp->e_fsid == 0)
 | ||||
| +				v4root_needed = 0;
 | ||||
|  			break; | ||||
|  		case 2: | ||||
|  			exp->m_exported = -1;/* may be exported */ | ||||
| diff --git a/support/include/nfs/export.h b/support/include/nfs/export.h
 | ||||
| index f7a99ba..76953ac 100644
 | ||||
| --- a/support/include/nfs/export.h
 | ||||
| +++ b/support/include/nfs/export.h
 | ||||
| @@ -24,6 +24,7 @@
 | ||||
|  #define NFSEXP_FSID		0x2000 | ||||
|  #define	NFSEXP_CROSSMOUNT	0x4000 | ||||
|  #define NFSEXP_NOACL		0x8000 /* reserved for possible ACL related use */ | ||||
| -#define NFSEXP_ALLFLAGS		0xFFFF
 | ||||
| +#define NFSEXP_V4ROOT       0x10000
 | ||||
| +#define NFSEXP_ALLFLAGS		0x1FFFF
 | ||||
|   | ||||
|  #endif /* _NSF_EXPORT_H */ | ||||
| diff --git a/support/include/pseudoflavors.h b/support/include/pseudoflavors.h
 | ||||
| index c21087b..c7ba8a2 100644
 | ||||
| --- a/support/include/pseudoflavors.h
 | ||||
| +++ b/support/include/pseudoflavors.h
 | ||||
| @@ -15,3 +15,4 @@ struct flav_info {
 | ||||
|   | ||||
|  extern struct flav_info flav_map[]; | ||||
|  extern const int flav_map_size; | ||||
| +extern unsigned int flavors_setall(struct exportent *ep);
 | ||||
| diff --git a/support/include/v4root.h b/support/include/v4root.h
 | ||||
| new file mode 100644 | ||||
| index 0000000..706c15c
 | ||||
| --- /dev/null
 | ||||
| +++ b/support/include/v4root.h
 | ||||
| @@ -0,0 +1,15 @@
 | ||||
| +/*
 | ||||
| + * Copyright (C) 2009 Red Hat <nfs@redhat.com>
 | ||||
| + * support/include/v4root.h
 | ||||
| + *
 | ||||
| + * Support routines for dynamic pseudo roots.
 | ||||
| + *
 | ||||
| + */
 | ||||
| +
 | ||||
| +#ifndef V4ROOT_H
 | ||||
| +#define V4ROOT_H
 | ||||
| +
 | ||||
| +extern int v4root_needed;
 | ||||
| +extern void v4root_set(void);
 | ||||
| +
 | ||||
| +#endif /* V4ROOT_H */
 | ||||
| diff --git a/support/nfs/exports.c b/support/nfs/exports.c
 | ||||
| index 1aaebf4..fe9ed3a 100644
 | ||||
| --- a/support/nfs/exports.c
 | ||||
| +++ b/support/nfs/exports.c
 | ||||
| @@ -39,16 +39,18 @@ struct flav_info flav_map[] = {
 | ||||
|  	{ "krb5",	RPC_AUTH_GSS_KRB5	}, | ||||
|  	{ "krb5i",	RPC_AUTH_GSS_KRB5I	}, | ||||
|  	{ "krb5p",	RPC_AUTH_GSS_KRB5P	}, | ||||
| +	{ "unix",	AUTH_UNIX		},
 | ||||
| +	{ "sys",	AUTH_SYS		},
 | ||||
| +	{ "null",	AUTH_NULL		},
 | ||||
| +	{ "none",	AUTH_NONE		},
 | ||||
| +#ifdef NOLONGERSUPPORTED
 | ||||
|  	{ "lipkey",	RPC_AUTH_GSS_LKEY	}, | ||||
|  	{ "lipkey-i",	RPC_AUTH_GSS_LKEYI	}, | ||||
|  	{ "lipkey-p",	RPC_AUTH_GSS_LKEYP	}, | ||||
|  	{ "spkm3",	RPC_AUTH_GSS_SPKM	}, | ||||
|  	{ "spkm3i",	RPC_AUTH_GSS_SPKMI	}, | ||||
|  	{ "spkm3p",	RPC_AUTH_GSS_SPKMP	}, | ||||
| -	{ "unix",	AUTH_UNIX		},
 | ||||
| -	{ "sys",	AUTH_SYS		},
 | ||||
| -	{ "null",	AUTH_NULL		},
 | ||||
| -	{ "none",	AUTH_NONE		},
 | ||||
| +#endif
 | ||||
|  }; | ||||
|   | ||||
|  const int flav_map_size = sizeof(flav_map)/sizeof(flav_map[0]); | ||||
| @@ -436,6 +438,20 @@ static unsigned int parse_flavors(char *str, struct exportent *ep)
 | ||||
|  	} | ||||
|  	return out; | ||||
|  } | ||||
| +unsigned int flavors_setall(struct exportent *ep)
 | ||||
| +{
 | ||||
| +	struct flav_info *flav;
 | ||||
| +	unsigned int out=0;
 | ||||
| +	int bit;
 | ||||
| +
 | ||||
| +	for (flav = flav_map; flav < flav_map + flav_map_size; flav++) {
 | ||||
| +		bit = secinfo_addflavor(flav, ep);
 | ||||
| +		if (bit < 0)
 | ||||
| +			return 0;
 | ||||
| +		out |= 1<<bit;
 | ||||
| +	}
 | ||||
| +	return out;
 | ||||
| +}
 | ||||
|   | ||||
|  /* Sets the bits in @mask for the appropriate security flavor flags. */ | ||||
|  static void setflags(int mask, unsigned int active, struct exportent *ep) | ||||
| diff --git a/utils/mountd/Makefile.am b/utils/mountd/Makefile.am
 | ||||
| index 1e76cf8..eba81fc 100644
 | ||||
| --- a/utils/mountd/Makefile.am
 | ||||
| +++ b/utils/mountd/Makefile.am
 | ||||
| @@ -8,7 +8,7 @@ KPREFIX		= @kprefix@
 | ||||
|  sbin_PROGRAMS	= mountd | ||||
|   | ||||
|  mountd_SOURCES = mountd.c mount_dispatch.c auth.c rmtab.c cache.c \ | ||||
| -		 svc_run.c fsloc.c mountd.h
 | ||||
| +		 svc_run.c fsloc.c v4root.c mountd.h
 | ||||
|  mountd_LDADD = ../../support/export/libexport.a \ | ||||
|  	       ../../support/nfs/libnfs.a \ | ||||
|  	       ../../support/misc/libmisc.a \ | ||||
| diff --git a/utils/mountd/auth.c b/utils/mountd/auth.c
 | ||||
| index 5a7ff8c..2ed80bc 100644
 | ||||
| --- a/utils/mountd/auth.c
 | ||||
| +++ b/utils/mountd/auth.c
 | ||||
| @@ -20,6 +20,7 @@
 | ||||
|  #include "exportfs.h" | ||||
|  #include "mountd.h" | ||||
|  #include "xmalloc.h" | ||||
| +#include "v4root.h"
 | ||||
|   | ||||
|  enum auth_error | ||||
|  { | ||||
| @@ -102,6 +103,8 @@ auth_reload()
 | ||||
|  	memset(&my_client, 0, sizeof(my_client)); | ||||
|  	xtab_export_read(); | ||||
|  	check_useipaddr(); | ||||
| +	v4root_set();
 | ||||
| +
 | ||||
|  	++counter; | ||||
|   | ||||
|  	return counter; | ||||
| diff --git a/utils/mountd/mountd.c b/utils/mountd/mountd.c
 | ||||
| index 888fd8c..179ef17 100644
 | ||||
| --- a/utils/mountd/mountd.c
 | ||||
| +++ b/utils/mountd/mountd.c
 | ||||
| @@ -540,6 +540,10 @@ get_exportlist(void)
 | ||||
|   | ||||
|  	for (i = 0; i < MCL_MAXTYPES; i++) { | ||||
|  		for (exp = exportlist[i].p_head; exp; exp = exp->m_next) { | ||||
| +			 /* Don't show pseudo exports */
 | ||||
| +			if (exp->m_export.e_flags & NFSEXP_V4ROOT)
 | ||||
| +				continue;
 | ||||
| +
 | ||||
|  			for (e = elist; e != NULL; e = e->ex_next) { | ||||
|  				if (!strcmp(exp->m_export.e_path, e->ex_dir)) | ||||
|  					break; | ||||
| diff --git a/utils/mountd/v4root.c b/utils/mountd/v4root.c
 | ||||
| new file mode 100644 | ||||
| index 0000000..b1e483a
 | ||||
| --- /dev/null
 | ||||
| +++ b/utils/mountd/v4root.c
 | ||||
| @@ -0,0 +1,218 @@
 | ||||
| +/*
 | ||||
| + * Copyright (C) 2009 Red Hat <nfs@redhat.com>
 | ||||
| + *
 | ||||
| + * support/export/v4root.c
 | ||||
| + *
 | ||||
| + * Routines used to support NFSv4 pseudo roots
 | ||||
| + *
 | ||||
| + */
 | ||||
| +
 | ||||
| +#ifdef HAVE_CONFIG_H
 | ||||
| +#include <config.h>
 | ||||
| +#endif
 | ||||
| +
 | ||||
| +#include <sys/types.h>
 | ||||
| +#include <sys/stat.h>
 | ||||
| +#include <sys/queue.h>
 | ||||
| +#include <stdio.h>
 | ||||
| +#include <stdlib.h>
 | ||||
| +#include <ctype.h>
 | ||||
| +
 | ||||
| +#include <unistd.h>
 | ||||
| +#include <errno.h>
 | ||||
| +
 | ||||
| +#include "xlog.h"
 | ||||
| +#include "exportfs.h"
 | ||||
| +#include "nfslib.h"
 | ||||
| +#include "misc.h"
 | ||||
| +#include "pseudoflavors.h"
 | ||||
| +#include "v4root.h"
 | ||||
| +
 | ||||
| +#ifndef _PATH_PSEUDO_ROOT
 | ||||
| +#define _PATH_PSEUDO_ROOT		"/"
 | ||||
| +#endif
 | ||||
| +
 | ||||
| +#ifndef _PSEUDO_ROOT_FSID
 | ||||
| +#define _PSEUDO_ROOT_FSID	0
 | ||||
| +#endif
 | ||||
| +
 | ||||
| +void v4root_set(void);
 | ||||
| +void v4root_unset(void);
 | ||||
| +static int v4root_support(void);
 | ||||
| +
 | ||||
| +static struct exportent *v4root_create(char *, nfs_export *);
 | ||||
| +
 | ||||
| +int v4root_needed;
 | ||||
| +static nfs_export pseudo_root = {
 | ||||
| +	.m_next = NULL,
 | ||||
| +	.m_client = NULL,
 | ||||
| +	.m_export = {
 | ||||
| +		.e_hostname = "*",
 | ||||
| +		.e_path = _PATH_PSEUDO_ROOT,
 | ||||
| +		.e_flags = NFSEXP_READONLY | NFSEXP_ROOTSQUASH
 | ||||
| +				| NFSEXP_NOSUBTREECHECK | NFSEXP_FSID
 | ||||
| +				| NFSEXP_CROSSMOUNT | NFSEXP_V4ROOT,
 | ||||
| +		.e_anonuid = 65534,
 | ||||
| +		.e_anongid = 65534,
 | ||||
| +		.e_squids = NULL,
 | ||||
| +		.e_nsquids = 0,
 | ||||
| +		.e_sqgids = NULL,
 | ||||
| +		.e_nsqgids = 0,
 | ||||
| +		.e_fsid = 0,
 | ||||
| +		.e_mountpoint = NULL,
 | ||||
| +		.e_secinfo[0].flav = NULL,
 | ||||
| +	},
 | ||||
| +	.m_exported = 0,
 | ||||
| +	.m_xtabent = 1,
 | ||||
| +	.m_mayexport = 1,
 | ||||
| +	.m_changed = 0,
 | ||||
| +	.m_warned = 0,
 | ||||
| +};
 | ||||
| +
 | ||||
| +/*
 | ||||
| + * Create a pseudo export
 | ||||
| + */
 | ||||
| +static struct exportent *
 | ||||
| +v4root_create(char *path, nfs_export *export)
 | ||||
| +{
 | ||||
| +	nfs_export *exp;
 | ||||
| +	struct exportent eep;
 | ||||
| +	struct exportent *curexp = &export->m_export;
 | ||||
| +
 | ||||
| +	dupexportent(&eep, curexp);
 | ||||
| +	eep.e_hostname = strdup(curexp->e_hostname);
 | ||||
| +	strncpy(eep.e_path, path, sizeof(eep.e_path));
 | ||||
| +	exp = export_create(&eep, 0);
 | ||||
| +	if (exp == NULL)
 | ||||
| +		return NULL;
 | ||||
| +
 | ||||
| +	exp->m_export.e_flags |= NFSEXP_V4ROOT;
 | ||||
| +	if (strcmp(path, _PATH_PSEUDO_ROOT) != 0)
 | ||||
| +		exp->m_export.e_flags &= ~NFSEXP_FSID;
 | ||||
| +
 | ||||
| +	xlog(D_CALL, "v4root_create: path '%s'", exp->m_export.e_path);
 | ||||
| +
 | ||||
| +	return &exp->m_export;
 | ||||
| +}
 | ||||
| +
 | ||||
| +/*
 | ||||
| + * Make sure the kernel has pseudo root support.
 | ||||
| + */
 | ||||
| +static int
 | ||||
| +v4root_support()
 | ||||
| +{
 | ||||
| +	static int kernel_support = -1;
 | ||||
| +	char *ptr, version[64];
 | ||||
| +	int major, minor;
 | ||||
| +	FILE *fp;
 | ||||
| +
 | ||||
| +	if (kernel_support != -1)
 | ||||
| +		return kernel_support;
 | ||||
| +
 | ||||
| +	kernel_support = 0;
 | ||||
| +	fp = fopen("/proc/fs/nfsd/exports", "r");
 | ||||
| +	if (fp == NULL)
 | ||||
| +		goto out;
 | ||||
| +
 | ||||
| +	ptr = fgets(version, 64, fp);
 | ||||
| +	fclose(fp);
 | ||||
| +	if (ptr == NULL)
 | ||||
| +		goto out;
 | ||||
| +
 | ||||
| +	while(*ptr && isdigit(*ptr) == 0)
 | ||||
| +		ptr++;
 | ||||
| +	if (*ptr == '\0')
 | ||||
| +		goto out;
 | ||||
| +
 | ||||
| +	major = minor = 0;
 | ||||
| +	sscanf(ptr, " %d.%d",&major, &minor);
 | ||||
| +	if (major >= 1 && minor >= 2)
 | ||||
| +		kernel_support = 1;
 | ||||
| +out:
 | ||||
| +	if (!kernel_support) {
 | ||||
| +		xlog(L_WARNING, "Kernel does not have pseudo root support.");
 | ||||
| +		xlog(L_WARNING, "NFS v4 mounts will be disabled unless fsid=0");
 | ||||
| +		xlog(L_WARNING, "is specfied in /etc/exports file.");
 | ||||
| +	}
 | ||||
| +
 | ||||
| +	return kernel_support;
 | ||||
| +}
 | ||||
| +
 | ||||
| +/*
 | ||||
| + * Create pseudo exports by running through the real export 
 | ||||
| + * looking at the components of the path that make up the export. 
 | ||||
| + * Those path components, if not exported, will become pseudo 
 | ||||
| + * exports allowing them to be found when the kernel does an upcall 
 | ||||
| + * looking for components of the v4 mount.
 | ||||
| + */
 | ||||
| +void
 | ||||
| +v4root_set()
 | ||||
| +{
 | ||||
| +	nfs_export	*exp, *nxt;
 | ||||
| +	struct exportent *proot;
 | ||||
| +	int	i, insecure = 0, secflavors = 0;
 | ||||
| +	char *path, *ptr;
 | ||||
| +	char *hostname;
 | ||||
| +
 | ||||
| +	if (!v4root_needed)
 | ||||
| +		return;
 | ||||
| +
 | ||||
| +	if (!v4root_support())
 | ||||
| +		return;
 | ||||
| +
 | ||||
| +	proot = v4root_create(_PATH_PSEUDO_ROOT, &pseudo_root);
 | ||||
| +	if (proot == NULL) {
 | ||||
| +		xlog(L_WARNING, "v4root_set: Unable to create "
 | ||||
| +			"pseudo export for '%s'", _PATH_PSEUDO_ROOT);
 | ||||
| +		return;
 | ||||
| +	}
 | ||||
| +
 | ||||
| +	for (i = 0; i < MCL_MAXTYPES; i++) {
 | ||||
| +		for (exp = exportlist[i].p_head; exp; exp = nxt) {
 | ||||
| +			nxt = exp->m_next;
 | ||||
| +			hostname = exp->m_export.e_hostname;
 | ||||
| +
 | ||||
| +			path = strdup(exp->m_export.e_path);
 | ||||
| +			ptr = path + 1;
 | ||||
| +			while ((ptr = strchr(ptr, '/')) != NULL) {
 | ||||
| +				*ptr = '\0';
 | ||||
| +				if (export_lookup(hostname, path, 0) == NULL)
 | ||||
| +					if (v4root_create(path, exp) == NULL) {
 | ||||
| +						xlog(L_WARNING, "v4root_set: Unable to create "
 | ||||
| +							"pseudo export for '%s'", path);
 | ||||
| +						break;
 | ||||
| +					}
 | ||||
| +				*ptr = '/';
 | ||||
| +				ptr++;
 | ||||
| +			}
 | ||||
| +			/* Make note of insecure exports */
 | ||||
| +			if (!insecure)
 | ||||
| +				insecure = (exp->m_export.e_flags & NFSEXP_INSECURE_PORT);
 | ||||
| +
 | ||||
| +			/* Make note of security flavors being set */
 | ||||
| +			if (!secflavors)
 | ||||
| +				secflavors = (exp->m_export.e_secinfo[0].flav != NULL);
 | ||||
| +
 | ||||
| +			free(path);
 | ||||
| +		}
 | ||||
| +	}
 | ||||
| +
 | ||||
| +	/*
 | ||||
| +	 * If there are any insecure exports, the pseudo root
 | ||||
| +	 * also has to be insecure
 | ||||
| +	 */
 | ||||
| +	if (insecure) {
 | ||||
| +		proot->e_flags |= NFSEXP_INSECURE_PORT;
 | ||||
| +	}
 | ||||
| +
 | ||||
| +	/*
 | ||||
| +	 * Make sure the pseudo root is accessible from all
 | ||||
| +	 * security flavors when it needs to be.
 | ||||
| +	 */
 | ||||
| +	if (secflavors && !flavors_setall(proot)) {
 | ||||
| +		xlog(L_WARNING, "v4root_set: Unable to set security "
 | ||||
| +			"flavors on pseudo root");
 | ||||
| +	}
 | ||||
| +
 | ||||
| +}
 | ||||
| +
 | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user