Commit 8e1a9cd1 authored by unknown's avatar unknown
Browse files

ndb -

  fix ndb-violations of strict aliasing found by gcc4.1
  (crashes in ndb_dd_*)


storage/ndb/src/kernel/blocks/dbdict/Dbdict.cpp:
  Fix strict-aliasing
storage/ndb/src/kernel/vm/KeyTable2Ref.hpp:
  Fix strict-aliasing
storage/ndb/src/kernel/vm/Pool.hpp:
  Fix strict-aliasing
parent 3ba0b6e0
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -7295,7 +7295,7 @@ void Dbdict::execGET_TABINFOREQ(Signal* signal)
  if(objEntry->m_tableType==DictTabInfo::Datafile)
  {
    jam();
    GetTabInfoReq *req= (GetTabInfoReq*)signal->theData;
    GetTabInfoReq *req= (GetTabInfoReq*)signal->getDataPtrSend();
    req->senderData= c_retrieveRecord.retrievePage;
    req->senderRef= reference();
    req->requestType= GetTabInfoReq::RequestById;
@@ -7307,7 +7307,7 @@ void Dbdict::execGET_TABINFOREQ(Signal* signal)
  else if(objEntry->m_tableType==DictTabInfo::LogfileGroup)
  {
    jam();
    GetTabInfoReq *req= (GetTabInfoReq*)signal->theData;
    GetTabInfoReq *req= (GetTabInfoReq*)signal->getDataPtrSend();
    req->senderData= c_retrieveRecord.retrievePage;
    req->senderRef= reference();
    req->requestType= GetTabInfoReq::RequestById;
+18 −4
Original line number Diff line number Diff line
@@ -32,19 +32,33 @@ public:
  bool find(Ptr<T>& ptr, Uint32 key) const {
    U rec;
    rec.key = key;
    return m_ref.find(*(Ptr<U>*)&ptr, rec);
    Ptr<U> tmp;
    bool ret = m_ref.find(tmp, rec);
    ptr.i = tmp.i;
    ptr.p = static_cast<T*>(tmp.p);
    return ret;
  }
  
  bool seize(Ptr<T> & ptr) {
    return m_ref.seize(*(Ptr<U>*)&ptr);
    Ptr<U> tmp;
    bool ret = m_ref.seize(tmp);
    ptr.i = tmp.i;
    ptr.p = static_cast<T*>(tmp.p);
    return ret;
  }
  
  void add(Ptr<T> & ptr) {
    m_ref.add(*(Ptr<U>*)&ptr);
    Ptr<U> tmp;
    tmp.i = ptr.i;
    tmp.p = static_cast<U*>(ptr.p);
    m_ref.add(tmp);
  }
  
  void release(Ptr<T> & ptr) {
    m_ref.release(*(Ptr<U>*)&ptr);
    Ptr<U> tmp;
    tmp.i = ptr.i;
    tmp.p = static_cast<U*>(ptr.p);
    m_ref.release(tmp);
  }
};

+4 −1
Original line number Diff line number Diff line
@@ -324,7 +324,10 @@ inline
void
RecordPool<T, P>::release(Ptr<T> ptr)
{
  m_pool.release(*(Ptr<void>*)&ptr);
  Ptr<void> tmp;
  tmp.i = ptr.i;
  tmp.p = ptr.p;
  m_pool.release(tmp);
}

#endif