Merge pull request #315 from LabNConsulting/working/master/patch/bgp-startup

Restore functionality broken/overridden by 857b544649
This commit is contained in:
Donald Sharp 2017-04-18 12:14:58 -04:00 committed by GitHub
commit de72643d15
2 changed files with 16 additions and 3 deletions

View File

@ -66,6 +66,7 @@ static const struct option longopts[] =
{ "listenon", required_argument, NULL, 'l'}, { "listenon", required_argument, NULL, 'l'},
{ "retain", no_argument, NULL, 'r'}, { "retain", no_argument, NULL, 'r'},
{ "no_kernel", no_argument, NULL, 'n'}, { "no_kernel", no_argument, NULL, 'n'},
{ "skip_runas", no_argument, NULL, 'S'},
{ "ecmp", required_argument, NULL, 'e'}, { "ecmp", required_argument, NULL, 'e'},
{ 0 } { 0 }
}; };
@ -151,7 +152,8 @@ sigint (void)
if (! retain_mode) if (! retain_mode)
{ {
bgp_terminate (); bgp_terminate ();
zprivs_terminate (&bgpd_privs); if (bgpd_privs.user) /* NULL if skip_runas flag set */
zprivs_terminate (&bgpd_privs);
} }
bgp_exit (0); bgp_exit (0);
@ -363,6 +365,8 @@ main (int argc, char **argv)
int bgp_port = BGP_PORT_DEFAULT; int bgp_port = BGP_PORT_DEFAULT;
char *bgp_address = NULL; char *bgp_address = NULL;
int no_fib_flag = 0;
int skip_runas = 0;
frr_preinit(&bgpd_di, argc, argv); frr_preinit(&bgpd_di, argc, argv);
frr_opt_add("p:l:rne:", longopts, frr_opt_add("p:l:rne:", longopts,
@ -370,6 +374,7 @@ main (int argc, char **argv)
" -l, --listenon Listen on specified address (implies -n)\n" " -l, --listenon Listen on specified address (implies -n)\n"
" -r, --retain When program terminates, retain added route by bgpd.\n" " -r, --retain When program terminates, retain added route by bgpd.\n"
" -n, --no_kernel Do not install route to kernel.\n" " -n, --no_kernel Do not install route to kernel.\n"
" -S, --skip_runas Skip capabilities checks, and changing user and group IDs.\n"
" -e, --ecmp Specify ECMP to use.\n"); " -e, --ecmp Specify ECMP to use.\n");
/* Command line argument treatment. */ /* Command line argument treatment. */
@ -389,7 +394,7 @@ main (int argc, char **argv)
if (tmp_port <= 0 || tmp_port > 0xffff) if (tmp_port <= 0 || tmp_port > 0xffff)
bgp_port = BGP_PORT_DEFAULT; bgp_port = BGP_PORT_DEFAULT;
else else
bm->port = tmp_port; bgp_port = tmp_port;
break; break;
case 'e': case 'e':
multipath_num = atoi (optarg); multipath_num = atoi (optarg);
@ -406,18 +411,25 @@ main (int argc, char **argv)
bgp_address = optarg; bgp_address = optarg;
/* listenon implies -n */ /* listenon implies -n */
case 'n': case 'n':
bgp_option_set (BGP_OPT_NO_FIB); no_fib_flag = 1;
break;
case 'S':
skip_runas = 1;
break; break;
default: default:
frr_help_exit (1); frr_help_exit (1);
break; break;
} }
} }
if (skip_runas)
memset (&bgpd_privs, 0, sizeof (bgpd_privs));
/* BGP master init. */ /* BGP master init. */
bgp_master_init (frr_init ()); bgp_master_init (frr_init ());
bm->port = bgp_port; bm->port = bgp_port;
bm->address = bgp_address; bm->address = bgp_address;
if (no_fib_flag)
bgp_option_set (BGP_OPT_NO_FIB);
/* Initializations. */ /* Initializations. */
bgp_vrf_init (); bgp_vrf_init ();

View File

@ -769,6 +769,7 @@ zprivs_init(struct zebra_privs_t *zprivs)
} }
} }
zprivs_state.zsuid = geteuid(); /* initial uid */
/* add groups only if we changed uid - otherwise skip */ /* add groups only if we changed uid - otherwise skip */
if ((ngroups) && (zprivs_state.zsuid != zprivs_state.zuid)) if ((ngroups) && (zprivs_state.zsuid != zprivs_state.zuid))
{ {