]> git.puffer.fish Git - mirror/frr.git/commitdiff
*: do not take address of packed member
authorQuentin Young <qlyoung@cumulusnetworks.com>
Mon, 22 May 2017 15:52:30 +0000 (15:52 +0000)
committerQuentin Young <qlyoung@cumulusnetworks.com>
Fri, 26 May 2017 15:22:23 +0000 (15:22 +0000)
May result in alignment errors on certain platforms

Signed-off-by: Quentin Young <qlyoung@cumulusnetworks.com>
bgpd/bgp_open.h
eigrpd/eigrp_fsm.c
eigrpd/eigrp_interface.c
eigrpd/eigrp_network.c
eigrpd/eigrp_network.h
eigrpd/eigrp_topology.c
eigrpd/eigrp_update.c
eigrpd/eigrp_zebra.c
isisd/isis_pdu.c
isisd/iso_checksum.c
isisd/iso_checksum.h

index 459b966dd212bcec696b9a5558df0c979088fe61..4a9bcb2f7158a9c0101eeff458bcc2b31990c179 100644 (file)
@@ -36,7 +36,6 @@ struct capability_mp_data
   safi_t safi;
 };
 
-#pragma pack(1)
 struct capability_orf_entry 
 {
   struct capability_mp_data mpc;
@@ -45,8 +44,7 @@ struct capability_orf_entry
     u_char type;
     u_char mode;
   } orfs[];
-} __attribute__ ((packed));
-#pragma pack()
+};
 
 struct capability_as4
 {
index ad4eb70181eabce5f8f4b67f96d10db0be6a340b..44a4747588d344f02968e142be865408463a61fa 100644 (file)
@@ -434,8 +434,8 @@ int eigrp_fsm_event_keep_state(struct eigrp_fsm_action_message *msg)
 
   if (prefix->state == EIGRP_FSM_STATE_PASSIVE)
     {
-      if (!eigrp_metrics_is_same(&prefix->reported_metric,
-                                 &((struct eigrp_neighbor_entry *) prefix->entries->head->data)->total_metric))
+      if (!eigrp_metrics_is_same(prefix->reported_metric,
+                                 ((struct eigrp_neighbor_entry *) prefix->entries->head->data)->total_metric))
         {
           prefix->rdistance =
             prefix->fdistance =
index 7e38a8da5906b08acd7cc30624e9ca92a49a33af..9b2c8f363f9ced379f92e6ef343fede6d5eae397 100644 (file)
@@ -310,7 +310,7 @@ eigrp_if_up (struct eigrp_interface *ei)
       pe->nt = EIGRP_TOPOLOGY_TYPE_CONNECTED;
 
       pe->state = EIGRP_FSM_STATE_PASSIVE;
-      pe->fdistance = eigrp_calculate_metrics (eigrp, &metric);
+      pe->fdistance = eigrp_calculate_metrics (eigrp, metric);
       pe->req_action |= EIGRP_FSM_NEED_UPDATE;
       eigrp_prefix_entry_add (eigrp->topology_table, pe);
       listnode_add(eigrp->topology_changes_internalIPV4, pe);
@@ -319,7 +319,7 @@ eigrp_if_up (struct eigrp_interface *ei)
   ne->ei = ei;
   ne->reported_metric = metric;
   ne->total_metric = metric;
-  ne->distance = eigrp_calculate_metrics (eigrp, &metric);
+  ne->distance = eigrp_calculate_metrics (eigrp, metric);
   ne->reported_distance = 0;
   ne->prefix = pe;
   ne->adv_router = eigrp->neighbor_self;
index 45d91025d1ed1b440671dd17ef94662f113e68fb..cfed11a9eb6745e2bfb07aedf96ed0512937091e 100644 (file)
@@ -387,29 +387,29 @@ eigrp_network_unset(struct eigrp *eigrp, struct prefix_ipv4 *p)
 }
 
 u_int32_t
-eigrp_calculate_metrics(struct eigrp *eigrp, struct eigrp_metrics *metric)
+eigrp_calculate_metrics(struct eigrp *eigrp, struct eigrp_metrics metric)
 {
   uint64_t temp_metric;
   temp_metric = 0;
 
-  if(metric->delay == EIGRP_MAX_METRIC)
+  if(metric.delay == EIGRP_MAX_METRIC)
     return EIGRP_MAX_METRIC;
 
   // EIGRP Metric = {K1*BW+[(K2*BW)/(256-load)]+(K3*delay)}*{K5/(reliability+K4)}
 
   if (eigrp->k_values[0])
-    temp_metric += (eigrp->k_values[0] * metric->bandwith);
+    temp_metric += (eigrp->k_values[0] * metric.bandwith);
   if (eigrp->k_values[1])
-    temp_metric += ((eigrp->k_values[1] * metric->bandwith)
-                    / (256 - metric->load));
+    temp_metric += ((eigrp->k_values[1] * metric.bandwith)
+                    / (256 - metric.load));
   if (eigrp->k_values[2])
-    temp_metric += (eigrp->k_values[2] * metric->delay);
+    temp_metric += (eigrp->k_values[2] * metric.delay);
   if (eigrp->k_values[3] && !eigrp->k_values[4])
     temp_metric *= eigrp->k_values[3];
   if (!eigrp->k_values[3] && eigrp->k_values[4])
-    temp_metric *= (eigrp->k_values[4] / metric->reliability);
+    temp_metric *= (eigrp->k_values[4] / metric.reliability);
   if (eigrp->k_values[3] && eigrp->k_values[4])
-    temp_metric *= ((eigrp->k_values[4] / metric->reliability)
+    temp_metric *= ((eigrp->k_values[4] / metric.reliability)
                     + eigrp->k_values[3]);
 
   if (temp_metric <= EIGRP_MAX_METRIC)
@@ -432,21 +432,21 @@ eigrp_calculate_total_metrics(struct eigrp *eigrp,
   entry->total_metric.bandwith =
     entry->total_metric.bandwith > bw ? bw : entry->total_metric.bandwith;
 
-  return eigrp_calculate_metrics(eigrp, &entry->total_metric);
+  return eigrp_calculate_metrics(eigrp, entry->total_metric);
 }
 
 u_char
-eigrp_metrics_is_same(struct eigrp_metrics *metric1,
-                      struct eigrp_metrics *metric2)
+eigrp_metrics_is_same(struct eigrp_metrics metric1,
+                      struct eigrp_metrics metric2)
 {
-  if ((metric1->bandwith == metric2->bandwith)
-      && (metric1->delay == metric2->delay)
-      && (metric1->hop_count == metric2->hop_count)
-      && (metric1->load == metric2->load)
-      && (metric1->reliability == metric2->reliability)
-      && (metric1->mtu[0] == metric2->mtu[0])
-      && (metric1->mtu[1] == metric2->mtu[1])
-      && (metric1->mtu[2] == metric2->mtu[2]))
+  if ((metric1.bandwith == metric2.bandwith)
+      && (metric1.delay == metric2.delay)
+      && (metric1.hop_count == metric2.hop_count)
+      && (metric1.load == metric2.load)
+      && (metric1.reliability == metric2.reliability)
+      && (metric1.mtu[0] == metric2.mtu[0])
+      && (metric1.mtu[1] == metric2.mtu[1])
+      && (metric1.mtu[2] == metric2.mtu[2]))
       return 1;
 
   return 0; // if different
index bcca2609a8a9ee35931dc06b2838b2fbf46b2bb6..82ac455c96a2a160b1db1c431494a7c4cc8891f7 100644 (file)
@@ -43,9 +43,9 @@ extern int eigrp_if_drop_allspfrouters (struct eigrp *top, struct prefix *p,
                                         unsigned int ifindex);
 extern void eigrp_adjust_sndbuflen (struct eigrp *, unsigned int);
 
-extern u_int32_t eigrp_calculate_metrics (struct eigrp *, struct eigrp_metrics *);
+extern u_int32_t eigrp_calculate_metrics (struct eigrp *, struct eigrp_metrics);
 extern u_int32_t eigrp_calculate_total_metrics (struct eigrp *, struct eigrp_neighbor_entry *);
-extern u_char eigrp_metrics_is_same(struct eigrp_metrics *,struct eigrp_metrics *);
+extern u_char eigrp_metrics_is_same(struct eigrp_metrics, struct eigrp_metrics);
 extern void eigrp_external_routes_refresh (struct eigrp *, int);
 
 #endif /* EIGRP_NETWORK_H_ */
index d422b450ed634bddd4d55bfdccd07c7e4ebd8f7c..245b6adce876e36ea57c353b072bef2073e0c5bb 100644 (file)
@@ -423,24 +423,24 @@ eigrp_topology_update_distance(struct eigrp_fsm_action_message *msg)
   if (msg->data_type == EIGRP_TLV_IPv4_INT)
     {
       int_data = msg->data.ipv4_int_type;
-      if (eigrp_metrics_is_same(&int_data->metric,&entry->reported_metric))
+      if (eigrp_metrics_is_same(int_data->metric, entry->reported_metric))
         {
           return 0; // No change
         }
       change =
         entry->reported_distance
-        < eigrp_calculate_metrics(eigrp, &int_data->metric) ? 1 :
+        < eigrp_calculate_metrics(eigrp, int_data->metric) ? 1 :
           entry->reported_distance
-        > eigrp_calculate_metrics(eigrp, &int_data->metric) ? 2 : 3; // Increase : Decrease : No change
+        > eigrp_calculate_metrics(eigrp, int_data->metric) ? 2 : 3; // Increase : Decrease : No change
       entry->reported_metric = int_data->metric;
       entry->reported_distance =
-        eigrp_calculate_metrics(eigrp, &int_data->metric);
+        eigrp_calculate_metrics(eigrp, int_data->metric);
       entry->distance = eigrp_calculate_total_metrics(eigrp, entry);
     }
   else
     {
       ext_data = msg->data.ipv4_ext_data;
-      if (eigrp_metrics_is_same (&ext_data->metric, &entry->reported_metric))
+      if (eigrp_metrics_is_same (ext_data->metric, entry->reported_metric))
         return 0;
     }
   /*
index 98b2defea01761e4af623885dde4e6635dd35ee0..164907885b7b0252e22f154647a73bf0eb1d4d06 100644 (file)
@@ -344,7 +344,7 @@ eigrp_update_receive (struct eigrp *eigrp, struct ip *iph, struct eigrp_header *
               ne->reported_metric = tlv->metric;
               ne->reported_distance =
                 eigrp_calculate_metrics(eigrp,
-                                        &tlv->metric);
+                                        tlv->metric);
               /*
                * Filtering
                */
index ba6ecf24520c225ab5eb64773880106d45275fd4..2baad75265117ff74989913c6ea3125e6bf42d1e 100644 (file)
@@ -509,7 +509,7 @@ eigrp_redistribute_set (struct eigrp *eigrp, int type, struct eigrp_metrics metr
 
   if (eigrp_is_type_redistributed (type))
     {
-      if (eigrp_metrics_is_same(&metric, &eigrp->dmetric[type]))
+      if (eigrp_metrics_is_same(metric, eigrp->dmetric[type]))
         {
           eigrp->dmetric[type] = metric;
         }
index 69beade477b2936af832702b420ec4ed73676248..d62682b10f00b7cf12955955954c6f6d32dc47f8 100644 (file)
@@ -1315,7 +1315,8 @@ process_lsp (int level, struct isis_circuit *circuit, const u_char *ssnpa)
   /* Checksum sanity check - FIXME: move to correct place */
   /* 12 = sysid+pdu+remtime */
   if (iso_csum_verify (STREAM_PNT (circuit->rcv_stream) + 4,
-                      pdu_len - 12, &hdr->checksum))
+                      pdu_len - 12, hdr->checksum,
+                      offsetof(struct isis_link_state_hdr, checksum) - 4))
     {
       zlog_debug ("ISIS-Upd (%s): LSP %s invalid LSP checksum 0x%04x",
                  circuit->area->area_tag,
index d036c0ba7642780119943a2a63ff411532aae016..70b6b91edb6d0c6c3c83e6a3d4d4f27eec6d8eec 100644 (file)
  */
 
 int
-iso_csum_verify (u_char * buffer, int len, uint16_t * csum)
+iso_csum_verify (u_char * buffer, int len, uint16_t csum, int offset)
 {
   u_int16_t checksum;
   u_int32_t c0;
   u_int32_t c1;
 
-  c0 = *csum & 0xff00;
-  c1 = *csum & 0x00ff;
+  c0 = csum & 0xff00;
+  c1 = csum & 0x00ff;
 
   /*
    * If both are zero return correct
@@ -67,11 +67,8 @@ iso_csum_verify (u_char * buffer, int len, uint16_t * csum)
   if (c0 == 0 || c1 == 0)
     return 1;
 
-  /* Offset of checksum from the start of the buffer */
-  int offset = (u_char *) csum - buffer;
-
   checksum = fletcher_checksum(buffer, len, offset);
-  if (checksum == *csum)
+  if (checksum == csum)
     return 0;
   return 1;
 }
index cca6ee24a41151603a9d00420fcf09c1867d8eac..50f6a7d560382f3b94263d29c98c8442ee590001 100644 (file)
@@ -23,6 +23,6 @@
 #ifndef _ZEBRA_ISO_CSUM_H
 #define _ZEBRA_ISO_CSUM_H
 
-int iso_csum_verify (u_char * buffer, int len, uint16_t * csum);
+int iso_csum_verify (u_char * buffer, int len, uint16_t csum, int offset);
 
 #endif /* _ZEBRA_ISO_CSUM_H */