From 5425a217555f03f6c0aa8af371e0f7262b994a0d Mon Sep 17 00:00:00 2001 From: Quentin Young Date: Thu, 2 Jan 2020 02:01:57 -0500 Subject: [PATCH] lib: improve frr_init_fast() speeeed Aggressively disable some more things. This also disables privilege dropping, because it breaks AFL deferred mode. After this patch we can run about 10-20x faster with deferred mode! Signed-off-by: Quentin Young --- lib/libfrr.c | 24 ++++++------------------ lib/privs.c | 14 ++++++++++++++ 2 files changed, 20 insertions(+), 18 deletions(-) diff --git a/lib/libfrr.c b/lib/libfrr.c index bcbba42fc7..9409fac9f2 100644 --- a/lib/libfrr.c +++ b/lib/libfrr.c @@ -785,6 +785,7 @@ struct thread_master *frr_init(void) return master; } +#ifdef FUZZING static struct thread_master *master; struct thread_master *frr_init_fast(void) { @@ -795,30 +796,12 @@ struct thread_master *frr_init_fast(void) const char *dir; dir = di->module_path ? di->module_path : frr_moduledir; #endif - char p_instance[16] = "", p_pathspace[256] = ""; - - srandom(time(NULL)); - - if (di->instance) { - snprintf(frr_protonameinst, sizeof(frr_protonameinst), "%s[%u]", - di->logname, di->instance); - snprintf(p_instance, sizeof(p_instance), "-%d", di->instance); - } - if (di->pathspace) - snprintf(p_pathspace, sizeof(p_pathspace), "%s/", - di->pathspace); - - snprintf(config_default, sizeof(config_default), "%s%s%s%s.conf", - frr_sysconfdir, p_pathspace, di->name, p_instance); - snprintf(pidfile_default, sizeof(pidfile_default), "%s/%s%s.pid", - frr_vtydir, di->name, p_instance); #if 0 #ifdef HAVE_SQLITE3 snprintf(dbfile_default, sizeof(dbfile_default), "%s/%s%s%s.db", frr_dbdir, p_pathspace, di->name, p_instance); #endif #endif - zprivs_preinit(di->privs); openzlog(di->progname, di->logname, di->instance, @@ -826,6 +809,7 @@ struct thread_master *frr_init_fast(void) command_setup_early_logging(di->early_logging, di->early_loglevel); +#if 0 if (!frr_zclient_addr(&zclient_addr, &zclient_addr_len, frr_zclientpath)) { fprintf(stderr, "Invalid zserv socket path: %s\n", @@ -842,6 +826,7 @@ struct thread_master *frr_init_fast(void) if (di->vty_path) frr_mkdir(di->vty_path, true); } +#endif #if 0 frrmod_init(di->module); @@ -885,7 +870,9 @@ struct thread_master *frr_init_fast(void) #endif log_ref_init(); +#if 0 log_ref_vty_init(); +#endif lib_error_init(); #if 0 @@ -902,6 +889,7 @@ struct thread_master *frr_init_fast(void) return master; } +#endif const char *frr_get_progname(void) { diff --git a/lib/privs.c b/lib/privs.c index b3f51267d1..6bc9ba4534 100644 --- a/lib/privs.c +++ b/lib/privs.c @@ -273,6 +273,7 @@ static void zprivs_caps_init(struct zebra_privs_t *zprivs) /* we have caps, we have no need to ever change back the original user */ /* only change uid if we don't have the correct one */ +#ifndef FUZZING if ((zprivs_state.zuid) && (zprivs_state.zsuid != zprivs_state.zuid)) { if (setreuid(zprivs_state.zuid, zprivs_state.zuid)) { fprintf(stderr, @@ -281,6 +282,7 @@ static void zprivs_caps_init(struct zebra_privs_t *zprivs) exit(1); } } +#endif if (!zprivs_state.syscaps_p) return; @@ -312,6 +314,7 @@ static void zprivs_caps_init(struct zebra_privs_t *zprivs) /* apply caps. CAP_EFFECTIVE is cleared. we'll raise the caps as * and when, and only when, they are needed. */ +#ifndef FUZZING if (cap_set_proc(zprivs_state.caps)) { cap_t current_caps; char *current_caps_text = NULL; @@ -338,6 +341,7 @@ static void zprivs_caps_init(struct zebra_privs_t *zprivs) exit(1); } +#endif /* set methods for the caller to use */ zprivs->change = zprivs_change_caps; @@ -475,6 +479,9 @@ static struct zebra_privs_refs_t *get_privs_refs(struct zebra_privs_t *privs) struct zebra_privs_t *_zprivs_raise(struct zebra_privs_t *privs, const char *funcname) { +#ifdef FUZZING + return NULL; +#endif int save_errno = errno; struct zebra_privs_refs_t *refs; @@ -505,6 +512,9 @@ struct zebra_privs_t *_zprivs_raise(struct zebra_privs_t *privs, void _zprivs_lower(struct zebra_privs_t **privs) { +#ifdef FUZZING + return; +#endif int save_errno = errno; struct zebra_privs_refs_t *refs; @@ -649,6 +659,7 @@ void zprivs_init(struct zebra_privs_t *zprivs) zprivs_state.zsuid = geteuid(); /* initial uid */ /* add groups only if we changed uid - otherwise skip */ +#ifndef FUZZING if ((ngroups) && (zprivs_state.zsuid != zprivs_state.zuid)) { if (setgroups(ngroups, groups)) { fprintf(stderr, "privs_init: could not setgroups, %s\n", @@ -666,6 +677,7 @@ void zprivs_init(struct zebra_privs_t *zprivs) exit(1); } } +#endif #ifdef HAVE_CAPABILITIES zprivs_caps_init(zprivs); @@ -691,6 +703,7 @@ void zprivs_init(struct zebra_privs_t *zprivs) */ zprivs_state.zsuid = geteuid(); /* only change uid if we don't have the correct one */ +#ifndef FUZZING if ((zprivs_state.zuid) && (zprivs_state.zsuid != zprivs_state.zuid)) { if (setreuid(-1, zprivs_state.zuid)) { fprintf(stderr, @@ -702,6 +715,7 @@ void zprivs_init(struct zebra_privs_t *zprivs) zprivs->change = zprivs_change_uid; zprivs->current_state = zprivs_state_uid; +#endif #endif /* HAVE_CAPABILITIES */ } -- 2.39.5