mirror of
				https://git.proxmox.com/git/mirror_zfs.git
				synced 2025-10-26 18:05:04 +03:00 
			
		
		
		
	libshare: nfs: pass through ipv6 addresses in bracket notation
Recognize when the host part of a sharenfs attribute is an ipv6 Literal and pass that through without modification. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Felix Dörre <felix@dogcraft.de> Closes: #11171 Closes #11939 Closes: #1894
This commit is contained in:
		
							parent
							
								
									ae75a78ba3
								
							
						
					
					
						commit
						9e41d5d05c
					
				| @ -180,8 +180,9 @@ foreach_nfs_host_cb(const char *opt, const char *value, void *pcookie) | |||||||
| { | { | ||||||
| 	int error; | 	int error; | ||||||
| 	const char *access; | 	const char *access; | ||||||
| 	char *host_dup, *host, *next; | 	char *host_dup, *host, *next, *v6Literal; | ||||||
| 	nfs_host_cookie_t *udata = (nfs_host_cookie_t *)pcookie; | 	nfs_host_cookie_t *udata = (nfs_host_cookie_t *)pcookie; | ||||||
|  | 	int cidr_len; | ||||||
| 
 | 
 | ||||||
| #ifdef DEBUG | #ifdef DEBUG | ||||||
| 	fprintf(stderr, "foreach_nfs_host_cb: key=%s, value=%s\n", opt, value); | 	fprintf(stderr, "foreach_nfs_host_cb: key=%s, value=%s\n", opt, value); | ||||||
| @ -204,10 +205,46 @@ foreach_nfs_host_cb(const char *opt, const char *value, void *pcookie) | |||||||
| 		host = host_dup; | 		host = host_dup; | ||||||
| 
 | 
 | ||||||
| 		do { | 		do { | ||||||
| 			next = strchr(host, ':'); | 			if (*host == '[') { | ||||||
| 			if (next != NULL) { | 				host++; | ||||||
| 				*next = '\0'; | 				v6Literal = strchr(host, ']'); | ||||||
| 				next++; | 				if (v6Literal == NULL) { | ||||||
|  | 					free(host_dup); | ||||||
|  | 					return (SA_SYNTAX_ERR); | ||||||
|  | 				} | ||||||
|  | 				if (v6Literal[1] == '\0') { | ||||||
|  | 					*v6Literal = '\0'; | ||||||
|  | 					next = NULL; | ||||||
|  | 				} else if (v6Literal[1] == '/') { | ||||||
|  | 					next = strchr(v6Literal + 2, ':'); | ||||||
|  | 					if (next == NULL) { | ||||||
|  | 						cidr_len = | ||||||
|  | 						    strlen(v6Literal + 1); | ||||||
|  | 						memmove(v6Literal, | ||||||
|  | 						    v6Literal + 1, | ||||||
|  | 						    cidr_len); | ||||||
|  | 						v6Literal[cidr_len] = '\0'; | ||||||
|  | 					} else { | ||||||
|  | 						cidr_len = next - v6Literal - 1; | ||||||
|  | 						memmove(v6Literal, | ||||||
|  | 						    v6Literal + 1, | ||||||
|  | 						    cidr_len); | ||||||
|  | 						v6Literal[cidr_len] = '\0'; | ||||||
|  | 						next++; | ||||||
|  | 					} | ||||||
|  | 				} else if (v6Literal[1] == ':') { | ||||||
|  | 					*v6Literal = '\0'; | ||||||
|  | 					next = v6Literal + 2; | ||||||
|  | 				} else { | ||||||
|  | 					free(host_dup); | ||||||
|  | 					return (SA_SYNTAX_ERR); | ||||||
|  | 				} | ||||||
|  | 			} else { | ||||||
|  | 				next = strchr(host, ':'); | ||||||
|  | 				if (next != NULL) { | ||||||
|  | 					*next = '\0'; | ||||||
|  | 					next++; | ||||||
|  | 				} | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
| 			error = udata->callback(udata->filename, | 			error = udata->callback(udata->filename, | ||||||
|  | |||||||
| @ -545,7 +545,7 @@ access for a set of IP addresses and to enable root access for system | |||||||
| on the | on the | ||||||
| .Ar tank/home | .Ar tank/home | ||||||
| file system: | file system: | ||||||
| .Dl # Nm zfs Cm set Sy sharenfs Ns = Ns ' Ns Ar rw Ns =@123.123.0.0/16,root= Ns Ar neo Ns ' tank/home | .Dl # Nm zfs Cm set Sy sharenfs Ns = Ns ' Ns Ar rw Ns =@123.123.0.0/16:[::1],root= Ns Ar neo Ns ' tank/home | ||||||
| .Pp | .Pp | ||||||
| If you are using DNS for host name resolution, | If you are using DNS for host name resolution, | ||||||
| specify the fully-qualified hostname. | specify the fully-qualified hostname. | ||||||
|  | |||||||
| @ -53,7 +53,7 @@ tags = ['functional', 'cli_root', 'zfs_mount'] | |||||||
| 
 | 
 | ||||||
| [tests/functional/cli_root/zfs_share:Linux] | [tests/functional/cli_root/zfs_share:Linux] | ||||||
| tests = ['zfs_share_005_pos', 'zfs_share_007_neg', 'zfs_share_009_neg', | tests = ['zfs_share_005_pos', 'zfs_share_007_neg', 'zfs_share_009_neg', | ||||||
|     'zfs_share_012_pos'] |     'zfs_share_012_pos', 'zfs_share_013_pos'] | ||||||
| tags = ['functional', 'cli_root', 'zfs_share'] | tags = ['functional', 'cli_root', 'zfs_share'] | ||||||
| 
 | 
 | ||||||
| [tests/functional/cli_root/zfs_sysfs:Linux] | [tests/functional/cli_root/zfs_sysfs:Linux] | ||||||
|  | |||||||
| @ -14,6 +14,7 @@ dist_pkgdata_SCRIPTS = \ | |||||||
| 	zfs_share_010_neg.ksh \
 | 	zfs_share_010_neg.ksh \
 | ||||||
| 	zfs_share_011_pos.ksh \
 | 	zfs_share_011_pos.ksh \
 | ||||||
| 	zfs_share_012_pos.ksh \
 | 	zfs_share_012_pos.ksh \
 | ||||||
|  | 	zfs_share_013_pos.ksh \
 | ||||||
| 	zfs_share_concurrent_shares.ksh | 	zfs_share_concurrent_shares.ksh | ||||||
| 
 | 
 | ||||||
| dist_pkgdata_DATA = \
 | dist_pkgdata_DATA = \
 | ||||||
|  | |||||||
| @ -51,7 +51,7 @@ function cleanup { | |||||||
| 
 | 
 | ||||||
| set -A badopts \ | set -A badopts \ | ||||||
|     "r0" "r0=machine1" "r0=machine1:machine2" \ |     "r0" "r0=machine1" "r0=machine1:machine2" \ | ||||||
|     "-g" "-b" "-c" "-d" "--invalid" \ |     "-g" "-b" "-c" "-d" "--invalid" "rw=[::1]a:[::2]" "rw=[::1" \ | ||||||
|     "$TESTPOOL" "$TESTPOOL/$TESTFS" "$TESTPOOL\$TESTCTR\$TESTFS1" |     "$TESTPOOL" "$TESTPOOL/$TESTFS" "$TESTPOOL\$TESTCTR\$TESTFS1" | ||||||
| 
 | 
 | ||||||
| log_assert "Verify that invalid share parameters and options are caught." | log_assert "Verify that invalid share parameters and options are caught." | ||||||
|  | |||||||
							
								
								
									
										80
									
								
								tests/zfs-tests/tests/functional/cli_root/zfs_share/zfs_share_013_pos.ksh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										80
									
								
								tests/zfs-tests/tests/functional/cli_root/zfs_share/zfs_share_013_pos.ksh
									
									
									
									
									
										Executable file
									
								
							| @ -0,0 +1,80 @@ | |||||||
|  | #!/bin/ksh -p | ||||||
|  | # | ||||||
|  | # CDDL HEADER START | ||||||
|  | # | ||||||
|  | # The contents of this file are subject to the terms of the | ||||||
|  | # Common Development and Distribution License (the "License"). | ||||||
|  | # You may not use this file except in compliance with the License. | ||||||
|  | # | ||||||
|  | # You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE | ||||||
|  | # or http://www.opensolaris.org/os/licensing. | ||||||
|  | # See the License for the specific language governing permissions | ||||||
|  | # and limitations under the License. | ||||||
|  | # | ||||||
|  | # When distributing Covered Code, include this CDDL HEADER in each | ||||||
|  | # file and include the License file at usr/src/OPENSOLARIS.LICENSE. | ||||||
|  | # If applicable, add the following below this CDDL HEADER, with the | ||||||
|  | # fields enclosed by brackets "[]" replaced with your own identifying | ||||||
|  | # information: Portions Copyright [yyyy] [name of copyright owner] | ||||||
|  | # | ||||||
|  | # CDDL HEADER END | ||||||
|  | # | ||||||
|  | 
 | ||||||
|  | # | ||||||
|  | # Copyright (c) 2020, Felix Dörre | ||||||
|  | # | ||||||
|  | 
 | ||||||
|  | . $STF_SUITE/include/libtest.shlib | ||||||
|  | 
 | ||||||
|  | # | ||||||
|  | # DESCRIPTION: | ||||||
|  | # Verify that NFS share options including ipv6 literals are parsed and propagated correctly. | ||||||
|  | # | ||||||
|  | 
 | ||||||
|  | verify_runnable "global" | ||||||
|  | 
 | ||||||
|  | function cleanup | ||||||
|  | { | ||||||
|  | 	log_must zfs set sharenfs=off $TESTPOOL/$TESTFS | ||||||
|  | 	is_shared $TESTPOOL/$TESTFS && \ | ||||||
|  | 		log_must unshare_fs $TESTPOOL/$TESTFS | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | log_onexit cleanup | ||||||
|  | 
 | ||||||
|  | cleanup | ||||||
|  | 
 | ||||||
|  | log_must zfs set sharenfs="rw=[::1]" $TESTPOOL/$TESTFS | ||||||
|  | output=$(showshares_nfs 2>&1) | ||||||
|  | log_must grep "::1(" <<< "$output" > /dev/null | ||||||
|  | 
 | ||||||
|  | log_must zfs set sharenfs="rw=[2::3]" $TESTPOOL/$TESTFS | ||||||
|  | output=$(showshares_nfs 2>&1) | ||||||
|  | log_must grep "2::3(" <<< "$output" > /dev/null | ||||||
|  | 
 | ||||||
|  | log_must zfs set sharenfs="rw=[::1]:[2::3]" $TESTPOOL/$TESTFS | ||||||
|  | output=$(showshares_nfs 2>&1) | ||||||
|  | log_must grep "::1(" <<< "$output" > /dev/null | ||||||
|  | log_must grep "2::3(" <<< "$output" > /dev/null | ||||||
|  | 
 | ||||||
|  | log_must zfs set sharenfs="rw=[::1]/64" $TESTPOOL/$TESTFS | ||||||
|  | output=$(showshares_nfs 2>&1) | ||||||
|  | log_must grep "::1/64(" <<< "$output" > /dev/null | ||||||
|  | 
 | ||||||
|  | log_must zfs set sharenfs="rw=[2::3]/128" $TESTPOOL/$TESTFS | ||||||
|  | output=$(showshares_nfs 2>&1) | ||||||
|  | log_must grep "2::3/128(" <<< "$output" > /dev/null | ||||||
|  | 
 | ||||||
|  | log_must zfs set sharenfs="rw=[::1]/32:[2::3]/128" $TESTPOOL/$TESTFS | ||||||
|  | output=$(showshares_nfs 2>&1) | ||||||
|  | log_must grep "::1/32(" <<< "$output" > /dev/null | ||||||
|  | log_must grep "2::3/128(" <<< "$output" > /dev/null | ||||||
|  | 
 | ||||||
|  | log_must zfs set sharenfs="rw=[::1]:[2::3]/64:[2a01:1234:1234:1234:aa34:234:1234:1234]:1.2.3.4/24" $TESTPOOL/$TESTFS | ||||||
|  | output=$(showshares_nfs 2>&1) | ||||||
|  | log_must grep "::1(" <<< "$output" > /dev/null | ||||||
|  | log_must grep "2::3/64(" <<< "$output" > /dev/null | ||||||
|  | log_must grep "2a01:1234:1234:1234:aa34:234:1234:1234(" <<< "$output" > /dev/null | ||||||
|  | log_must grep "1\\.2\\.3\\.4/24(" <<< "$output" > /dev/null | ||||||
|  | 
 | ||||||
|  | log_pass "NFS share ip address propagated correctly." | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 felixdoerre
						felixdoerre