View | Details | Raw Unified | Return to bug 13049
Collapse All | Expand All

(-)nfs_syscalls.c (-18 / +7 lines)
Lines 86-92 Link Here
86
extern struct nfsstats nfsstats;
86
extern struct nfsstats nfsstats;
87
extern int nfsrvw_procrastinate;
87
extern int nfsrvw_procrastinate;
88
extern int nfsrvw_procrastinate_v3;
88
extern int nfsrvw_procrastinate_v3;
89
struct nfssvc_sock *nfs_udpsock, *nfs_cltpsock;
89
struct nfssvc_sock *nfs_cltpsock;
90
static int nuidhash_max = NFS_MAXUIDHASH;
90
static int nuidhash_max = NFS_MAXUIDHASH;
91
91
92
#ifndef NFS_NOSERVER
92
#ifndef NFS_NOSERVER
Lines 372-399 Link Here
372
	/*
372
	/*
373
	 * Add it to the list, as required.
373
	 * Add it to the list, as required.
374
	 */
374
	 */
375
	if (so->so_proto->pr_protocol == IPPROTO_UDP) {
376
		tslp = nfs_udpsock;
377
		if (tslp->ns_flag & SLP_VALID) {
378
			FREE(mynam, M_SONAME);
379
			return (EPERM);
380
		}
381
#ifdef ISO
375
#ifdef ISO
382
	} else if (so->so_proto->pr_protocol == ISOPROTO_CLTP) {
376
	if (so->so_proto->pr_protocol == ISOPROTO_CLTP) {
383
		tslp = nfs_cltpsock;
377
		tslp = nfs_cltpsock;
384
		if (tslp->ns_flag & SLP_VALID) {
378
		if (tslp->ns_flag & SLP_VALID) {
385
			FREE(mynam, M_SONAME);
379
			if (mynam != NULL)
380
				FREE(mynam, M_SONAME);
386
			return (EPERM);
381
			return (EPERM);
387
		}
382
		}
388
#endif /* ISO */
389
	}
383
	}
384
#endif /* ISO */
390
	if (so->so_type == SOCK_STREAM)
385
	if (so->so_type == SOCK_STREAM)
391
		siz = NFS_MAXPACKET + sizeof (u_long);
386
		siz = NFS_MAXPACKET + sizeof (u_long);
392
	else
387
	else
393
		siz = NFS_MAXPACKET;
388
		siz = NFS_MAXPACKET;
394
	error = soreserve(so, siz, siz);
389
	error = soreserve(so, siz, siz);
395
	if (error) {
390
	if (error) {
396
		FREE(mynam, M_SONAME);
391
		if (mynam != NULL)
392
			FREE(mynam, M_SONAME);
397
		return (error);
393
		return (error);
398
	}
394
	}
399
395
Lines 898-910 Link Here
898
894
899
	TAILQ_INIT(&nfsd_head);
895
	TAILQ_INIT(&nfsd_head);
900
	nfsd_head_flag &= ~NFSD_CHECKSLP;
896
	nfsd_head_flag &= ~NFSD_CHECKSLP;
901
902
	nfs_udpsock = (struct nfssvc_sock *)
903
	    malloc(sizeof (struct nfssvc_sock), M_NFSSVC, M_WAITOK);
904
	bzero((caddr_t)nfs_udpsock, sizeof (struct nfssvc_sock));
905
	STAILQ_INIT(&nfs_udpsock->ns_rec);
906
	TAILQ_INIT(&nfs_udpsock->ns_uidlruhead);
907
	TAILQ_INSERT_HEAD(&nfssvc_sockhead, nfs_udpsock, ns_chain);
908
897
909
	nfs_cltpsock = (struct nfssvc_sock *)
898
	nfs_cltpsock = (struct nfssvc_sock *)
910
	    malloc(sizeof (struct nfssvc_sock), M_NFSSVC, M_WAITOK);
899
	    malloc(sizeof (struct nfssvc_sock), M_NFSSVC, M_WAITOK);
(-)nfs_nqlease.c (-5 / +8 lines)
Lines 138-144 Link Here
138
138
139
extern nfstype nfsv2_type[9];
139
extern nfstype nfsv2_type[9];
140
extern nfstype nfsv3_type[9];
140
extern nfstype nfsv3_type[9];
141
extern struct nfssvc_sock *nfs_udpsock, *nfs_cltpsock;
141
extern struct nfssvc_sock *nfs_cltpsock;
142
extern int nfsd_waiting;
142
extern int nfsd_waiting;
143
extern struct nfsstats nfsstats;
143
extern struct nfsstats nfsstats;
144
144
Lines 384-394 Link Here
384
384
385
	if (slp == NQLOCALSLP)
385
	if (slp == NQLOCALSLP)
386
		lph->lph_flag |= (LC_VALID | LC_LOCAL);
386
		lph->lph_flag |= (LC_VALID | LC_LOCAL);
387
	else if (slp == nfs_udpsock) {
387
	else if (slp->ns_so->so_proto->pr_protocol == IPPROTO_UDP) {
388
		saddr = (struct sockaddr_in *)nam;
388
		saddr = (struct sockaddr_in *)nam;
389
		lph->lph_flag |= (LC_VALID | LC_UDP);
389
		lph->lph_flag |= (LC_VALID | LC_UDP | LC_SREF);
390
		lph->lph_inetaddr = saddr->sin_addr.s_addr;
390
		lph->lph_inetaddr = saddr->sin_addr.s_addr;
391
		lph->lph_port = saddr->sin_port;
391
		lph->lph_port = saddr->sin_port;
392
		lph->lph_slp = slp;
393
		slp->ns_sref++;
392
	} else if (slp == nfs_cltpsock) {
394
	} else if (slp == nfs_cltpsock) {
393
		lph->lph_nam = dup_sockaddr(nam, 1);
395
		lph->lph_nam = dup_sockaddr(nam, 1);
394
		lph->lph_flag |= (LC_VALID | LC_CLTP);
396
		lph->lph_flag |= (LC_VALID | LC_CLTP);
Lines 458-464 Link Here
458
		else
460
		else
459
			return (0);
461
			return (0);
460
	}
462
	}
461
	if (slp == nfs_udpsock || slp == nfs_cltpsock)
463
	if (slp->ns_so->so_proto->pr_protocol == IPPROTO_UDP ||
464
	    slp == nfs_cltpsock)
462
		addr = nam;
465
		addr = nam;
463
	else
466
	else
464
		addr = slp->ns_nam;
467
		addr = slp->ns_nam;
Lines 517-523 Link Here
517
				saddr->sin_family = AF_INET;
520
				saddr->sin_family = AF_INET;
518
				saddr->sin_addr.s_addr = lph->lph_inetaddr;
521
				saddr->sin_addr.s_addr = lph->lph_inetaddr;
519
				saddr->sin_port = lph->lph_port;
522
				saddr->sin_port = lph->lph_port;
520
				so = nfs_udpsock->ns_so;
523
				so = lph->lph_slp->ns_so;
521
			} else if (lph->lph_flag & LC_CLTP) {
524
			} else if (lph->lph_flag & LC_CLTP) {
522
				nam2 = lph->lph_nam;
525
				nam2 = lph->lph_nam;
523
				so = nfs_cltpsock->ns_so;
526
				so = nfs_cltpsock->ns_so;
(-)nfsd.c (-21 / +153 lines)
Lines 52-57 Link Here
52
#include <sys/syslog.h>
52
#include <sys/syslog.h>
53
#include <sys/wait.h>
53
#include <sys/wait.h>
54
#include <sys/mount.h>
54
#include <sys/mount.h>
55
#include <sys/sysctl.h>
55
56
56
#include <rpc/rpc.h>
57
#include <rpc/rpc.h>
57
#include <rpc/pmap_clnt.h>
58
#include <rpc/pmap_clnt.h>
Lines 62-67 Link Here
62
#include <nfs/rpcv2.h>
63
#include <nfs/rpcv2.h>
63
#include <nfs/nfsproto.h>
64
#include <nfs/nfsproto.h>
64
#include <nfs/nfs.h>
65
#include <nfs/nfs.h>
66
#include <net/if.h>
67
#include <net/route.h>
68
#include <arpa/inet.h>
65
69
66
#ifdef NFSKERB
70
#ifdef NFSKERB
67
#include <kerberosIV/des.h>
71
#include <kerberosIV/des.h>
Lines 110-115 Link Here
110
#endif
114
#endif
111
#endif
115
#endif
112
void	usage __P((void));
116
void	usage __P((void));
117
int	get_ifaddrs __P((struct in_addr **));
113
118
114
/*
119
/*
115
 * Nfs server daemon mostly just a user context for nfssvc()
120
 * Nfs server daemon mostly just a user context for nfssvc()
Lines 143-149 Link Here
143
#endif
148
#endif
144
	fd_set ready, sockbits;
149
	fd_set ready, sockbits;
145
	int ch, cltpflag, connect_type_cnt, i, len, maxsock, msgsock;
150
	int ch, cltpflag, connect_type_cnt, i, len, maxsock, msgsock;
146
	int nfsdcnt, nfssvc_flag, on, reregister, sock, tcpflag, tcpsock;
151
	int nfsdcnt, nfssvc_flag, on, reregister, tcpflag, tcpsock;
147
	int tp4cnt, tp4flag, tpipcnt, tpipflag, udpflag;
152
	int tp4cnt, tp4flag, tpipcnt, tpipflag, udpflag;
148
#ifdef notyet
153
#ifdef notyet
149
	int tp4sock, tpipsock;
154
	int tp4sock, tpipsock;
Lines 375-406 Link Here
375
380
376
	/* If we are serving udp, set up the socket. */
381
	/* If we are serving udp, set up the socket. */
377
	if (udpflag) {
382
	if (udpflag) {
378
		if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
383
		struct in_addr *ifaddr_list;
379
			syslog(LOG_ERR, "can't create udp socket");
384
		int i;
380
			exit(1);
385
		int ifaddr_count;
381
		}
386
382
		inetaddr.sin_family = AF_INET;
387
383
		inetaddr.sin_addr.s_addr = INADDR_ANY;
388
		ifaddr_count = get_ifaddrs(&ifaddr_list);
384
		inetaddr.sin_port = htons(NFS_PORT);
389
385
		inetaddr.sin_len = sizeof(inetaddr);
390
		for (i = 0; i < ifaddr_count; i++) {
386
		if (bind(sock,
391
			int on = 1;
387
		    (struct sockaddr *)&inetaddr, sizeof(inetaddr)) < 0) {
392
			int sock;
388
			syslog(LOG_ERR, "can't bind udp addr");
393
389
			exit(1);
394
			if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
395
				syslog(LOG_ERR, "can't create udp socket: %m");
396
				exit(1);
397
			}
398
			if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &on,
399
			    sizeof(on)) != 0) {
400
				syslog(LOG_ERR, "setsockopt failed: %m");
401
				exit(1);
402
			}
403
			bzero(&inetaddr, sizeof(inetaddr));
404
			inetaddr.sin_family = AF_INET;
405
			inetaddr.sin_addr.s_addr = ifaddr_list[i].s_addr;
406
			inetaddr.sin_port = htons(NFS_PORT);
407
			inetaddr.sin_len = sizeof(inetaddr);
408
			if (bind(sock, (struct sockaddr *)&inetaddr,
409
			    sizeof(inetaddr)) < 0) {
410
				syslog(LOG_ERR, "can't bind udp addr %s: %m",
411
				    ifaddr_list[i].s_addr == INADDR_ANY ?
412
				    "INADDR_ANY" : inet_ntoa(ifaddr_list[i]));
413
				exit(1);
414
			}
415
416
			nfsdargs.sock = sock;
417
			nfsdargs.name = NULL;
418
			nfsdargs.namelen = 0;
419
			if (nfssvc(NFSSVC_ADDSOCK, &nfsdargs) < 0) {
420
				syslog(LOG_ERR, "can't add UDP socket: %m");
421
				exit(1);
422
			}
423
			(void)close(sock);
390
		}
424
		}
425
426
		free(ifaddr_list);
427
391
		if (!pmap_set(RPCPROG_NFS, 2, IPPROTO_UDP, NFS_PORT) ||
428
		if (!pmap_set(RPCPROG_NFS, 2, IPPROTO_UDP, NFS_PORT) ||
392
		    !pmap_set(RPCPROG_NFS, 3, IPPROTO_UDP, NFS_PORT)) {
429
		    !pmap_set(RPCPROG_NFS, 3, IPPROTO_UDP, NFS_PORT)) {
393
			syslog(LOG_ERR, "can't register with udp portmap");
430
			syslog(LOG_ERR, "can't register with udp portmap");
394
			exit(1);
431
			exit(1);
395
		}
432
		}
396
		nfsdargs.sock = sock;
397
		nfsdargs.name = NULL;
398
		nfsdargs.namelen = 0;
399
		if (nfssvc(NFSSVC_ADDSOCK, &nfsdargs) < 0) {
400
			syslog(LOG_ERR, "can't Add UDP socket");
401
			exit(1);
402
		}
403
		(void)close(sock);
404
	}
433
	}
405
434
406
#ifdef ISO
435
#ifdef ISO
Lines 671-673 Link Here
671
}
700
}
672
#endif	/* __FreeBSD__ */
701
#endif	/* __FreeBSD__ */
673
#endif
702
#endif
703
704
705
#define ROUNDUP(a) \
706
	((a) > 0 ? (1 + (((a) - 1) | (sizeof(long) - 1))) : sizeof(long))
707
#define ADVANCE(x) (x += ROUNDUP(((struct sockaddr *)(x))->sa_len))
708
709
/*
710
 * Get a list of local IP addresses, and store a pointer to the malloc'd
711
 * list in *ifaddrp. The first address will be INADDR_ANY as a fallback entry.
712
 * The number of entries in the list is returned.
713
 */
714
int get_ifaddrs(struct in_addr **ifaddrp) {
715
	register struct if_msghdr *ifm;
716
	register struct ifa_msghdr *ifam;
717
	struct in_addr *ifaddr;
718
	size_t needed;
719
	int mib[6], flags = 0;
720
	int adr_count;
721
	char *buf, *lim, *next;
722
723
	/* Create first address as wildcard */
724
	ifaddr = malloc(sizeof(*ifaddr));
725
	if (ifaddr == NULL) {
726
		syslog(LOG_ERR, "malloc failed");
727
		exit(1);
728
	}
729
	ifaddr->s_addr = INADDR_ANY;
730
	adr_count = 1;
731
732
	mib[0] = CTL_NET;
733
	mib[1] = PF_ROUTE;
734
	mib[2] = 0;
735
	mib[3] = AF_INET;
736
	mib[4] = NET_RT_IFLIST;
737
	mib[5] = 0;
738
	if (sysctl(mib, 6, NULL, &needed, NULL, 0) < 0) {
739
		syslog(LOG_ERR, "route-sysctl-estimate failed: %m");
740
		exit(1);
741
	}
742
	if ((buf = malloc(needed)) == NULL) {
743
		syslog(LOG_ERR, "malloc failed");
744
		exit(1);
745
	}
746
	if (sysctl(mib, 6, buf, &needed, NULL, 0) < 0) {
747
		syslog(LOG_ERR, "retrieval of interface table failed: %m");
748
		exit(1);
749
	}
750
	lim = buf + needed;
751
752
	for (next = buf; next < lim; next += ifm->ifm_msglen) {
753
		int i;
754
		char *cp, *cplim;
755
		struct sockaddr *sa;
756
		struct sockaddr_in *sin;
757
758
		ifm = (struct if_msghdr *)next;
759
		if (ifm->ifm_type == RTM_IFINFO) {
760
			flags = ifm->ifm_flags;
761
			continue;
762
		}
763
		if ((flags & IFF_UP) == 0)
764
			continue;
765
		if (ifm->ifm_type != RTM_NEWADDR)
766
			errx(1, "out of sync parsing NET_RT_IFLIST");
767
		ifam = (struct ifa_msghdr *)ifm;
768
		cp = (char *)(ifam + 1);
769
		cplim = ifam->ifam_msglen + (char *)ifam;
770
771
		/* Find the RTAX_IFA entry */
772
		for (i = 0; i < RTAX_IFA && cp < cplim; i++)
773
			if (ifam->ifam_addrs & (1 << i))
774
				ADVANCE(cp);
775
776
		if (i != RTAX_IFA || (ifam->ifam_addrs & (1 << RTAX_IFA)) == 0)
777
			continue;
778
779
		sa = (struct sockaddr *)cp;
780
		if (sa->sa_family != AF_INET)
781
			continue;
782
783
		sin = (struct sockaddr_in *)sa;
784
785
		/* Check if we've seen this address before */
786
		for (i = 0; i < adr_count; i++)
787
			if (ifaddr[i].s_addr == sin->sin_addr.s_addr)
788
				break;
789
790
		if (i < adr_count)
791
			continue;
792
793
		adr_count++;
794
		ifaddr = realloc(ifaddr, sizeof(*ifaddr) * adr_count);
795
		if (ifaddr == NULL) {
796
			syslog(LOG_ERR, "realloc failed");
797
			exit(1);
798
		}
799
		ifaddr[adr_count - 1] = sin->sin_addr;
800
	}
801
	free(buf);
802
803
	*ifaddrp = ifaddr;
804
	return adr_count;
805
}

Return to bug 13049