]> git.puffer.fish Git - matthieu/frr.git/commitdiff
lib: improve frr_init_fast() speeeed
authorQuentin Young <qlyoung@cumulusnetworks.com>
Thu, 2 Jan 2020 07:01:57 +0000 (02:01 -0500)
committerQuentin Young <qlyoung@nvidia.com>
Mon, 15 Nov 2021 19:52:41 +0000 (14:52 -0500)
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 <qlyoung@cumulusnetworks.com>
lib/libfrr.c
lib/privs.c

index bcbba42fc77a4203965ea3470ba07a9bc3a7f795..9409fac9f24136cfecf11e530fdfe855f42bb7fc 100644 (file)
@@ -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)
 {
index b3f51267d16716e4a56d334afea64bc40bf5e0ad..6bc9ba45343cbefa36f15bba7e88c51cc5cbc94a 100644 (file)
@@ -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 */
 }