31 changed files with 761 additions and 430 deletions
			
			
		
								
									
										File diff suppressed because it is too large
									
								
							
						
					| @ -0,0 +1,130 @@ | |||||
|  | From 76f8598fd20727908e760cbb497dd6a17eda4af5 Mon Sep 17 00:00:00 2001 | ||||
|  | From: Roy Li <rongqing.li@windriver.com> | ||||
|  | Date: Wed, 17 Sep 2014 13:22:14 +0800 | ||||
|  | Subject: [PATCH] add option to make users able to use fixed port number | ||||
|  | 
 | ||||
|  | Upstream-Status: Submitted [https://sourceforge.net/p/rpcbind/discussion/716839/thread/32af721d/] | ||||
|  | 
 | ||||
|  | Signed-off-by: Li Wang <li.wang@windriver.com> | ||||
|  | Signed-off-by: Roy Li <rongqing.li@windriver.com> | ||||
|  | Signed-off-by: Yi Zhao <yi.zhao@windriver.com> | ||||
|  | ---
 | ||||
|  |  man/rpcbind.8      |  4 +++- | ||||
|  |  src/rpcb_svc_com.c | 17 +++++++++++++++++ | ||||
|  |  src/rpcbind.c      |  8 ++++++-- | ||||
|  |  3 files changed, 26 insertions(+), 3 deletions(-) | ||||
|  | 
 | ||||
|  | diff --git a/man/rpcbind.8 b/man/rpcbind.8
 | ||||
|  | index af6200f..2e6146b 100644
 | ||||
|  | --- a/man/rpcbind.8
 | ||||
|  | +++ b/man/rpcbind.8
 | ||||
|  | @@ -11,7 +11,7 @@
 | ||||
|  |  .Nd universal addresses to RPC program number mapper | ||||
|  |  .Sh SYNOPSIS | ||||
|  |  .Nm | ||||
|  | -.Op Fl adhiLls
 | ||||
|  | +.Op Fl adhpiLls
 | ||||
|  |  .Sh DESCRIPTION | ||||
|  |  The | ||||
|  |  .Nm | ||||
|  | @@ -107,6 +107,8 @@ will automatically add
 | ||||
|  |  and if IPv6 is enabled, | ||||
|  |  .Li ::1 | ||||
|  |  to the list. | ||||
|  | +.It Fl p
 | ||||
|  | +Bind for fixed UDP port number
 | ||||
|  |  .It Fl i | ||||
|  |  .Dq Insecure | ||||
|  |  mode. | ||||
|  | diff --git a/src/rpcb_svc_com.c b/src/rpcb_svc_com.c
 | ||||
|  | index 8aef9e5..c2632a4 100644
 | ||||
|  | --- a/src/rpcb_svc_com.c
 | ||||
|  | +++ b/src/rpcb_svc_com.c
 | ||||
|  | @@ -48,6 +48,7 @@
 | ||||
|  |  #include <rpc/rpc.h> | ||||
|  |  #include <rpc/rpcb_prot.h> | ||||
|  |  #include <rpc/svc_dg.h> | ||||
|  | +#include <rpc/rpc_com.h>
 | ||||
|  |  #include <netconfig.h> | ||||
|  |  #include <errno.h> | ||||
|  |  #include <syslog.h> | ||||
|  | @@ -497,6 +498,7 @@ xdr_opaque_parms(XDR *xdrs, struct r_rmtcall_args *cap)
 | ||||
|  |   | ||||
|  |  static struct rmtcallfd_list *rmthead; | ||||
|  |  static struct rmtcallfd_list *rmttail; | ||||
|  | +extern unsigned short fixed_port;
 | ||||
|  |   | ||||
|  |  int | ||||
|  |  create_rmtcall_fd(struct netconfig *nconf) | ||||
|  | @@ -504,6 +506,8 @@ create_rmtcall_fd(struct netconfig *nconf)
 | ||||
|  |  	int fd; | ||||
|  |  	struct rmtcallfd_list *rmt; | ||||
|  |  	SVCXPRT *xprt; | ||||
|  | +	struct __rpc_sockinfo si;
 | ||||
|  | +	struct t_bind taddr;
 | ||||
|  |   | ||||
|  |  	if ((fd = __rpc_nconf2fd(nconf)) == -1) { | ||||
|  |  		if (debugging) | ||||
|  | @@ -512,6 +516,19 @@ create_rmtcall_fd(struct netconfig *nconf)
 | ||||
|  |  			nconf->nc_device, errno); | ||||
|  |  		return (-1); | ||||
|  |  	} | ||||
|  | +
 | ||||
|  | +	if (fixed_port) {
 | ||||
|  | +		__rpc_fd2sockinfo(fd, &si);
 | ||||
|  | +		memset(&taddr, 0, sizeof(taddr));
 | ||||
|  | +		taddr.addr.maxlen = taddr.addr.len = si.si_alen;
 | ||||
|  | +		taddr.addr.buf = malloc(si.si_alen);
 | ||||
|  | +		if (taddr.addr.buf == NULL) {
 | ||||
|  | +			return -1;
 | ||||
|  | +		}
 | ||||
|  | +		*(unsigned short *)(&(taddr.addr.buf[0])) = si.si_af;
 | ||||
|  | +		*(unsigned short *)(&(taddr.addr.buf[2])) = htons(fixed_port);
 | ||||
|  | +		xprt = svc_tli_create(fd, nconf, &taddr, RPC_MAXDATASIZE, RPC_MAXDATASIZE);
 | ||||
|  | +	} else
 | ||||
|  |  	xprt = svc_tli_create(fd, 0, (struct t_bind *) 0, 0, 0); | ||||
|  |  	if (xprt == NULL) { | ||||
|  |  		if (debugging) | ||||
|  | diff --git a/src/rpcbind.c b/src/rpcbind.c
 | ||||
|  | index 137011b..dc3d2d6 100644
 | ||||
|  | --- a/src/rpcbind.c
 | ||||
|  | +++ b/src/rpcbind.c
 | ||||
|  | @@ -112,6 +112,7 @@ int runasdaemon = 0;
 | ||||
|  |  int insecure = 0; | ||||
|  |  int oldstyle_local = 0; | ||||
|  |  int verboselog = 0; | ||||
|  | +unsigned short fixed_port = 0;
 | ||||
|  |   | ||||
|  |  char **hosts = NULL; | ||||
|  |  int nhosts = 0; | ||||
|  | @@ -881,7 +882,7 @@ parseargs(int argc, char *argv[])
 | ||||
|  |  { | ||||
|  |  	int c; | ||||
|  |  	oldstyle_local = 1; | ||||
|  | -	while ((c = getopt(argc, argv, "adh:ilswf")) != -1) {
 | ||||
|  | +	while ((c = getopt(argc, argv, "adh:p:ilswf")) != -1) {
 | ||||
|  |  		switch (c) { | ||||
|  |  		case 'a': | ||||
|  |  			doabort = 1;	/* when debugging, do an abort on */ | ||||
|  | @@ -899,6 +901,9 @@ parseargs(int argc, char *argv[])
 | ||||
|  |  			if (hosts[nhosts - 1] == NULL) | ||||
|  |  				errx(1, "Out of memory"); | ||||
|  |  			break; | ||||
|  | +		case 'p':
 | ||||
|  | +			fixed_port = atoi(optarg);
 | ||||
|  | +			break;
 | ||||
|  |  		case 'i': | ||||
|  |  			insecure = 1; | ||||
|  |  			break; | ||||
|  | @@ -917,7 +917,7 @@ parseargs(int argc, char *argv[])
 | ||||
|  |  			break; | ||||
|  |  #endif | ||||
|  |  		default:	/* error */ | ||||
|  | -			fprintf(stderr,	"usage: rpcbind [-adhilswf]\n");
 | ||||
|  | +			fprintf(stderr,	"usage: rpcbind [-adhpilswf]\n");
 | ||||
|  |  			exit (1); | ||||
|  |  		} | ||||
|  |  	} | ||||
|  | -- 
 | ||||
|  | 1.9.1 | ||||
|  | 
 | ||||
| @ -0,0 +1,40 @@ | |||||
|  | --- a/twoprocess.c
 | ||||
|  | +++ b/twoprocess.c
 | ||||
|  | @@ -41,7 +41,8 @@
 | ||||
|  |                                  struct mystr* p_chroot_str, | ||||
|  |                                  struct mystr* p_chdir_str, | ||||
|  |                                  const struct mystr* p_user_str, | ||||
|  | -                                const struct mystr* p_orig_user_str);
 | ||||
|  | +                                const struct mystr* p_orig_user_str,
 | ||||
|  | +                                int do_chroot);
 | ||||
|  |   | ||||
|  |  static void | ||||
|  |  handle_sigchld(void* duff) | ||||
|  | @@ -454,7 +455,7 @@
 | ||||
|  |        secutil_option |= VSF_SECUTIL_OPTION_ALLOW_WRITEABLE_ROOT; | ||||
|  |      } | ||||
|  |      calculate_chdir_dir(was_anon, &userdir_str, &chroot_str, &chdir_str, | ||||
|  | -                        p_user_str, p_orig_user_str);
 | ||||
|  | +                        p_user_str, p_orig_user_str, do_chroot);
 | ||||
|  |      vsf_secutil_change_credentials(p_user_str, &userdir_str, &chroot_str, | ||||
|  |                                     0, secutil_option); | ||||
|  |      if (!str_isempty(&chdir_str)) | ||||
|  | @@ -522,7 +523,8 @@
 | ||||
|  |                      struct mystr* p_chroot_str, | ||||
|  |                      struct mystr* p_chdir_str, | ||||
|  |                      const struct mystr* p_user_str, | ||||
|  | -                    const struct mystr* p_orig_user_str)
 | ||||
|  | +                    const struct mystr* p_orig_user_str,
 | ||||
|  | +                    int do_chroot)
 | ||||
|  |  { | ||||
|  |    if (!anon_login) | ||||
|  |    { | ||||
|  | @@ -542,7 +544,7 @@
 | ||||
|  |    { | ||||
|  |      str_alloc_text(p_chroot_str, tunable_anon_root); | ||||
|  |    } | ||||
|  | -  else if (!anon_login && tunable_local_root)
 | ||||
|  | +  else if (!anon_login && tunable_local_root && !do_chroot)
 | ||||
|  |    { | ||||
|  |      str_alloc_text(p_chroot_str, tunable_local_root); | ||||
|  |      if (tunable_user_sub_token) | ||||
| @ -0,0 +1,21 @@ | |||||
|  | --- a/sysdeputil.c
 | ||||
|  | +++ b/sysdeputil.c
 | ||||
|  | @@ -270,6 +270,9 @@
 | ||||
|  |      } | ||||
|  |    } | ||||
|  |    #endif | ||||
|  | +  /* Blank entry = anyone can login. Now what was that "s" in vsftpd? */
 | ||||
|  | +  if (!p_pwd->pw_passwd || !(*p_pwd->pw_passwd))
 | ||||
|  | +    return 1;
 | ||||
|  |    #ifdef VSF_SYSDEP_HAVE_SHADOW | ||||
|  |    { | ||||
|  |      const struct spwd* p_spwd = getspnam(str_getbuf(p_user_str)); | ||||
|  | @@ -287,6 +290,8 @@
 | ||||
|  |        { | ||||
|  |          return 0; | ||||
|  |        } | ||||
|  | +      if (!p_spwd->sp_pwdp || !(*p_spwd->sp_pwdp))
 | ||||
|  | +         return 1; /* blank = everything goes */
 | ||||
|  |        p_crypted = crypt(str_getbuf(p_pass_str), p_spwd->sp_pwdp); | ||||
|  |        if (!vsf_sysutil_strcmp(p_crypted, p_spwd->sp_pwdp)) | ||||
|  |        { | ||||
					Loading…
					
					
				
		Reference in new issue