]> git.puffer.fish Git - mirror/frr.git/commitdiff
ospfd: make reason string production safer 7309/head
authorMark Stapp <mjs@voltanet.io>
Wed, 14 Oct 2020 16:51:52 +0000 (12:51 -0400)
committerMark Stapp <mjs@voltanet.io>
Wed, 14 Oct 2020 16:51:52 +0000 (12:51 -0400)
Use to-string functions for GR message codes instead of raw
string array indexing; the values used can come in packets
and are not validated.

Signed-off-by: Mark Stapp <mjs@voltanet.io>
ospfd/ospf_gr_helper.c
ospfd/ospf_gr_helper.h
ospfd/ospf_vty.c

index a7b20d1f073ef6be20ec7ec1606f298644f83c0c..391c8024046ddf58d2b813aa86b7fb6b2a520bd4 100644 (file)
 #include "ospfd/ospf_ism.h"
 #include "ospfd/ospf_gr_helper.h"
 
-const char *ospf_exit_reason_desc[] = {
+static const char * const ospf_exit_reason_desc[] = {
        "Unknown reason",
        "Helper inprogress",
        "Topology Change",
-       "Grace timer expairy",
+       "Grace timer expiry",
        "Successful graceful restart",
 };
 
-const char *ospf_restart_reason_desc[] = {
+static const char * const ospf_restart_reason_desc[] = {
        "Unknown restart",
        "Software restart",
        "Software reload/upgrade",
        "Switch to redundant control processor",
 };
 
-const char *ospf_rejected_reason_desc[] = {
+static const char * const ospf_rejected_reason_desc[] = {
        "Unknown reason",
        "Helper support disabled",
        "Neighbour is not in FULL state",
-       "Supports only planned restart but received for unplanned",
+       "Supports only planned restart but received unplanned",
        "Topo change due to change in lsa rxmt list",
        "LSA age is more than Grace interval",
 };
@@ -117,6 +117,39 @@ static void ospf_enable_rtr_hash_destroy(struct ospf *ospf)
        ospf->enable_rtr_list = NULL;
 }
 
+/*
+ * GR exit reason strings
+ */
+const char *ospf_exit_reason2str(unsigned int reason)
+{
+       if (reason < array_size(ospf_exit_reason_desc))
+               return(ospf_exit_reason_desc[reason]);
+       else
+               return "Invalid reason";
+}
+
+/*
+ * GR restart reason strings
+ */
+const char *ospf_restart_reason2str(unsigned int reason)
+{
+       if (reason < array_size(ospf_restart_reason_desc))
+               return(ospf_restart_reason_desc[reason]);
+       else
+               return "Invalid reason";
+}
+
+/*
+ * GR rejected reason strings
+ */
+const char *ospf_rejected_reason2str(unsigned int reason)
+{
+       if (reason < array_size(ospf_rejected_reason_desc))
+               return(ospf_rejected_reason_desc[reason]);
+       else
+               return "Invalid reason";
+}
+
 /*
  * Initialize GR helper config data structures.
  *
@@ -306,7 +339,8 @@ int ospf_process_grace_lsa(struct ospf *ospf, struct ospf_lsa *lsa,
                zlog_debug(
                        "%s, Grace LSA received from %s, grace interval:%u, restartreason :%s",
                        __PRETTY_FUNCTION__, inet_ntoa(restart_addr),
-                       grace_interval, ospf_restart_reason_desc[restart_reason]);
+                       grace_interval,
+                       ospf_restart_reason2str(restart_reason));
 
        /* Incase of broadcast links, if RESTARTER is DR_OTHER,
         * grace LSA might be received from DR, so need to get
@@ -598,7 +632,7 @@ void ospf_gr_helper_exit(struct ospf_neighbor *nbr,
        if (IS_DEBUG_OSPF_GR_HELPER)
                zlog_debug("%s, Exiting from HELPER support to %s, due to %s",
                           __PRETTY_FUNCTION__, inet_ntoa(nbr->src),
-                          ospf_exit_reason_desc[reason]);
+                          ospf_exit_reason2str(reason));
 
        /* Reset helper status*/
        nbr->gr_helper_info.gr_helper_status = OSPF_GR_NOT_HELPER;
@@ -948,7 +982,7 @@ static void show_ospf_grace_lsa_info(struct vty *vty, struct ospf_lsa *lsa)
                        sum += TLV_SIZE(tlvh);
 
                        vty_out(vty, "   Restart reason:%s\n",
-                               ospf_restart_reason_desc[grReason->reason]);
+                               ospf_restart_reason2str(grReason->reason));
                        break;
                case RESTARTER_IP_ADDR_TYPE:
                        restartAddr = (struct grace_tlv_restart_addr *)tlvh;
index 4e83028fe6091497c2592ba5736e9f15729c89d1..c355bb4f3d65027c4552abc02d3b3359a20b108a 100644 (file)
@@ -152,9 +152,9 @@ struct advRtr {
 #define OSPF_GR_FAILURE 0
 #define OSPF_GR_INVALID -1
 
-extern const char *ospf_exit_reason_desc[];
-extern const char *ospf_restart_reason_desc[];
-extern const char *ospf_rejected_reason_desc[];
+const char *ospf_exit_reason2str(unsigned int reason);
+const char *ospf_restart_reason2str(unsigned int reason);
+const char *ospf_rejected_reason2str(unsigned int reason);
 
 extern void ospf_gr_helper_init(struct ospf *ospf);
 extern void ospf_gr_helper_stop(struct ospf *ospf);
index 87c1c91afbdfc7e12bb832c3f3d95837a0183709..5c82e11393c972cc538d7a5aabbcf80fd81095c6 100644 (file)
@@ -5132,9 +5132,8 @@ static void show_ip_ospf_neighbor_detail_sub(struct vty *vty,
                                "      Graceful Restart grace period time: %d (seconds).\n",
                                nbr->gr_helper_info.recvd_grace_period);
                        vty_out(vty, "      Graceful Restart reason: %s.\n",
-                               ospf_restart_reason_desc
-                                       [nbr->gr_helper_info
-                                                .gr_restart_reason]);
+                               ospf_restart_reason2str(
+                                       nbr->gr_helper_info.gr_restart_reason));
                } else {
                        vty_out(vty,
                                "      Graceful Restart HELPER Status : None\n");
@@ -5143,15 +5142,14 @@ static void show_ip_ospf_neighbor_detail_sub(struct vty *vty,
                if (nbr->gr_helper_info.rejected_reason
                    != OSPF_HELPER_REJECTED_NONE)
                        vty_out(vty, "      Helper rejected reason: %s.\n",
-                               ospf_rejected_reason_desc
-                                       [nbr->gr_helper_info.rejected_reason]);
+                               ospf_rejected_reason2str(
+                                       nbr->gr_helper_info.rejected_reason));
 
                if (nbr->gr_helper_info.helper_exit_reason
                    != OSPF_GR_HELPER_EXIT_NONE)
                        vty_out(vty, "      Last helper exit reason: %s.\n\n",
-                               ospf_exit_reason_desc
-                                       [nbr->gr_helper_info
-                                                .helper_exit_reason]);
+                               ospf_exit_reason2str(
+                                       nbr->gr_helper_info.helper_exit_reason));
                else
                        vty_out(vty, "\n");
        } else {
@@ -5165,25 +5163,24 @@ static void show_ip_ospf_neighbor_detail_sub(struct vty *vty,
                                nbr->gr_helper_info.recvd_grace_period);
                        json_object_string_add(
                                json_neigh, "grRestartReason",
-                               ospf_restart_reason_desc
-                                       [nbr->gr_helper_info
-                                                .gr_restart_reason]);
+                               ospf_restart_reason2str(
+                                       nbr->gr_helper_info.gr_restart_reason));
                }
 
                if (nbr->gr_helper_info.rejected_reason
                    != OSPF_HELPER_REJECTED_NONE)
                        json_object_string_add(
                                json_neigh, "helperRejectReason",
-                               ospf_rejected_reason_desc
-                                       [nbr->gr_helper_info.rejected_reason]);
+                               ospf_rejected_reason2str(
+                                       nbr->gr_helper_info.rejected_reason));
 
                if (nbr->gr_helper_info.helper_exit_reason
                    != OSPF_GR_HELPER_EXIT_NONE)
                        json_object_string_add(
                                json_neigh, "helperExitReason",
-                               ospf_exit_reason_desc
-                                       [nbr->gr_helper_info
-                                                .helper_exit_reason]);
+                               ospf_exit_reason2str(
+                                       nbr->gr_helper_info
+                                                .helper_exit_reason));
        }
 
        ospf_bfd_show_info(vty, nbr->bfd_info, json_neigh, use_json, 0);
@@ -9308,7 +9305,7 @@ static int ospf_show_gr_helper_details(struct vty *vty, struct ospf *ospf,
 
                if (ospf->last_exit_reason != OSPF_GR_HELPER_EXIT_NONE) {
                        vty_out(vty, " Last Helper exit Reason :%s\n",
-                               ospf_exit_reason_desc[ospf->last_exit_reason]);
+                               ospf_exit_reason2str(ospf->last_exit_reason));
                }
 
                if (ospf->active_restarter_cnt)
@@ -9337,7 +9334,7 @@ static int ospf_show_gr_helper_details(struct vty *vty, struct ospf *ospf,
                if (ospf->last_exit_reason != OSPF_GR_HELPER_EXIT_NONE)
                        json_object_string_add(
                                json_vrf, "LastExitReason",
-                               ospf_exit_reason_desc[ospf->last_exit_reason]);
+                               ospf_exit_reason2str(ospf->last_exit_reason));
 
                if (ospf->active_restarter_cnt)
                        json_object_int_add(json_vrf, "activeRestarterCnt",
@@ -9402,9 +9399,9 @@ static int ospf_show_gr_helper_details(struct vty *vty, struct ospf *ospf,
                                                        .t_grace_timer));
                                        vty_out(vty,
                                                "   Graceful Restart reason: %s.\n\n",
-                                               ospf_restart_reason_desc
-                                                       [nbr->gr_helper_info
-                                                       .gr_restart_reason]);
+                                               ospf_restart_reason2str(
+                                                       nbr->gr_helper_info
+                                                       .gr_restart_reason));
                                        cnt++;
                                } else {
                                        json_neigh = json_object_new_object();
@@ -9432,9 +9429,9 @@ static int ospf_show_gr_helper_details(struct vty *vty, struct ospf *ospf,
                                                        .t_grace_timer));
                                        json_object_string_add(
                                                json_neigh, "restartReason",
-                                               ospf_restart_reason_desc
-                                                       [nbr->gr_helper_info
-                                                       .gr_restart_reason]);
+                                               ospf_restart_reason2str(
+                                                       nbr->gr_helper_info
+                                                       .gr_restart_reason));
                                        json_object_object_add(
                                                json_neighbors,
                                                inet_ntoa(nbr->src),