summaryrefslogtreecommitdiff
path: root/storage/ndb
diff options
context:
space:
mode:
authorunknown <tomas@whalegate.ndb.mysql.com>2007-04-11 15:51:09 +0200
committerunknown <tomas@whalegate.ndb.mysql.com>2007-04-11 15:51:09 +0200
commit2776a71bb231d5cd470fee4eb60fc4eabc57e63b (patch)
tree7ad1062773b85c7a42f5713f91d47e24d4c32799 /storage/ndb
parent2d0939c05ddb55bd64daf11418aea385cc601ab9 (diff)
parent8187aaa851791fd2a7177437d2763d942a7fea73 (diff)
downloadmariadb-git-2776a71bb231d5cd470fee4eb60fc4eabc57e63b.tar.gz
Merge whalegate.ndb.mysql.com:/home/tomas/mysql-5.0-ndb
into whalegate.ndb.mysql.com:/home/tomas/mysql-5.1-single-user storage/ndb/src/ndbapi/NdbImpl.hpp: Auto merged storage/ndb/src/ndbapi/NdbOperation.cpp: Auto merged storage/ndb/src/ndbapi/NdbRecAttr.cpp: Auto merged storage/ndb/src/ndbapi/NdbReceiver.cpp: Auto merged storage/ndb/src/ndbapi/NdbScanFilter.cpp: Auto merged storage/ndb/include/ndbapi/NdbReceiver.hpp: Auto merged storage/ndb/include/ndbapi/NdbTransaction.hpp: Auto merged storage/ndb/include/util/BaseString.hpp: Auto merged storage/ndb/src/common/util/BaseString.cpp: Auto merged storage/ndb/src/ndbapi/NdbScanOperation.cpp: Auto merged storage/ndb/src/ndbapi/NdbTransaction.cpp: Auto merged storage/ndb/src/ndbapi/Ndbif.cpp: Auto merged storage/ndb/src/ndbapi/Ndblist.cpp: Auto merged storage/ndb/src/ndbapi/SignalSender.cpp: Auto merged storage/ndb/src/ndbapi/ndb_cluster_connection.cpp: Auto merged storage/ndb/src/ndbapi/ndb_cluster_connection_impl.hpp: Auto merged sql/ha_ndbcluster.cc: Bug#26176 NdbObjectIdMap::expand unable to expand!! mysqld got signal 11 - manual merge to 5.1 storage/ndb/include/ndbapi/Ndb.hpp: Bug#26176 NdbObjectIdMap::expand unable to expand!! mysqld got signal 11 - manual merge to 5.1 storage/ndb/include/ndbapi/NdbDictionary.hpp: Bug#26176 NdbObjectIdMap::expand unable to expand!! mysqld got signal 11 - manual merge to 5.1 storage/ndb/include/util/Vector.hpp: Bug#26176 NdbObjectIdMap::expand unable to expand!! mysqld got signal 11 - manual merge to 5.1 storage/ndb/src/ndbapi/DictCache.cpp: Bug#26176 NdbObjectIdMap::expand unable to expand!! mysqld got signal 11 - manual merge to 5.1 storage/ndb/src/ndbapi/DictCache.hpp: Bug#26176 NdbObjectIdMap::expand unable to expand!! mysqld got signal 11 - manual merge to 5.1 storage/ndb/src/ndbapi/Makefile.am: Bug#26176 NdbObjectIdMap::expand unable to expand!! mysqld got signal 11 - manual merge to 5.1 storage/ndb/src/ndbapi/Ndb.cpp: Bug#26176 NdbObjectIdMap::expand unable to expand!! mysqld got signal 11 - manual merge to 5.1 storage/ndb/src/ndbapi/NdbDictionary.cpp: Bug#26176 NdbObjectIdMap::expand unable to expand!! mysqld got signal 11 - manual merge to 5.1 storage/ndb/src/ndbapi/NdbDictionaryImpl.cpp: Bug#26176 NdbObjectIdMap::expand unable to expand!! mysqld got signal 11 - manual merge to 5.1 storage/ndb/src/ndbapi/NdbDictionaryImpl.hpp: Bug#26176 NdbObjectIdMap::expand unable to expand!! mysqld got signal 11 - manual merge to 5.1 storage/ndb/src/ndbapi/ObjectMap.hpp: Bug#26176 NdbObjectIdMap::expand unable to expand!! mysqld got signal 11 - manual merge to 5.1
Diffstat (limited to 'storage/ndb')
-rw-r--r--storage/ndb/include/ndbapi/Ndb.hpp20
-rw-r--r--storage/ndb/include/ndbapi/NdbDictionary.hpp24
-rw-r--r--storage/ndb/include/ndbapi/NdbReceiver.hpp4
-rw-r--r--storage/ndb/include/ndbapi/NdbTransaction.hpp2
-rw-r--r--storage/ndb/include/util/BaseString.hpp7
-rw-r--r--storage/ndb/include/util/Vector.hpp66
-rw-r--r--storage/ndb/src/common/util/BaseString.cpp145
-rw-r--r--storage/ndb/src/ndbapi/DictCache.cpp13
-rw-r--r--storage/ndb/src/ndbapi/DictCache.hpp2
-rw-r--r--storage/ndb/src/ndbapi/Makefile.am3
-rw-r--r--storage/ndb/src/ndbapi/Ndb.cpp45
-rw-r--r--storage/ndb/src/ndbapi/NdbDictionary.cpp80
-rw-r--r--storage/ndb/src/ndbapi/NdbDictionaryImpl.cpp248
-rw-r--r--storage/ndb/src/ndbapi/NdbDictionaryImpl.hpp10
-rw-r--r--storage/ndb/src/ndbapi/NdbImpl.hpp34
-rw-r--r--storage/ndb/src/ndbapi/NdbOperation.cpp6
-rw-r--r--storage/ndb/src/ndbapi/NdbRecAttr.cpp13
-rw-r--r--storage/ndb/src/ndbapi/NdbReceiver.cpp31
-rw-r--r--storage/ndb/src/ndbapi/NdbScanFilter.cpp12
-rw-r--r--storage/ndb/src/ndbapi/NdbScanOperation.cpp9
-rw-r--r--storage/ndb/src/ndbapi/NdbTransaction.cpp14
-rw-r--r--storage/ndb/src/ndbapi/Ndbif.cpp3
-rw-r--r--storage/ndb/src/ndbapi/Ndblist.cpp10
-rw-r--r--storage/ndb/src/ndbapi/ObjectMap.hpp52
-rw-r--r--storage/ndb/src/ndbapi/SignalSender.cpp10
-rw-r--r--storage/ndb/src/ndbapi/ndb_cluster_connection.cpp15
-rw-r--r--storage/ndb/src/ndbapi/ndb_cluster_connection_impl.hpp2
27 files changed, 653 insertions, 227 deletions
diff --git a/storage/ndb/include/ndbapi/Ndb.hpp b/storage/ndb/include/ndbapi/Ndb.hpp
index 80662f901b1..10b7b0ea581 100644
--- a/storage/ndb/include/ndbapi/Ndb.hpp
+++ b/storage/ndb/include/ndbapi/Ndb.hpp
@@ -1055,6 +1055,18 @@ class Ndb
friend class NdbDictInterface;
friend class NdbBlob;
friend class NdbImpl;
+ friend class Ndb_free_list_t<NdbRecAttr>;
+ friend class Ndb_free_list_t<NdbApiSignal>;
+ friend class Ndb_free_list_t<NdbLabel>;
+ friend class Ndb_free_list_t<NdbBranch>;
+ friend class Ndb_free_list_t<NdbSubroutine>;
+ friend class Ndb_free_list_t<NdbCall>;
+ friend class Ndb_free_list_t<NdbBlob>;
+ friend class Ndb_free_list_t<NdbReceiver>;
+ friend class Ndb_free_list_t<NdbIndexScanOperation>;
+ friend class Ndb_free_list_t<NdbOperation>;
+ friend class Ndb_free_list_t<NdbIndexOperation>;
+ friend class Ndb_free_list_t<NdbTransaction>;
#endif
public:
@@ -1104,7 +1116,7 @@ public:
*
* @param aCatalogName is the new name of the current catalog
*/
- void setCatalogName(const char * aCatalogName);
+ int setCatalogName(const char * aCatalogName);
/**
* The current schema name can be fetched by getSchemaName.
@@ -1118,7 +1130,7 @@ public:
*
* @param aSchemaName is the new name of the current schema
*/
- void setSchemaName(const char * aSchemaName);
+ int setSchemaName(const char * aSchemaName);
#endif
/**
@@ -1133,7 +1145,7 @@ public:
*
* @param aDatabaseName is the new name of the current database
*/
- void setDatabaseName(const char * aDatabaseName);
+ int setDatabaseName(const char * aDatabaseName);
/**
* The current database schema name can be fetched by getDatabaseSchemaName.
@@ -1147,7 +1159,7 @@ public:
*
* @param aDatabaseSchemaName is the new name of the current database schema
*/
- void setDatabaseSchemaName(const char * aDatabaseSchemaName);
+ int setDatabaseSchemaName(const char * aDatabaseSchemaName);
#ifndef DOXYGEN_SHOULD_SKIP_INTERNAL
/** Set database and schema name to match previously retrieved table
diff --git a/storage/ndb/include/ndbapi/NdbDictionary.hpp b/storage/ndb/include/ndbapi/NdbDictionary.hpp
index b1bdec6cace..0770a2164ce 100644
--- a/storage/ndb/include/ndbapi/NdbDictionary.hpp
+++ b/storage/ndb/include/ndbapi/NdbDictionary.hpp
@@ -429,7 +429,7 @@ public:
* Set name of column
* @param name Name of the column
*/
- void setName(const char * name);
+ int setName(const char * name);
/**
* Set whether column is nullable or not
@@ -520,7 +520,7 @@ public:
void setAutoIncrement(bool);
bool getAutoIncrement() const;
void setAutoIncrementInitialValue(Uint64 val);
- void setDefaultValue(const char*);
+ int setDefaultValue(const char*);
const char* getDefaultValue() const;
static const Column * FRAGMENT;
@@ -759,13 +759,13 @@ public:
* Name of table
* @param name Name of table
*/
- void setName(const char * name);
+ int setName(const char * name);
/**
* Add a column definition to a table
* @note creates a copy
*/
- void addColumn(const Column &);
+ int addColumn(const Column &);
/**
* @see NdbDictionary::Table::getLogging.
@@ -854,7 +854,7 @@ public:
/**
* Set frm file to store with this table
*/
- void setFrm(const void* data, Uint32 len);
+ int setFrm(const void* data, Uint32 len);
/**
* Set array of fragment information containing
@@ -1099,26 +1099,26 @@ public:
/**
* Set the name of an index
*/
- void setName(const char * name);
+ int setName(const char * name);
/**
* Define the name of the table to be indexed
*/
- void setTable(const char * name);
+ int setTable(const char * name);
/**
* Add a column to the index definition
* Note that the order of columns will be in
* the order they are added (only matters for ordered indexes).
*/
- void addColumn(const Column & c);
+ int addColumn(const Column & c);
/**
* Add a column name to the index definition
* Note that the order of indexes will be in
* the order they are added (only matters for ordered indexes).
*/
- void addColumnName(const char * name);
+ int addColumnName(const char * name);
#ifndef DOXYGEN_SHOULD_SKIP_DEPRECATED
/**
@@ -1127,7 +1127,7 @@ public:
* the order they are added (only matters for ordered indexes).
* Depricated, use addColumnName instead.
*/
- void addIndexColumn(const char * name);
+ int addIndexColumn(const char * name);
#endif
/**
@@ -1135,7 +1135,7 @@ public:
* Note that the order of indexes will be in
* the order they are added (only matters for ordered indexes).
*/
- void addColumnNames(unsigned noOfNames, const char ** names);
+ int addColumnNames(unsigned noOfNames, const char ** names);
#ifndef DOXYGEN_SHOULD_SKIP_DEPRECATED
/**
@@ -1144,7 +1144,7 @@ public:
* the order they are added (only matters for ordered indexes).
* Depricated, use addColumnNames instead.
*/
- void addIndexColumns(int noOfNames, const char ** names);
+ int addIndexColumns(int noOfNames, const char ** names);
#endif
/**
diff --git a/storage/ndb/include/ndbapi/NdbReceiver.hpp b/storage/ndb/include/ndbapi/NdbReceiver.hpp
index 0af55c88f68..b8abd281496 100644
--- a/storage/ndb/include/ndbapi/NdbReceiver.hpp
+++ b/storage/ndb/include/ndbapi/NdbReceiver.hpp
@@ -38,7 +38,7 @@ public:
};
NdbReceiver(Ndb *aNdb);
- void init(ReceiverType type, void* owner);
+ int init(ReceiverType type, void* owner);
void release();
~NdbReceiver();
@@ -75,7 +75,7 @@ private:
* At setup
*/
class NdbRecAttr * getValue(const class NdbColumnImpl*, char * user_dst_ptr);
- void do_get_value(NdbReceiver*, Uint32 rows, Uint32 key_size, Uint32 range);
+ int do_get_value(NdbReceiver*, Uint32 rows, Uint32 key_size, Uint32 range);
void prepareSend();
void calculate_batch_size(Uint32, Uint32, Uint32&, Uint32&, Uint32&);
diff --git a/storage/ndb/include/ndbapi/NdbTransaction.hpp b/storage/ndb/include/ndbapi/NdbTransaction.hpp
index 56d0801d507..07a46199ecc 100644
--- a/storage/ndb/include/ndbapi/NdbTransaction.hpp
+++ b/storage/ndb/include/ndbapi/NdbTransaction.hpp
@@ -575,7 +575,7 @@ private:
NdbTransaction(Ndb* aNdb);
~NdbTransaction();
- void init(); // Initialize connection object for new transaction
+ int init(); // Initialize connection object for new transaction
int executeNoBlobs(ExecType execType,
NdbOperation::AbortOption = NdbOperation::DefaultAbortOption,
diff --git a/storage/ndb/include/util/BaseString.hpp b/storage/ndb/include/util/BaseString.hpp
index 50abecc6e90..0c41f254edc 100644
--- a/storage/ndb/include/util/BaseString.hpp
+++ b/storage/ndb/include/util/BaseString.hpp
@@ -188,6 +188,7 @@ public:
private:
char* m_chr;
unsigned m_len;
+ friend bool operator!(const BaseString& str);
};
inline const char*
@@ -261,6 +262,12 @@ BaseString::operator!=(const char *str) const
return strcmp(m_chr, str) != 0;
}
+inline bool
+operator!(const BaseString& str)
+{
+ return str.m_chr == NULL;
+}
+
inline BaseString&
BaseString::assign(const BaseString& str)
{
diff --git a/storage/ndb/include/util/Vector.hpp b/storage/ndb/include/util/Vector.hpp
index 1a3767402e3..7530bca3b38 100644
--- a/storage/ndb/include/util/Vector.hpp
+++ b/storage/ndb/include/util/Vector.hpp
@@ -29,7 +29,7 @@ public:
const T& operator[](unsigned i) const;
unsigned size() const { return m_size; };
- void push_back(const T &);
+ int push_back(const T &);
void push(const T&, unsigned pos);
T& set(T&, unsigned pos, T& fill_obj);
T& back();
@@ -38,7 +38,7 @@ public:
void clear();
- void fill(unsigned new_size, T & obj);
+ int fill(unsigned new_size, T & obj);
Vector<T>& operator=(const Vector<T>&);
@@ -54,6 +54,14 @@ private:
template<class T>
Vector<T>::Vector(int i){
m_items = new T[i];
+ if (m_items == NULL)
+ {
+ errno = ENOMEM;
+ m_size = 0;
+ m_arraySize = 0;
+ m_incSize = 0;
+ return;
+ }
m_size = 0;
m_arraySize = i;
m_incSize = 50;
@@ -91,12 +99,15 @@ Vector<T>::back(){
}
template<class T>
-void
+int
Vector<T>::push_back(const T & t){
if(m_size == m_arraySize){
T * tmp = new T [m_arraySize + m_incSize];
- if(!tmp)
- abort();
+ if(tmp == NULL)
+ {
+ errno = ENOMEM;
+ return -1;
+ }
for (unsigned k = 0; k < m_size; k++)
tmp[k] = m_items[k];
delete[] m_items;
@@ -150,10 +161,12 @@ Vector<T>::clear(){
}
template<class T>
-void
+int
Vector<T>::fill(unsigned new_size, T & obj){
while(m_size <= new_size)
- push_back(obj);
+ if (push_back(obj))
+ return -1;
+ return 0;
}
template<class T>
@@ -177,8 +190,8 @@ struct MutexVector : public NdbLockable {
const T& operator[](unsigned i) const;
unsigned size() const { return m_size; };
- void push_back(const T &);
- void push_back(const T &, bool lockMutex);
+ int push_back(const T &);
+ int push_back(const T &, bool lockMutex);
T& back();
void erase(unsigned index);
@@ -187,7 +200,7 @@ struct MutexVector : public NdbLockable {
void clear();
void clear(bool lockMutex);
- void fill(unsigned new_size, T & obj);
+ int fill(unsigned new_size, T & obj);
private:
T * m_items;
unsigned m_size;
@@ -198,6 +211,14 @@ private:
template<class T>
MutexVector<T>::MutexVector(int i){
m_items = new T[i];
+ if (m_items == NULL)
+ {
+ errno = ENOMEM;
+ m_size = 0;
+ m_arraySize = 0;
+ m_incSize = 0;
+ return;
+ }
m_size = 0;
m_arraySize = i;
m_incSize = 50;
@@ -235,11 +256,17 @@ MutexVector<T>::back(){
}
template<class T>
-void
+int
MutexVector<T>::push_back(const T & t){
lock();
if(m_size == m_arraySize){
T * tmp = new T [m_arraySize + m_incSize];
+ if (tmp == NULL)
+ {
+ errno = ENOMEM;
+ unlock();
+ return -1;
+ }
for (unsigned k = 0; k < m_size; k++)
tmp[k] = m_items[k];
delete[] m_items;
@@ -249,15 +276,23 @@ MutexVector<T>::push_back(const T & t){
m_items[m_size] = t;
m_size++;
unlock();
+ return 0;
}
template<class T>
-void
+int
MutexVector<T>::push_back(const T & t, bool lockMutex){
if(lockMutex)
lock();
if(m_size == m_arraySize){
T * tmp = new T [m_arraySize + m_incSize];
+ if (tmp == NULL)
+ {
+ errno = ENOMEM;
+ if(lockMutex)
+ unlock();
+ return -1;
+ }
for (unsigned k = 0; k < m_size; k++)
tmp[k] = m_items[k];
delete[] m_items;
@@ -268,6 +303,7 @@ MutexVector<T>::push_back(const T & t, bool lockMutex){
m_size++;
if(lockMutex)
unlock();
+ return 0;
}
template<class T>
@@ -315,10 +351,12 @@ MutexVector<T>::clear(bool l){
}
template<class T>
-void
+int
MutexVector<T>::fill(unsigned new_size, T & obj){
while(m_size <= new_size)
- push_back(obj);
+ if (push_back(obj))
+ return -1;
+ return 0;
}
#endif
diff --git a/storage/ndb/src/common/util/BaseString.cpp b/storage/ndb/src/common/util/BaseString.cpp
index 6f20ae6a002..7e5adf0e9ef 100644
--- a/storage/ndb/src/common/util/BaseString.cpp
+++ b/storage/ndb/src/common/util/BaseString.cpp
@@ -16,19 +16,36 @@
/* -*- c-basic-offset: 4; -*- */
#include <ndb_global.h>
#include <BaseString.hpp>
-#include <basestring_vsnprintf.h>
+#include "basestring_vsnprintf.h"
BaseString::BaseString()
{
m_chr = new char[1];
+ if (m_chr == NULL)
+ {
+ errno = ENOMEM;
+ m_len = 0;
+ return;
+ }
m_chr[0] = 0;
m_len = 0;
}
BaseString::BaseString(const char* s)
{
+ if (s == NULL)
+ {
+ m_chr = NULL;
+ m_len = 0;
+ }
const size_t n = strlen(s);
m_chr = new char[n + 1];
+ if (m_chr == NULL)
+ {
+ errno = ENOMEM;
+ m_len = 0;
+ return;
+ }
memcpy(m_chr, s, n + 1);
m_len = n;
}
@@ -37,7 +54,20 @@ BaseString::BaseString(const BaseString& str)
{
const char* const s = str.m_chr;
const size_t n = str.m_len;
+ if (s == NULL)
+ {
+ m_chr = NULL;
+ m_len = 0;
+ return;
+ }
char* t = new char[n + 1];
+ if (t == NULL)
+ {
+ errno = ENOMEM;
+ m_chr = NULL;
+ m_len = 0;
+ return;
+ }
memcpy(t, s, n + 1);
m_chr = t;
m_len = n;
@@ -51,9 +81,23 @@ BaseString::~BaseString()
BaseString&
BaseString::assign(const char* s)
{
- const size_t n = strlen(s);
+ if (s == NULL)
+ {
+ m_chr = NULL;
+ m_len = 0;
+ return *this;
+ }
+ size_t n = strlen(s);
char* t = new char[n + 1];
- memcpy(t, s, n + 1);
+ if (t)
+ {
+ memcpy(t, s, n + 1);
+ }
+ else
+ {
+ errno = ENOMEM;
+ n = 0;
+ }
delete[] m_chr;
m_chr = t;
m_len = n;
@@ -64,8 +108,16 @@ BaseString&
BaseString::assign(const char* s, size_t n)
{
char* t = new char[n + 1];
- memcpy(t, s, n);
- t[n] = 0;
+ if (t)
+ {
+ memcpy(t, s, n);
+ t[n] = 0;
+ }
+ else
+ {
+ errno = ENOMEM;
+ n = 0;
+ }
delete[] m_chr;
m_chr = t;
m_len = n;
@@ -83,10 +135,19 @@ BaseString::assign(const BaseString& str, size_t n)
BaseString&
BaseString::append(const char* s)
{
- const size_t n = strlen(s);
+ size_t n = strlen(s);
char* t = new char[m_len + n + 1];
- memcpy(t, m_chr, m_len);
- memcpy(t + m_len, s, n + 1);
+ if (t)
+ {
+ memcpy(t, m_chr, m_len);
+ memcpy(t + m_len, s, n + 1);
+ }
+ else
+ {
+ errno = ENOMEM;
+ m_len = 0;
+ n = 0;
+ }
delete[] m_chr;
m_chr = t;
m_len += n;
@@ -130,8 +191,14 @@ BaseString::assfmt(const char *fmt, ...)
l = basestring_vsnprintf(buf, sizeof(buf), fmt, ap) + 1;
va_end(ap);
if(l > (int)m_len) {
+ char *t = new char[l];
+ if (t == NULL)
+ {
+ errno = ENOMEM;
+ return *this;
+ }
delete[] m_chr;
- m_chr = new char[l];
+ m_chr = t;
}
va_start(ap, fmt);
basestring_vsnprintf(m_chr, l, fmt, ap);
@@ -155,6 +222,11 @@ BaseString::appfmt(const char *fmt, ...)
l = basestring_vsnprintf(buf, sizeof(buf), fmt, ap) + 1;
va_end(ap);
char *tmp = new char[l];
+ if (tmp == NULL)
+ {
+ errno = ENOMEM;
+ return *this;
+ }
va_start(ap, fmt);
basestring_vsnprintf(tmp, l, fmt, ap);
va_end(ap);
@@ -242,9 +314,28 @@ BaseString::argify(const char *argv0, const char *src) {
Vector<char *> vargv;
if(argv0 != NULL)
- vargv.push_back(strdup(argv0));
+ {
+ char *t = strdup(argv0);
+ if (t == NULL)
+ {
+ errno = ENOMEM;
+ return NULL;
+ }
+ if (vargv.push_back(t))
+ {
+ free(t);
+ return NULL;
+ }
+ }
char *tmp = new char[strlen(src)+1];
+ if (tmp == NULL)
+ {
+ for(size_t i = 0; i < vargv.size(); i++)
+ free(vargv[i]);
+ errno = ENOMEM;
+ return NULL;
+ }
char *dst = tmp;
const char *end = src + strlen(src);
/* Copy characters from src to destination, while compacting them
@@ -287,20 +378,48 @@ BaseString::argify(const char *argv0, const char *src) {
/* Make sure the string is properly terminated */
*dst++ = '\0';
src++;
-
- vargv.push_back(strdup(begin));
+
+ {
+ char *t = strdup(begin);
+ if (t == NULL)
+ {
+ delete[] tmp;
+ for(size_t i = 0; i < vargv.size(); i++)
+ free(vargv[i]);
+ errno = ENOMEM;
+ return NULL;
+ }
+ if (vargv.push_back(t))
+ {
+ free(t);
+ delete[] tmp;
+ for(size_t i = 0; i < vargv.size(); i++)
+ free(vargv[i]);
+ return NULL;
+ }
+ }
}
end:
delete[] tmp;
- vargv.push_back(NULL);
+ if (vargv.push_back(NULL))
+ {
+ for(size_t i = 0; i < vargv.size(); i++)
+ free(vargv[i]);
+ return NULL;
+ }
/* Convert the C++ Vector into a C-vector of strings, suitable for
* calling execv().
*/
char **argv = (char **)malloc(sizeof(*argv) * (vargv.size()));
if(argv == NULL)
+ {
+ for(size_t i = 0; i < vargv.size(); i++)
+ free(vargv[i]);
+ errno = ENOMEM;
return NULL;
+ }
for(size_t i = 0; i < vargv.size(); i++){
argv[i] = vargv[i];
diff --git a/storage/ndb/src/ndbapi/DictCache.cpp b/storage/ndb/src/ndbapi/DictCache.cpp
index ed3bde38d4a..04be3711847 100644
--- a/storage/ndb/src/ndbapi/DictCache.cpp
+++ b/storage/ndb/src/ndbapi/DictCache.cpp
@@ -154,7 +154,7 @@ void GlobalDictCache::printCache()
}
NdbTableImpl *
-GlobalDictCache::get(const char * name)
+GlobalDictCache::get(const char * name, int *error)
{
DBUG_ENTER("GlobalDictCache::get");
DBUG_PRINT("enter", ("name: %s", name));
@@ -165,6 +165,11 @@ GlobalDictCache::get(const char * name)
versions = m_tableHash.getData(name, len);
if(versions == 0){
versions = new Vector<TableVersion>(2);
+ if (versions == NULL)
+ {
+ *error = -1;
+ DBUG_RETURN(0);
+ }
m_tableHash.insertKey(name, len, 0, versions);
}
@@ -211,7 +216,11 @@ GlobalDictCache::get(const char * name)
tmp.m_impl = 0;
tmp.m_status = RETREIVING;
tmp.m_refCount = 1; // The one retreiving it
- versions->push_back(tmp);
+ if (versions->push_back(tmp))
+ {
+ *error = -1;
+ DBUG_RETURN(0);
+ }
DBUG_PRINT("info", ("No table found"));
DBUG_RETURN(0);
}
diff --git a/storage/ndb/src/ndbapi/DictCache.hpp b/storage/ndb/src/ndbapi/DictCache.hpp
index bab027de0c8..9250ec7b196 100644
--- a/storage/ndb/src/ndbapi/DictCache.hpp
+++ b/storage/ndb/src/ndbapi/DictCache.hpp
@@ -67,7 +67,7 @@ public:
~GlobalDictCache();
NdbTableImpl * get(NdbTableImpl *tab);
- NdbTableImpl * get(const char * name);
+ NdbTableImpl * get(const char * name, int *error);
NdbTableImpl* put(const char * name, NdbTableImpl *);
void release(NdbTableImpl *, int invalidate = 0);
diff --git a/storage/ndb/src/ndbapi/Makefile.am b/storage/ndb/src/ndbapi/Makefile.am
index 8469110fddb..8ff427772b0 100644
--- a/storage/ndb/src/ndbapi/Makefile.am
+++ b/storage/ndb/src/ndbapi/Makefile.am
@@ -55,7 +55,8 @@ libndbapi_la_SOURCES = \
ndb_cluster_connection.cpp \
NdbBlob.cpp \
NdbIndexStat.cpp \
- SignalSender.cpp
+ SignalSender.cpp \
+ ObjectMap.cpp
INCLUDES_LOC = -I$(top_srcdir)/storage/ndb/src/mgmapi
diff --git a/storage/ndb/src/ndbapi/Ndb.cpp b/storage/ndb/src/ndbapi/Ndb.cpp
index 495b848645f..30a4a0245e1 100644
--- a/storage/ndb/src/ndbapi/Ndb.cpp
+++ b/storage/ndb/src/ndbapi/Ndb.cpp
@@ -436,7 +436,11 @@ Ndb::startTransactionLocal(Uint32 aPriority, Uint32 nodeId)
theRemainingStartTransactions--;
NdbTransaction* tConNext = theTransactionList;
- tConnection->init();
+ if (tConnection->init())
+ {
+ theError.code = tConnection->theError.code;
+ DBUG_RETURN(NULL);
+ }
theTransactionList = tConnection; // into a transaction list.
tConnection->next(tConNext); // Add the active connection object
tConnection->setTransactionId(tFirstTransId);
@@ -1200,13 +1204,18 @@ const char * Ndb::getCatalogName() const
return theImpl->m_dbname.c_str();
}
-void Ndb::setCatalogName(const char * a_catalog_name)
+int Ndb::setCatalogName(const char * a_catalog_name)
{
// TODO can table_name_separator be escaped?
if (a_catalog_name && ! strchr(a_catalog_name, table_name_separator)) {
- theImpl->m_dbname.assign(a_catalog_name);
- theImpl->update_prefix();
+ if (!theImpl->m_dbname.assign(a_catalog_name) ||
+ theImpl->update_prefix())
+ {
+ theError.code = 4000;
+ return -1;
+ }
}
+ return 0;
}
const char * Ndb::getSchemaName() const
@@ -1214,12 +1223,16 @@ const char * Ndb::getSchemaName() const
return theImpl->m_schemaname.c_str();
}
-void Ndb::setSchemaName(const char * a_schema_name)
+int Ndb::setSchemaName(const char * a_schema_name)
{
// TODO can table_name_separator be escaped?
if (a_schema_name && ! strchr(a_schema_name, table_name_separator)) {
- theImpl->m_schemaname.assign(a_schema_name);
- theImpl->update_prefix();
+ if (!theImpl->m_schemaname.assign(a_schema_name) ||
+ theImpl->update_prefix())
+ {
+ theError.code = 4000;
+ return -1;
+ }
}
}
// </internal>
@@ -1229,9 +1242,9 @@ const char * Ndb::getDatabaseName() const
return getCatalogName();
}
-void Ndb::setDatabaseName(const char * a_catalog_name)
+int Ndb::setDatabaseName(const char * a_catalog_name)
{
- setCatalogName(a_catalog_name);
+ return setCatalogName(a_catalog_name);
}
const char * Ndb::getDatabaseSchemaName() const
@@ -1239,9 +1252,9 @@ const char * Ndb::getDatabaseSchemaName() const
return getSchemaName();
}
-void Ndb::setDatabaseSchemaName(const char * a_schema_name)
+int Ndb::setDatabaseSchemaName(const char * a_schema_name)
{
- setSchemaName(a_schema_name);
+ return setSchemaName(a_schema_name);
}
int Ndb::setDatabaseAndSchemaName(const NdbDictionary::Table* t)
@@ -1411,6 +1424,11 @@ const BaseString
Ndb::getDatabaseFromInternalName(const char * internalName)
{
char * databaseName = new char[strlen(internalName) + 1];
+ if (databaseName == NULL)
+ {
+ errno = ENOMEM;
+ return BaseString(NULL);
+ }
strcpy(databaseName, internalName);
register char *ptr = databaseName;
@@ -1427,6 +1445,11 @@ const BaseString
Ndb::getSchemaFromInternalName(const char * internalName)
{
char * schemaName = new char[strlen(internalName)];
+ if (schemaName == NULL)
+ {
+ errno = ENOMEM;
+ return BaseString(NULL);
+ }
register const char *ptr1 = internalName;
/* Scan name for the second table_name_separator */
diff --git a/storage/ndb/src/ndbapi/NdbDictionary.cpp b/storage/ndb/src/ndbapi/NdbDictionary.cpp
index b7a7087c302..b268490db23 100644
--- a/storage/ndb/src/ndbapi/NdbDictionary.cpp
+++ b/storage/ndb/src/ndbapi/NdbDictionary.cpp
@@ -78,9 +78,9 @@ NdbDictionary::Column::operator=(const NdbDictionary::Column& column)
return *this;
}
-void
+int
NdbDictionary::Column::setName(const char * name){
- m_impl.m_name.assign(name);
+ return !m_impl.m_name.assign(name);
}
const char*
@@ -234,10 +234,10 @@ NdbDictionary::Column::setAutoIncrementInitialValue(Uint64 val){
m_impl.m_autoIncrementInitialValue = val;
}
-void
+int
NdbDictionary::Column::setDefaultValue(const char* defaultValue)
{
- m_impl.m_defaultValue.assign(defaultValue);
+ return !m_impl.m_defaultValue.assign(defaultValue);
}
const char*
@@ -327,9 +327,9 @@ NdbDictionary::Table::operator=(const NdbDictionary::Table& table)
return *this;
}
-void
+int
NdbDictionary::Table::setName(const char * name){
- m_impl.setName(name);
+ return m_impl.setName(name);
}
const char *
@@ -347,12 +347,24 @@ NdbDictionary::Table::getTableId() const {
return m_impl.m_id;
}
-void
+int
NdbDictionary::Table::addColumn(const Column & c){
NdbColumnImpl* col = new NdbColumnImpl;
+ if (col == NULL)
+ {
+ errno = ENOMEM;
+ return -1;
+ }
(* col) = NdbColumnImpl::getImpl(c);
- m_impl.m_columns.push_back(col);
- m_impl.buildColumnHash();
+ if (m_impl.m_columns.push_back(col))
+ {
+ return -1;
+ }
+ if (m_impl.buildColumnHash())
+ {
+ return -1;
+ }
+ return 0;
}
const NdbDictionary::Column*
@@ -549,9 +561,9 @@ NdbDictionary::Table::getFragmentCount() const
return m_impl.getFragmentCount();
}
-void
+int
NdbDictionary::Table::setFrm(const void* data, Uint32 len){
- m_impl.setFrm(data, len);
+ return m_impl.setFrm(data, len);
}
const void*
@@ -731,6 +743,7 @@ NdbDictionary::Table::validate(NdbError& error)
/*****************************************************************
* Index facade
*/
+
NdbDictionary::Index::Index(const char * name)
: m_impl(* new NdbIndexImpl(* this))
{
@@ -749,9 +762,9 @@ NdbDictionary::Index::~Index(){
}
}
-void
+int
NdbDictionary::Index::setName(const char * name){
- m_impl.setName(name);
+ return m_impl.setName(name);
}
const char *
@@ -759,9 +772,9 @@ NdbDictionary::Index::getName() const {
return m_impl.getName();
}
-void
+int
NdbDictionary::Index::setTable(const char * table){
- m_impl.setTable(table);
+ return m_impl.setTable(table);
}
const char *
@@ -796,39 +809,56 @@ NdbDictionary::Index::getIndexColumn(int no) const {
return NULL;
}
-void
+int
NdbDictionary::Index::addColumn(const Column & c){
NdbColumnImpl* col = new NdbColumnImpl;
+ if (col == NULL)
+ {
+ errno = ENOMEM;
+ return -1;
+ }
(* col) = NdbColumnImpl::getImpl(c);
- m_impl.m_columns.push_back(col);
+ if (m_impl.m_columns.push_back(col))
+ {
+ return -1;
+ }
+ return 0;
}
-void
+int
NdbDictionary::Index::addColumnName(const char * name){
const Column c(name);
- addColumn(c);
+ return addColumn(c);
}
-void
+int
NdbDictionary::Index::addIndexColumn(const char * name){
const Column c(name);
- addColumn(c);
+ return addColumn(c);
}
-void
+int
NdbDictionary::Index::addColumnNames(unsigned noOfNames, const char ** names){
for(unsigned i = 0; i < noOfNames; i++) {
const Column c(names[i]);
- addColumn(c);
+ if (addColumn(c))
+ {
+ return -1;
+ }
}
+ return 0;
}
-void
+int
NdbDictionary::Index::addIndexColumns(int noOfNames, const char ** names){
for(int i = 0; i < noOfNames; i++) {
const Column c(names[i]);
- addColumn(c);
+ if (addColumn(c))
+ {
+ return -1;
+ }
}
+ return 0;
}
void
diff --git a/storage/ndb/src/ndbapi/NdbDictionaryImpl.cpp b/storage/ndb/src/ndbapi/NdbDictionaryImpl.cpp
index 180747bfb9b..9f1866729a0 100644
--- a/storage/ndb/src/ndbapi/NdbDictionaryImpl.cpp
+++ b/storage/ndb/src/ndbapi/NdbDictionaryImpl.cpp
@@ -681,15 +681,18 @@ NdbTableImpl::equal(const NdbTableImpl& obj) const
DBUG_RETURN(true);
}
-void
+int
NdbTableImpl::assign(const NdbTableImpl& org)
{
DBUG_ENTER("NdbColumnImpl::assign");
DBUG_PRINT("info", ("this: %p &org: %p", this, &org));
/* m_changeMask intentionally not copied */
m_primaryTableId = org.m_primaryTableId;
- m_internalName.assign(org.m_internalName);
- updateMysqlName();
+ if (!m_internalName.assign(org.m_internalName) ||
+ updateMysqlName())
+ {
+ return -1;
+ }
// If the name has been explicitly set, use that name
// otherwise use the fetched name
if (!org.m_newExternalName.empty())
@@ -721,9 +724,18 @@ NdbTableImpl::assign(const NdbTableImpl& org)
for(i = 0; i < org.m_columns.size(); i++)
{
NdbColumnImpl * col = new NdbColumnImpl();
+ if (col == NULL)
+ {
+ errno = ENOMEM;
+ return -1;
+ }
const NdbColumnImpl * iorg = org.m_columns[i];
(* col) = (* iorg);
- m_columns.push_back(col);
+ if (m_columns.push_back(col))
+ {
+ delete col;
+ return -1;
+ }
}
m_fragments = org.m_fragments;
@@ -765,12 +777,12 @@ NdbTableImpl::assign(const NdbTableImpl& org)
m_tablespace_name = org.m_tablespace_name;
m_tablespace_id= org.m_tablespace_id;
m_tablespace_version = org.m_tablespace_version;
- DBUG_VOID_RETURN;
+ DBUG_RETURN(0);
}
-void NdbTableImpl::setName(const char * name)
+int NdbTableImpl::setName(const char * name)
{
- m_newExternalName.assign(name);
+ return !m_newExternalName.assign(name);
}
const char *
@@ -988,7 +1000,7 @@ NdbTableImpl::updateMysqlName()
m_mysqlName.assign("");
}
-void
+int
NdbTableImpl::buildColumnHash(){
const Uint32 size = m_columns.size();
int i;
@@ -1000,19 +1012,29 @@ NdbTableImpl::buildColumnHash(){
}
Vector<Uint32> hashValues;
- Vector<Vector<Uint32> > chains; chains.fill(size, hashValues);
+ Vector<Vector<Uint32> > chains;
+ if (chains.fill(size, hashValues))
+ {
+ return -1;
+ }
for(i = 0; i< (int) size; i++){
Uint32 hv = Hash(m_columns[i]->getName()) & 0xFFFE;
Uint32 bucket = hv & m_columnHashMask;
bucket = (bucket < size ? bucket : bucket - size);
assert(bucket < size);
- hashValues.push_back(hv);
- chains[bucket].push_back(i);
+ if (hashValues.push_back(hv) ||
+ chains[bucket].push_back(i))
+ {
+ return -1;
+ }
}
m_columnHash.clear();
Uint32 tmp = 1;
- m_columnHash.fill((unsigned)size-1, tmp); // Default no chaining
+ if (m_columnHash.fill((unsigned)size-1, tmp)) // Default no chaining
+ {
+ return -1;
+ }
Uint32 pos = 0; // In overflow vector
for(i = 0; i< (int) size; i++){
@@ -1032,12 +1054,18 @@ NdbTableImpl::buildColumnHash(){
for(size_t j = 0; j<sz; j++, pos++){
Uint32 col = chains[i][j];
Uint32 hv = hashValues[col];
- m_columnHash.push_back((col << 16) | hv);
+ if (m_columnHash.push_back((col << 16) | hv))
+ {
+ return -1;
+ }
}
}
}
- m_columnHash.push_back(0); // Overflow when looping in end of array
+ if (m_columnHash.push_back(0)) // Overflow when looping in end of array
+ {
+ return -1;
+ }
#if 0
for(size_t i = 0; i<m_columnHash.size(); i++){
@@ -1052,6 +1080,7 @@ NdbTableImpl::buildColumnHash(){
i, col > 0 ? m_columns[col]->getName() : "" , m_columnHash[i]);
}
#endif
+ return 0;
}
Uint32
@@ -1170,9 +1199,9 @@ NdbIndexImpl::~NdbIndexImpl(){
delete m_columns[i];
}
-void NdbIndexImpl::setName(const char * name)
+int NdbIndexImpl::setName(const char * name)
{
- m_externalName.assign(name);
+ return !m_externalName.assign(name);
}
const char *
@@ -1181,10 +1210,10 @@ NdbIndexImpl::getName() const
return m_externalName.c_str();
}
-void
+int
NdbIndexImpl::setTable(const char * table)
{
- m_tableName.assign(table);
+ return !m_tableName.assign(table);
}
const char *
@@ -1407,14 +1436,18 @@ NdbDictionaryImpl::fetchGlobalTableImplRef(const GlobalCacheInitObject &obj)
{
DBUG_ENTER("fetchGlobalTableImplRef");
NdbTableImpl *impl;
+ int error= 0;
m_globalHash->lock();
- impl = m_globalHash->get(obj.m_name.c_str());
+ impl = m_globalHash->get(obj.m_name.c_str(), &error);
m_globalHash->unlock();
if (impl == 0){
- impl = m_receiver.getTable(obj.m_name.c_str(),
- m_ndb.usingFullyQualifiedNames());
+ if (error == 0)
+ impl = m_receiver.getTable(obj.m_name.c_str(),
+ m_ndb.usingFullyQualifiedNames());
+ else
+ m_error.code = 4000;
if (impl != 0 && obj.init(*impl))
{
delete impl;
@@ -1877,12 +1910,20 @@ NdbDictInterface::getTable(const BaseString& name, bool fullyQualifiedNames)
// Copy name to m_buffer to get a word sized buffer
m_buffer.clear();
- m_buffer.grow(namelen_words*4+4);
- m_buffer.append(name.c_str(), namelen);
+ if (m_buffer.grow(namelen_words*4+4) ||
+ m_buffer.append(name.c_str(), namelen))
+ {
+ m_error.code= 4000;
+ return NULL;
+ }
#ifndef IGNORE_VALGRIND_WARNINGS
Uint32 pad = 0;
- m_buffer.append(&pad, 4);
+ if (m_buffer.append(&pad, 4))
+ {
+ m_error.code= 4000;
+ return NULL;
+ }
#endif
LinearSectionPtr ptr[1];
@@ -1913,7 +1954,14 @@ NdbDictInterface::getTable(class NdbApiSignal * signal,
m_buffer.length() / 4,
fullyQualifiedNames);
if(rt)
- rt->buildColumnHash();
+ {
+ if (rt->buildColumnHash())
+ {
+ m_error.code = 4000;
+ delete rt;
+ return NULL;
+ }
+ }
return rt;
}
@@ -1923,18 +1971,25 @@ NdbDictInterface::execGET_TABINFO_CONF(NdbApiSignal * signal,
LinearSectionPtr ptr[3])
{
const GetTabInfoConf* conf = CAST_CONSTPTR(GetTabInfoConf, signal->getDataPtr());
+ const Uint32 i = GetTabInfoConf::DICT_TAB_INFO;
if(signal->isFirstFragment()){
m_fragmentId = signal->getFragmentId();
- m_buffer.grow(4 * conf->totalLen);
+ if (m_buffer.grow(4 * conf->totalLen))
+ {
+ m_error.code= 4000;
+ goto end;
+ }
} else {
if(m_fragmentId != signal->getFragmentId()){
abort();
}
}
- const Uint32 i = GetTabInfoConf::DICT_TAB_INFO;
- m_buffer.append(ptr[i].p, 4 * ptr[i].sz);
-
+ if (m_buffer.append(ptr[i].p, 4 * ptr[i].sz))
+ {
+ m_error.code= 4000;
+ }
+end:
if(!signal->isLastFragment()){
return;
}
@@ -2081,13 +2136,15 @@ NdbDictInterface::parseTableInfo(NdbTableImpl ** ret,
impl->m_id = tableDesc->TableId;
impl->m_version = tableDesc->TableVersion;
impl->m_status = NdbDictionary::Object::Retrieved;
- impl->m_internalName.assign(internalName);
- impl->updateMysqlName();
- impl->m_externalName.assign(externalName);
-
- impl->m_frm.assign(tableDesc->FrmData, tableDesc->FrmLen);
- impl->m_fd.assign(tableDesc->FragmentData, tableDesc->FragmentDataLen);
- impl->m_range.assign(tableDesc->RangeListData, tableDesc->RangeListDataLen);
+ if (!impl->m_internalName.assign(internalName) ||
+ impl->updateMysqlName() ||
+ !impl->m_externalName.assign(externalName) ||
+ impl->m_frm.assign(tableDesc->FrmData, tableDesc->FrmLen) ||
+ impl->m_fd.assign(tableDesc->FragmentData, tableDesc->FragmentDataLen) ||
+ impl->m_range.assign(tableDesc->RangeListData, tableDesc->RangeListDataLen))
+ {
+ DBUG_RETURN(4000);
+ }
impl->m_fragmentCount = tableDesc->FragmentCount;
/*
@@ -2131,7 +2188,10 @@ NdbDictInterface::parseTableInfo(NdbTableImpl ** ret,
} else {
const char * externalPrimary =
Ndb::externalizeTableName(tableDesc->PrimaryTable, fullyQualifiedNames);
- impl->m_primaryTable.assign(externalPrimary);
+ if (!impl->m_primaryTable.assign(externalPrimary))
+ {
+ DBUG_RETURN(4000);
+ }
}
Uint32 i;
@@ -2154,6 +2214,7 @@ NdbDictInterface::parseTableInfo(NdbTableImpl ** ret,
// check type and compute attribute size and array size
if (! attrDesc.translateExtType()) {
+ delete col;
delete impl;
NdbMem_Free((void*)tableDesc);
DBUG_RETURN(703);
@@ -2166,6 +2227,7 @@ NdbDictInterface::parseTableInfo(NdbTableImpl ** ret,
unsigned cs_number = (attrDesc.AttributeExtPrecision >> 16);
// charset is defined exactly for char types
if (col->getCharType() != (cs_number != 0)) {
+ delete col;
delete impl;
NdbMem_Free((void*)tableDesc);
DBUG_RETURN(703);
@@ -2173,6 +2235,7 @@ NdbDictInterface::parseTableInfo(NdbTableImpl ** ret,
if (col->getCharType()) {
col->m_cs = get_charset(cs_number, MYF(0));
if (col->m_cs == NULL) {
+ delete col;
delete impl;
NdbMem_Free((void*)tableDesc);
DBUG_RETURN(743);
@@ -2193,7 +2256,12 @@ NdbDictInterface::parseTableInfo(NdbTableImpl ** ret,
col->m_nullable = attrDesc.AttributeNullableFlag;
col->m_autoIncrement = (attrDesc.AttributeAutoIncrement != 0);
col->m_autoIncrementInitialValue = ~0;
- col->m_defaultValue.assign(attrDesc.AttributeDefaultValue);
+ if (!col->m_defaultValue.assign(attrDesc.AttributeDefaultValue))
+ {
+ delete col;
+ delete impl;
+ DBUG_RETURN(4000);
+ }
col->m_column_no = impl->m_columns.size();
impl->m_columns.push_back(col);
@@ -2216,7 +2284,11 @@ NdbDictInterface::parseTableInfo(NdbTableImpl ** ret,
pos++; // skip logpart
for (Uint32 j = 0; j<(Uint32)replicaCount; j++)
{
- impl->m_fragments.push_back(ntohs(tableDesc->ReplicaData[pos++]));
+ if (impl->m_fragments.push_back(ntohs(tableDesc->ReplicaData[pos++])))
+ {
+ delete impl;
+ DBUG_RETURN(4000);
+ }
}
}
@@ -2438,7 +2510,11 @@ NdbDictInterface::createOrAlterTable(Ndb & ndb,
{
AlterTableReq::setNameFlag(impl.m_changeMask, true);
}
- impl.m_externalName.assign(impl.m_newExternalName);
+ if (impl.m_externalName.assign(impl.m_newExternalName))
+ {
+ m_error.code= 4000;
+ DBUG_RETURN(-1);
+ }
impl.m_newExternalName.clear();
}
// Definition change (frm)
@@ -2506,7 +2582,11 @@ NdbDictInterface::createOrAlterTable(Ndb & ndb,
const BaseString internalName(
ndb.internalize_table_name(impl.m_externalName.c_str()));
- impl.m_internalName.assign(internalName);
+ if (!impl.m_internalName.assign(internalName))
+ {
+ m_error.code= 4000;
+ DBUG_RETURN(-1);
+ }
impl.updateMysqlName();
DictTabInfo::Table *tmpTab;
@@ -3079,11 +3159,21 @@ NdbDictInterface::create_index_obj_from_table(NdbIndexImpl** dst,
{
DBUG_ENTER("NdbDictInterface::create_index_obj_from_table");
NdbIndexImpl *idx = new NdbIndexImpl();
+ if (idx == NULL)
+ {
+ errno = ENOMEM;
+ return -1;
+ }
idx->m_version = tab->m_version;
idx->m_status = tab->m_status;
idx->m_id = tab->m_id;
- idx->m_externalName.assign(tab->getName());
- idx->m_tableName.assign(prim->m_externalName);
+ if (!idx->m_externalName.assign(tab->getName()) ||
+ !idx->m_tableName.assign(prim->m_externalName))
+ {
+ delete idx;
+ errno = ENOMEM;
+ return -1;
+ }
NdbDictionary::Object::Type type = idx->m_type = tab->m_indexType;
idx->m_logging = tab->m_logging;
idx->m_temporary = tab->m_temporary;
@@ -3097,9 +3187,20 @@ NdbDictInterface::create_index_obj_from_table(NdbIndexImpl** dst,
NdbColumnImpl* org = tab->m_columns[i];
NdbColumnImpl* col = new NdbColumnImpl;
+ if (col == NULL)
+ {
+ errno = ENOMEM;
+ delete idx;
+ return -1;
+ }
// Copy column definition
*col = * org;
- idx->m_columns.push_back(col);
+ if (idx->m_columns.push_back(col))
+ {
+ delete col;
+ delete idx;
+ return -1;
+ }
/**
* reverse map
@@ -4168,34 +4269,72 @@ NdbDictInterface::listObjects(NdbDictionary::Dictionary::List& list,
BaseString databaseName;
BaseString schemaName;
BaseString objectName;
+ if (!databaseName || !schemaName || !objectName)
+ {
+ m_error.code= 4000;
+ return -1;
+ }
if ((element.type == NdbDictionary::Object::UniqueHashIndex) ||
(element.type == NdbDictionary::Object::OrderedIndex)) {
char * indexName = new char[n << 2];
+ if (indexName == NULL)
+ {
+ m_error.code= 4000;
+ return -1;
+ }
memcpy(indexName, &data[pos], n << 2);
- databaseName = Ndb::getDatabaseFromInternalName(indexName);
- schemaName = Ndb::getSchemaFromInternalName(indexName);
+ if (!(databaseName = Ndb::getDatabaseFromInternalName(indexName)) ||
+ !(schemaName = Ndb::getSchemaFromInternalName(indexName)))
+ {
+ delete [] indexName;
+ m_error.code= 4000;
+ return -1;
+ }
objectName = BaseString(Ndb::externalizeIndexName(indexName, fullyQualifiedNames));
delete [] indexName;
} else if ((element.type == NdbDictionary::Object::SystemTable) ||
(element.type == NdbDictionary::Object::UserTable)) {
char * tableName = new char[n << 2];
+ if (tableName == NULL)
+ {
+ m_error.code= 4000;
+ return -1;
+ }
memcpy(tableName, &data[pos], n << 2);
- databaseName = Ndb::getDatabaseFromInternalName(tableName);
- schemaName = Ndb::getSchemaFromInternalName(tableName);
+ if (!(databaseName = Ndb::getDatabaseFromInternalName(tableName)) ||
+ !(schemaName = Ndb::getSchemaFromInternalName(tableName)))
+ {
+ delete [] tableName;
+ m_error.code= 4000;
+ return -1;
+ }
objectName = BaseString(Ndb::externalizeTableName(tableName, fullyQualifiedNames));
delete [] tableName;
}
else {
char * otherName = new char[n << 2];
+ if (otherName == NULL)
+ {
+ m_error.code= 4000;
+ return -1;
+ }
memcpy(otherName, &data[pos], n << 2);
- objectName = BaseString(otherName);
+ if (!(objectName = BaseString(otherName)))
+ {
+ m_error.code= 4000;
+ return -1;
+ }
delete [] otherName;
}
- element.database = new char[databaseName.length() + 1];
+ if (!(element.database = new char[databaseName.length() + 1]) ||
+ !(element.schema = new char[schemaName.length() + 1]) ||
+ !(element.name = new char[objectName.length() + 1]))
+ {
+ m_error.code= 4000;
+ return -1;
+ }
strcpy(element.database, databaseName.c_str());
- element.schema = new char[schemaName.length() + 1];
strcpy(element.schema, schemaName.c_str());
- element.name = new char[objectName.length() + 1];
strcpy(element.name, objectName.c_str());
pos += n;
count++;
@@ -4244,7 +4383,10 @@ NdbDictInterface::execLIST_TABLES_CONF(NdbApiSignal* signal,
{
const unsigned off = ListTablesConf::HeaderLength;
const unsigned len = (signal->getLength() - off);
- m_buffer.append(signal->getDataPtr() + off, len << 2);
+ if (m_buffer.append(signal->getDataPtr() + off, len << 2))
+ {
+ m_error.code= 4000;
+ }
if (signal->getLength() < ListTablesConf::SignalLength) {
// last signal has less than full length
m_waiter.signal(NO_WAIT);
diff --git a/storage/ndb/src/ndbapi/NdbDictionaryImpl.hpp b/storage/ndb/src/ndbapi/NdbDictionaryImpl.hpp
index b474b6e7fc0..72576bbd273 100644
--- a/storage/ndb/src/ndbapi/NdbDictionaryImpl.hpp
+++ b/storage/ndb/src/ndbapi/NdbDictionaryImpl.hpp
@@ -131,7 +131,7 @@ public:
~NdbTableImpl();
void init();
- void setName(const char * name);
+ int setName(const char * name);
const char * getName() const;
void setFragmentCount(Uint32 count);
Uint32 getFragmentCount() const;
@@ -182,7 +182,7 @@ public:
Vector<Uint32> m_columnHash;
Vector<NdbColumnImpl *> m_columns;
void computeAggregates();
- void buildColumnHash();
+ int buildColumnHash();
/**
* Fragment info
@@ -232,7 +232,7 @@ public:
* Equality/assign
*/
bool equal(const NdbTableImpl&) const;
- void assign(const NdbTableImpl&);
+ int assign(const NdbTableImpl&);
static NdbTableImpl & getImpl(NdbDictionary::Table & t);
static NdbTableImpl & getImpl(const NdbDictionary::Table & t);
@@ -258,9 +258,9 @@ public:
~NdbIndexImpl();
void init();
- void setName(const char * name);
+ int setName(const char * name);
const char * getName() const;
- void setTable(const char * table);
+ int setTable(const char * table);
const char * getTable() const;
const NdbTableImpl * getIndexTable() const;
diff --git a/storage/ndb/src/ndbapi/NdbImpl.hpp b/storage/ndb/src/ndbapi/NdbImpl.hpp
index 083871061b4..33dfde58c49 100644
--- a/storage/ndb/src/ndbapi/NdbImpl.hpp
+++ b/storage/ndb/src/ndbapi/NdbImpl.hpp
@@ -37,7 +37,7 @@ struct Ndb_free_list_t
Ndb_free_list_t();
~Ndb_free_list_t();
- void fill(Ndb*, Uint32 cnt);
+ int fill(Ndb*, Uint32 cnt);
T* seize(Ndb*);
void release(T*);
void clear();
@@ -86,10 +86,14 @@ public:
BaseString m_prefix; // Buffer for preformatted internal name <db>/<schema>/
- void update_prefix()
+ int update_prefix()
{
- m_prefix.assfmt("%s%c%s%c", m_dbname.c_str(), table_name_separator,
- m_schemaname.c_str(), table_name_separator);
+ if (!m_prefix.assfmt("%s%c%s%c", m_dbname.c_str(), table_name_separator,
+ m_schemaname.c_str(), table_name_separator))
+ {
+ return -1;
+ }
+ return 0;
}
BaseString m_systemPrefix; // Buffer for preformatted for <sys>/<def>/
@@ -203,7 +207,7 @@ Ndb_free_list_t<T>::~Ndb_free_list_t()
template<class T>
inline
-void
+int
Ndb_free_list_t<T>::fill(Ndb* ndb, Uint32 cnt)
{
if (m_free_list == 0)
@@ -211,18 +215,28 @@ Ndb_free_list_t<T>::fill(Ndb* ndb, Uint32 cnt)
m_free_cnt++;
m_alloc_cnt++;
m_free_list = new T(ndb);
+ if (m_free_list == 0)
+ {
+ ndb->theError.code = 4000;
+ assert(false);
+ return -1;
+ }
}
while(m_alloc_cnt < cnt)
{
T* obj= new T(ndb);
if(obj == 0)
- return;
-
+ {
+ ndb->theError.code = 4000;
+ assert(false);
+ return -1;
+ }
obj->next(m_free_list);
m_free_cnt++;
m_alloc_cnt++;
m_free_list = obj;
}
+ return 0;
}
template<class T>
@@ -243,7 +257,11 @@ Ndb_free_list_t<T>::seize(Ndb* ndb)
{
m_alloc_cnt++;
}
-
+ else
+ {
+ ndb->theError.code = 4000;
+ assert(false);
+ }
return tmp;
}
diff --git a/storage/ndb/src/ndbapi/NdbOperation.cpp b/storage/ndb/src/ndbapi/NdbOperation.cpp
index 9b3d20a1c33..903372ddb9d 100644
--- a/storage/ndb/src/ndbapi/NdbOperation.cpp
+++ b/storage/ndb/src/ndbapi/NdbOperation.cpp
@@ -177,7 +177,11 @@ NdbOperation::init(const NdbTableImpl* tab, NdbTransaction* myConnection){
tcKeyReq->scanInfo = 0;
theKEYINFOptr = &tcKeyReq->keyInfo[0];
theATTRINFOptr = &tcKeyReq->attrInfo[0];
- theReceiver.init(NdbReceiver::NDB_OPERATION, this);
+ if (theReceiver.init(NdbReceiver::NDB_OPERATION, this))
+ {
+ // theReceiver sets the error code of its owner
+ return -1;
+ }
return 0;
}
diff --git a/storage/ndb/src/ndbapi/NdbRecAttr.cpp b/storage/ndb/src/ndbapi/NdbRecAttr.cpp
index 20fa83e849d..5359d5849b9 100644
--- a/storage/ndb/src/ndbapi/NdbRecAttr.cpp
+++ b/storage/ndb/src/ndbapi/NdbRecAttr.cpp
@@ -81,6 +81,7 @@ NdbRecAttr::setup(const NdbColumnImpl* anAttrInfo, char* aValue)
theRef = tRef;
return 0;
}
+ errno = ENOMEM;
return -1;
}
@@ -100,7 +101,11 @@ NdbRecAttr::copyout()
NdbRecAttr *
NdbRecAttr::clone() const {
NdbRecAttr * ret = new NdbRecAttr(0);
-
+ if (ret == NULL)
+ {
+ errno = ENOMEM;
+ return NULL;
+ }
ret->theAttrId = theAttrId;
ret->m_size_in_bytes = m_size_in_bytes;
ret->m_column = m_column;
@@ -112,6 +117,12 @@ NdbRecAttr::clone() const {
ret->theValue = 0;
} else {
ret->theStorageX = new Uint64[((n + 7) >> 3)];
+ if (ret->theStorageX == NULL)
+ {
+ delete ret;
+ errno = ENOMEM;
+ return NULL;
+ }
ret->theRef = (char*)ret->theStorageX;
ret->theValue = 0;
}
diff --git a/storage/ndb/src/ndbapi/NdbReceiver.cpp b/storage/ndb/src/ndbapi/NdbReceiver.cpp
index 8f91cd10be0..34b3a14ac6e 100644
--- a/storage/ndb/src/ndbapi/NdbReceiver.cpp
+++ b/storage/ndb/src/ndbapi/NdbReceiver.cpp
@@ -32,7 +32,7 @@ NdbReceiver::NdbReceiver(Ndb *aNdb) :
{
theCurrentRecAttr = theFirstRecAttr = 0;
m_defined_rows = 0;
- m_rows = new NdbRecAttr*[0];
+ m_rows = NULL;
}
NdbReceiver::~NdbReceiver()
@@ -45,19 +45,26 @@ NdbReceiver::~NdbReceiver()
DBUG_VOID_RETURN;
}
-void
+int
NdbReceiver::init(ReceiverType type, void* owner)
{
theMagicNumber = 0x11223344;
m_type = type;
m_owner = owner;
+ theFirstRecAttr = NULL;
+ theCurrentRecAttr = NULL;
if (m_id == NdbObjectIdMap::InvalidId) {
if (m_ndb)
+ {
m_id = m_ndb->theImpl->theNdbObjectIdMap.map(this);
+ if (m_id == NdbObjectIdMap::InvalidId)
+ {
+ setErrorCode(4000);
+ return -1;
+ }
+ }
}
-
- theFirstRecAttr = NULL;
- theCurrentRecAttr = NULL;
+ return 0;
}
void
@@ -146,7 +153,7 @@ NdbReceiver::calculate_batch_size(Uint32 key_size,
return;
}
-void
+int
NdbReceiver::do_get_value(NdbReceiver * org,
Uint32 rows,
Uint32 key_size,
@@ -154,7 +161,11 @@ NdbReceiver::do_get_value(NdbReceiver * org,
if(rows > m_defined_rows){
delete[] m_rows;
m_defined_rows = rows;
- m_rows = new NdbRecAttr*[rows + 1];
+ if ((m_rows = new NdbRecAttr*[rows + 1]) == NULL)
+ {
+ setErrorCode(4000);
+ return -1;
+ }
}
m_rows[rows] = 0;
@@ -174,7 +185,7 @@ NdbReceiver::do_get_value(NdbReceiver * org,
// Put key-recAttr fir on each row
if(key_size && !getValue(&key, (char*)0)){
abort();
- return ; // -1
+ return -1;
}
if(range_no &&
@@ -193,7 +204,7 @@ NdbReceiver::do_get_value(NdbReceiver * org,
if(tRecAttr){
abort();
- return ;// -1;
+ return -1;
}
// Store first recAttr for each row in m_rows[i]
@@ -205,7 +216,7 @@ NdbReceiver::do_get_value(NdbReceiver * org,
}
prepareSend();
- return;
+ return 0;
}
NdbRecAttr*
diff --git a/storage/ndb/src/ndbapi/NdbScanFilter.cpp b/storage/ndb/src/ndbapi/NdbScanFilter.cpp
index eb0ef4ba391..fb47772fdea 100644
--- a/storage/ndb/src/ndbapi/NdbScanFilter.cpp
+++ b/storage/ndb/src/ndbapi/NdbScanFilter.cpp
@@ -78,7 +78,11 @@ NdbScanFilter::~NdbScanFilter(){
int
NdbScanFilter::begin(Group group){
- m_impl.m_stack2.push_back(m_impl.m_negative);
+ if (m_impl.m_stack2.push_back(m_impl.m_negative))
+ {
+ m_impl.m_operation->setErrorCodeAbort(4000);
+ return -1;
+ }
switch(group){
case NdbScanFilter::AND:
INT_DEBUG(("Begin(AND)"));
@@ -127,7 +131,11 @@ NdbScanFilter::begin(Group group){
}
NdbScanFilterImpl::State tmp = m_impl.m_current;
- m_impl.m_stack.push_back(m_impl.m_current);
+ if (m_impl.m_stack.push_back(m_impl.m_current))
+ {
+ m_impl.m_operation->setErrorCodeAbort(4000);
+ return -1;
+ }
m_impl.m_current.m_group = group;
m_impl.m_current.m_ownLabel = m_impl.m_label++;
m_impl.m_current.m_popCount = 0;
diff --git a/storage/ndb/src/ndbapi/NdbScanOperation.cpp b/storage/ndb/src/ndbapi/NdbScanOperation.cpp
index 30f9873c59f..c253dca8c61 100644
--- a/storage/ndb/src/ndbapi/NdbScanOperation.cpp
+++ b/storage/ndb/src/ndbapi/NdbScanOperation.cpp
@@ -820,9 +820,12 @@ int NdbScanOperation::prepareSendScan(Uint32 aTC_ConnectPtr,
req->requestInfo = reqInfo;
for(Uint32 i = 0; i<theParallelism; i++){
- m_receivers[i]->do_get_value(&theReceiver, batch_size,
- key_size,
- m_read_range_no);
+ if (m_receivers[i]->do_get_value(&theReceiver, batch_size,
+ key_size,
+ m_read_range_no))
+ {
+ return -1;
+ }
}
return 0;
}
diff --git a/storage/ndb/src/ndbapi/NdbTransaction.cpp b/storage/ndb/src/ndbapi/NdbTransaction.cpp
index 9d337c05fd9..a90c658c49b 100644
--- a/storage/ndb/src/ndbapi/NdbTransaction.cpp
+++ b/storage/ndb/src/ndbapi/NdbTransaction.cpp
@@ -81,6 +81,7 @@ NdbTransaction::NdbTransaction( Ndb* aNdb ) :
{
theListState = NotInList;
theError.code = 0;
+ //theId = NdbObjectIdMap::InvalidId;
theId = theNdb->theImpl->theNdbObjectIdMap.map(this);
#define CHECK_SZ(mask, sz) assert((sizeof(mask)/sizeof(mask[0])) == sz)
@@ -106,7 +107,7 @@ void init();
Remark: Initialise connection object for new transaction.
*****************************************************************************/
-void
+int
NdbTransaction::init()
{
theListState = NotInList;
@@ -148,6 +149,17 @@ NdbTransaction::init()
//
theBlobFlag = false;
thePendingBlobOps = 0;
+ if (theId == NdbObjectIdMap::InvalidId)
+ {
+ theId = theNdb->theImpl->theNdbObjectIdMap.map(this);
+ if (theId == NdbObjectIdMap::InvalidId)
+ {
+ theError.code = 4000;
+ return -1;
+ }
+ }
+ return 0;
+
}//NdbTransaction::init()
/*****************************************************************************
diff --git a/storage/ndb/src/ndbapi/Ndbif.cpp b/storage/ndb/src/ndbapi/Ndbif.cpp
index fba40659ec7..17bddb3530b 100644
--- a/storage/ndb/src/ndbapi/Ndbif.cpp
+++ b/storage/ndb/src/ndbapi/Ndbif.cpp
@@ -940,8 +940,9 @@ Ndb::handleReceivedSignal(NdbApiSignal* aSignal, LinearSectionPtr ptr[3])
InvalidSignal:
#ifdef VM_TRACE
ndbout_c("Ndbif: Error Ndb::handleReceivedSignal "
- "(GSN=%d, theImpl->theWaiter.m_state=%d)"
+ "(tFirstDataPtr=%x, GSN=%d, theImpl->theWaiter.m_state=%d)"
" sender = (Block: %d Node: %d)",
+ tFirstDataPtr,
tSignalNumber,
tWaitState,
refToBlock(aSignal->theSendersBlockRef),
diff --git a/storage/ndb/src/ndbapi/Ndblist.cpp b/storage/ndb/src/ndbapi/Ndblist.cpp
index 6a8fabbcb30..a9e9124edd0 100644
--- a/storage/ndb/src/ndbapi/Ndblist.cpp
+++ b/storage/ndb/src/ndbapi/Ndblist.cpp
@@ -74,7 +74,10 @@ Ndb::checkFailedNode()
int
Ndb::createConIdleList(int aNrOfCon)
{
- theImpl->theConIdleList.fill(this, aNrOfCon);
+ if (theImpl->theConIdleList.fill(this, aNrOfCon))
+ {
+ return -1;
+ }
return aNrOfCon;
}
@@ -90,7 +93,10 @@ Ndb::createConIdleList(int aNrOfCon)
int
Ndb::createOpIdleList(int aNrOfOp)
{
- theImpl->theOpIdleList.fill(this, aNrOfOp);
+ if (theImpl->theOpIdleList.fill(this, aNrOfOp))
+ {
+ return -1;
+ }
return aNrOfOp;
}
diff --git a/storage/ndb/src/ndbapi/ObjectMap.hpp b/storage/ndb/src/ndbapi/ObjectMap.hpp
index 9113a70798a..bc171649840 100644
--- a/storage/ndb/src/ndbapi/ObjectMap.hpp
+++ b/storage/ndb/src/ndbapi/ObjectMap.hpp
@@ -20,6 +20,9 @@
//#include <NdbMutex.h>
#include <NdbOut.hpp>
+#include <EventLogger.hpp>
+extern EventLogger g_eventLogger;
+
//#define DEBUG_OBJECTMAP
/**
@@ -50,24 +53,6 @@ private:
};
inline
-NdbObjectIdMap::NdbObjectIdMap(NdbMutex* mutex, Uint32 sz, Uint32 eSz) {
- m_size = 0;
- m_firstFree = InvalidId;
- m_map = 0;
- m_mutex = mutex;
- m_expandSize = eSz;
- expand(sz);
-#ifdef DEBUG_OBJECTMAP
- ndbout_c("NdbObjectIdMap:::NdbObjectIdMap(%u)", sz);
-#endif
-}
-
-inline
-NdbObjectIdMap::~NdbObjectIdMap(){
- free(m_map);
-}
-
-inline
Uint32
NdbObjectIdMap::map(void * object){
@@ -100,8 +85,8 @@ NdbObjectIdMap::unmap(Uint32 id, void *object){
m_map[i].m_next = m_firstFree;
m_firstFree = i;
} else {
- ndbout_c("Error: NdbObjectIdMap::::unmap(%u, 0x%lx) obj=0x%lx",
- id, (long) object, (long) obj);
+ g_eventLogger.error("NdbObjectIdMap::unmap(%u, 0x%x) obj=0x%x",
+ id, (long) object, (long) obj);
DBUG_PRINT("error",("NdbObjectIdMap::unmap(%u, 0x%lx) obj=0x%lx",
id, (long) object, (long) obj));
return 0;
@@ -125,31 +110,4 @@ NdbObjectIdMap::getObject(Uint32 id){
}
return 0;
}
-
-inline int
-NdbObjectIdMap::expand(Uint32 incSize){
- NdbMutex_Lock(m_mutex);
- Uint32 newSize = m_size + incSize;
- MapEntry * tmp = (MapEntry*)realloc(m_map, newSize * sizeof(MapEntry));
-
- if (likely(tmp != 0))
- {
- m_map = tmp;
-
- for(Uint32 i = m_size; i<newSize; i++){
- m_map[i].m_next = i + 1;
- }
- m_firstFree = m_size;
- m_map[newSize-1].m_next = InvalidId;
- m_size = newSize;
- }
- else
- {
- NdbMutex_Unlock(m_mutex);
- return -1;
- }
- NdbMutex_Unlock(m_mutex);
- return 0;
-}
-
#endif
diff --git a/storage/ndb/src/ndbapi/SignalSender.cpp b/storage/ndb/src/ndbapi/SignalSender.cpp
index d6d9f4446ce..70e65200942 100644
--- a/storage/ndb/src/ndbapi/SignalSender.cpp
+++ b/storage/ndb/src/ndbapi/SignalSender.cpp
@@ -137,7 +137,10 @@ SignalSender::waitFor(Uint32 timeOutMillis, T & t)
{
SimpleSignal * s = t.check(m_jobBuffer);
if(s != 0){
- m_usedBuffer.push_back(s);
+ if (m_usedBuffer.push_back(s))
+ {
+ return 0;
+ }
return s;
}
@@ -152,7 +155,10 @@ SignalSender::waitFor(Uint32 timeOutMillis, T & t)
SimpleSignal * s = t.check(m_jobBuffer);
if(s != 0){
- m_usedBuffer.push_back(s);
+ if (m_usedBuffer.push_back(s))
+ {
+ return 0;
+ }
return s;
}
diff --git a/storage/ndb/src/ndbapi/ndb_cluster_connection.cpp b/storage/ndb/src/ndbapi/ndb_cluster_connection.cpp
index 964037017f1..8c4189894d5 100644
--- a/storage/ndb/src/ndbapi/ndb_cluster_connection.cpp
+++ b/storage/ndb/src/ndbapi/ndb_cluster_connection.cpp
@@ -419,7 +419,7 @@ Ndb_cluster_connection_impl::set_name(const char *name)
}
}
-void
+int
Ndb_cluster_connection_impl::init_nodes_vector(Uint32 nodeid,
const ndb_mgm_configuration
&config)
@@ -465,7 +465,10 @@ Ndb_cluster_connection_impl::init_nodes_vector(Uint32 nodeid,
break;
}
}
- m_impl.m_all_nodes.push_back(Node(group,remoteNodeId));
+ if (m_impl.m_all_nodes.push_back(Node(group,remoteNodeId)))
+ {
+ DBUG_RETURN(-1);
+ }
DBUG_PRINT("info",("saved %d %d", group,remoteNodeId));
for (int i= m_impl.m_all_nodes.size()-2;
i >= 0 && m_impl.m_all_nodes[i].group > m_impl.m_all_nodes[i+1].group;
@@ -512,7 +515,7 @@ Ndb_cluster_connection_impl::init_nodes_vector(Uint32 nodeid,
do_test();
#endif
- DBUG_VOID_RETURN;
+ DBUG_RETURN(0);
}
void
@@ -595,7 +598,11 @@ int Ndb_cluster_connection::connect(int no_retries, int retry_delay_in_seconds,
break;
m_impl.m_transporter_facade->start_instance(nodeId, props);
- m_impl.init_nodes_vector(nodeId, *props);
+ if (m_impl.init_nodes_vector(nodeId, *props))
+ {
+ ndbout_c("Ndb_cluster_connection::connect: malloc failure");
+ DBUG_RETURN(-1);
+ }
for(unsigned i=0;
i<m_impl.m_transporter_facade->get_registry()->m_transporter_interface.size();
diff --git a/storage/ndb/src/ndbapi/ndb_cluster_connection_impl.hpp b/storage/ndb/src/ndbapi/ndb_cluster_connection_impl.hpp
index a8b774ec2b8..ba488c56ec7 100644
--- a/storage/ndb/src/ndbapi/ndb_cluster_connection_impl.hpp
+++ b/storage/ndb/src/ndbapi/ndb_cluster_connection_impl.hpp
@@ -66,7 +66,7 @@ private:
};
Vector<Node> m_all_nodes;
- void init_nodes_vector(Uint32 nodeid, const ndb_mgm_configuration &config);
+ int init_nodes_vector(Uint32 nodeid, const ndb_mgm_configuration &config);
void connect_thread();
void set_name(const char *name);