]> git.proxmox.com Git - mirror_frr.git/commitdiff
Merge pull request #2753 from qlyoung/fix-zebra-shutdown-crash-2
authorJafar Al-Gharaibeh <Jafaral@users.noreply.github.com>
Tue, 31 Jul 2018 15:31:55 +0000 (10:31 -0500)
committerGitHub <noreply@github.com>
Tue, 31 Jul 2018 15:31:55 +0000 (10:31 -0500)
Fix zebra shutdown crash: Round 3

1  2 
zebra/main.c

diff --combined zebra/main.c
index 0b8bc6a0a542266570c9e7da70729f6666f10cd7,8830a382f14542ae80d5d690a844cab4d7924086..4eeba8549aa13c8c67a69e8c3536a27fee9748f6
  #include "zebra/zebra_rnh.h"
  #include "zebra/zebra_pbr.h"
  
 +#if defined(HANDLE_NETLINK_FUZZING)
 +#include "zebra/kernel_netlink.h"
 +#endif /* HANDLE_NETLINK_FUZZING */
 +
  #define ZEBRA_PTM_SUPPORT
  
  /* Zebra instance */
@@@ -138,11 -134,16 +138,16 @@@ static void sigint(void
  {
        struct vrf *vrf;
        struct zebra_vrf *zvrf;
+       struct listnode *ln, *nn;
+       struct zserv *client;
  
        zlog_notice("Terminating on signal");
  
        frr_early_fini();
  
+       for (ALL_LIST_ELEMENTS(zebrad.client_list, ln, nn, client))
+               zserv_close_client(client);
        list_delete_all_node(zebrad.client_list);
        zebra_ptm_finish();
  
@@@ -217,11 -218,8 +222,11 @@@ int main(int argc, char **argv
        struct sockaddr_storage dummy;
        socklen_t dummylen;
  #if defined(HANDLE_ZAPI_FUZZING)
 -      char *fuzzing = NULL;
 -#endif
 +      char *zapi_fuzzing = NULL;
 +#endif /* HANDLE_ZAPI_FUZZING */
 +#if defined(HANDLE_NETLINK_FUZZING)
 +      char *netlink_fuzzing = NULL;
 +#endif /* HANDLE_NETLINK_FUZZING */
  
        vrf_configure_backend(VRF_BACKEND_VRF_LITE);
        logicalrouter_configure_backend(LOGICALROUTER_BACKEND_NETNS);
  #endif
  #if defined(HANDLE_ZAPI_FUZZING)
                "c:"
 -#endif
 +#endif /* HANDLE_ZAPI_FUZZING */
 +#if defined(HANDLE_NETLINK_FUZZING)
 +              "w:"
 +#endif /* HANDLE_NETLINK_FUZZING */
                ,
                longopts,
                "  -b, --batch           Runs in batch mode\n"
                "      --v6-rr-semantics Use v6 RR semantics\n"
  #endif /* HAVE_NETLINK */
  #if defined(HANDLE_ZAPI_FUZZING)
 -              "  -c <file>             Bypass normal startup and use this file for testing of zapi"
 -#endif
 +              "  -c <file>             Bypass normal startup and use this file for testing of zapi\n"
 +#endif /* HANDLE_ZAPI_FUZZING */
 +#if defined(HANDLE_NETLINK_FUZZING)
 +              "  -w <file>             Bypass normal startup and use this file for testing of netlink input\n"
 +#endif /* HANDLE_NETLINK_FUZZING */
        );
  
        while (1) {
  #endif /* HAVE_NETLINK */
  #if defined(HANDLE_ZAPI_FUZZING)
                case 'c':
 -                      fuzzing = optarg;
 +                      zapi_fuzzing = optarg;
                        break;
 -#endif
 +#endif /* HANDLE_ZAPI_FUZZING */
 +#if defined(HANDLE_NETLINK_FUZZING)
 +              case 'w':
 +                      netlink_fuzzing = optarg;
 +                      /* This ensures we are aren't writing any of the
 +                       * startup netlink messages that happen when we
 +                       * just want to read.
 +                       */
 +                      netlink_read = true;
 +                      break;
 +#endif /* HANDLE_NETLINK_FUZZING */
                default:
                        frr_help_exit(1);
                        break;
        zebra_rnh_init();
  
  #if defined(HANDLE_ZAPI_FUZZING)
 -      if (fuzzing) {
 -              zserv_read_file(fuzzing);
 +      if (zapi_fuzzing) {
 +              zserv_read_file(zapi_fuzzing);
                exit(0);
        }
 -#endif
 +#endif /* HANDLE_ZAPI_FUZZING */
 +#if defined(HANDLE_NETLINK_FUZZING)
 +      if (netlink_fuzzing) {
 +              netlink_read_init(netlink_fuzzing);
 +              exit(0);
 +      }
 +#endif /* HANDLE_NETLINK_FUZZING */
  
  
        frr_run(zebrad.master);