dev: Fix undefined behaviuor in i8254xGBe
authorAndreas Hansson <andreas.hansson@arm.com>
Mon, 16 Feb 2015 08:34:35 +0000 (03:34 -0500)
committerAndreas Hansson <andreas.hansson@arm.com>
Mon, 16 Feb 2015 08:34:35 +0000 (03:34 -0500)
This patch fixes a rather unfortunate oversight where the annotation
pointer was used even though it is null. Somehow the code still works,
but UBSan is rather unhappy. The use is now guarded, and the variable
is initialised in the constructor (as well as init()).

src/dev/i8254xGBe.cc
src/dev/i8254xGBe.hh

index 70dba7c22cfbf9c682597a70e21fbea57b78313f..213ad580aca12cac00d1bde5008a01a6f8b4fdad 100644 (file)
@@ -58,7 +58,7 @@ using namespace iGbReg;
 using namespace Net;
 
 IGbE::IGbE(const Params *p)
-    : EtherDevice(p), etherInt(NULL),  drainManager(NULL),
+    : EtherDevice(p), etherInt(NULL), cpa(NULL), drainManager(NULL),
       rxFifo(p->rx_fifo_size), txFifo(p->tx_fifo_size), rxTick(false),
       txTick(false), txFifoTick(false), rxDmaPacket(false), pktOffset(0),
       fetchDelay(p->fetch_delay), wbDelay(p->wb_delay), 
@@ -2390,7 +2390,7 @@ IGbE::txWire()
 
     anPq("TXQ", "TX FIFO Q");
     if (etherInt->sendPacket(txFifo.front())) {
-        cpa->hwQ(CPA::FL_NONE, sys, macAddr, "TXQ", "WireQ", 0);
+        anQ("TXQ", "WireQ");
         if (DTRACE(EthernetSM)) {
             IpPtr ip(txFifo.front());
             if (ip)
index 29571271733fe9c586dbcc5b6db9a63d25e68a40..27439740dda427535a3dbdfdb8d83e4f6b48eb99 100644 (file)
@@ -182,31 +182,38 @@ class IGbE : public EtherDevice
     void checkDrain();
 
     void anBegin(std::string sm, std::string st, int flags = CPA::FL_NONE) {
-        cpa->hwBegin((CPA::flags)flags, sys, macAddr, sm, st);
+        if (cpa)
+            cpa->hwBegin((CPA::flags)flags, sys, macAddr, sm, st);
     }
 
-    void anQ(std::string sm, std::string q) { 
-        cpa->hwQ(CPA::FL_NONE, sys, macAddr, sm, q, macAddr);
+    void anQ(std::string sm, std::string q) {
+        if (cpa)
+            cpa->hwQ(CPA::FL_NONE, sys, macAddr, sm, q, macAddr);
     }
 
     void anDq(std::string sm, std::string q) {
-        cpa->hwDq(CPA::FL_NONE, sys, macAddr, sm, q, macAddr);
+        if (cpa)
+            cpa->hwDq(CPA::FL_NONE, sys, macAddr, sm, q, macAddr);
     }
 
     void anPq(std::string sm, std::string q, int num = 1) {
-        cpa->hwPq(CPA::FL_NONE, sys, macAddr, sm, q, macAddr, NULL, num);
+        if (cpa)
+            cpa->hwPq(CPA::FL_NONE, sys, macAddr, sm, q, macAddr, NULL, num);
     }
 
     void anRq(std::string sm, std::string q, int num = 1) {
-        cpa->hwRq(CPA::FL_NONE, sys, macAddr, sm, q, macAddr, NULL, num);
+        if (cpa)
+            cpa->hwRq(CPA::FL_NONE, sys, macAddr, sm, q, macAddr, NULL, num);
     }
 
     void anWe(std::string sm, std::string q) {
-        cpa->hwWe(CPA::FL_NONE, sys, macAddr, sm, q, macAddr);
+        if (cpa)
+            cpa->hwWe(CPA::FL_NONE, sys, macAddr, sm, q, macAddr);
     }
 
     void anWf(std::string sm, std::string q) {
-        cpa->hwWf(CPA::FL_NONE, sys, macAddr, sm, q, macAddr);
+        if (cpa)
+            cpa->hwWf(CPA::FL_NONE, sys, macAddr, sm, q, macAddr);
     }