summaryrefslogtreecommitdiff
path: root/TAO/orbsvcs/orbsvcs/Naming/Flat_File_Persistence.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'TAO/orbsvcs/orbsvcs/Naming/Flat_File_Persistence.cpp')
-rw-r--r--TAO/orbsvcs/orbsvcs/Naming/Flat_File_Persistence.cpp89
1 files changed, 59 insertions, 30 deletions
diff --git a/TAO/orbsvcs/orbsvcs/Naming/Flat_File_Persistence.cpp b/TAO/orbsvcs/orbsvcs/Naming/Flat_File_Persistence.cpp
index 6d5ccc82e09..efaa900e534 100644
--- a/TAO/orbsvcs/orbsvcs/Naming/Flat_File_Persistence.cpp
+++ b/TAO/orbsvcs/orbsvcs/Naming/Flat_File_Persistence.cpp
@@ -6,6 +6,8 @@
#include "orbsvcs/Naming/Flat_File_Persistence.h"
#include "ace/Log_Msg.h"
+#include "ace/Numeric_Limits.h"
+#include "ace/Auto_Ptr.h"
#include "ace/OS_NS_sys_stat.h"
#include "ace/OS_NS_unistd.h"
#include "ace/OS_NS_fcntl.h"
@@ -216,11 +218,10 @@ TAO_NS_FlatFileStream::operator <<(
}
TAO_Storable_Base &
-TAO_NS_FlatFileStream::operator >>(
- TAO_NS_Persistence_Record &record)
+TAO_NS_FlatFileStream::operator >>(TAO_NS_Persistence_Record &record)
{
ACE_TRACE("TAO_NS_FlatFileStream::operator >>");
- TAO_NS_Persistence_Record::Record_Type type;
+
int temp_type_in;
switch (fscanf(fl_, "%d\n", &temp_type_in))
{
@@ -231,10 +232,13 @@ TAO_NS_FlatFileStream::operator >>(
this->setstate (eofbit);
return *this;
}
- type = (TAO_NS_Persistence_Record::Record_Type) temp_type_in;
- record.type(type);
+ TAO_NS_Persistence_Record::Record_Type type =
+ (TAO_NS_Persistence_Record::Record_Type) temp_type_in;
+ record.type (type);
int bufSize = 0;
+ ACE_CString::size_type const max_buf_len =
+ ACE_Numeric_Limits<ACE_CString::size_type>::max ();
//id
switch (fscanf(fl_, "%d\n", &bufSize))
@@ -246,18 +250,26 @@ TAO_NS_FlatFileStream::operator >>(
this->setstate (eofbit);
return *this;
}
- char *id = new char[bufSize+1];
- //char *id;
- //ACE_NEW_RETURN (id, char[bufSize+1], 1);
- if (ACE_OS::fgets(ACE_TEXT_CHAR_TO_TCHAR(id), bufSize+1, fl_) == 0 &&
- bufSize != 0)
+
+ if (bufSize < 0
+ || static_cast<ACE_CString::size_type> (bufSize) >= max_buf_len)
{
this->setstate (badbit);
return *this;
}
- ACE_CString newId(id);
- record.id(newId);
- delete [] id;
+ {
+ ACE_Auto_Basic_Array_Ptr<char> the_id (new char[bufSize + 1]);
+ the_id[0] = '\0';
+ if (ACE_OS::fgets (ACE_TEXT_CHAR_TO_TCHAR (the_id.get ()),
+ bufSize + 1,
+ fl_) == 0
+ && bufSize != 0)
+ {
+ this->setstate (badbit);
+ return *this;
+ }
+ record.id (ACE_CString (the_id.get (), 0, false));
+ }
//kind
switch (fscanf(fl_, "%d\n", &bufSize))
@@ -269,19 +281,27 @@ TAO_NS_FlatFileStream::operator >>(
this->setstate (eofbit);
return *this;
}
- char *kind = new char[bufSize+1];
- //char *kind;
- //ACE_NEW (kind, char[bufSize+1]);
- if (ACE_OS::fgets(ACE_TEXT_CHAR_TO_TCHAR(kind), bufSize+1, fl_) == 0 &&
- bufSize != 0)
+
+ if (bufSize < 0
+ || static_cast<ACE_CString::size_type> (bufSize) >= max_buf_len)
{
this->setstate (badbit);
return *this;
}
- kind[bufSize] = '\0';
- ACE_CString newKind(kind);
- record.kind(newKind);
- delete [] kind;
+
+ {
+ ACE_Auto_Basic_Array_Ptr<char> the_kind (new char[bufSize + 1]);
+ the_kind[0] = '\0';
+ if (ACE_OS::fgets (ACE_TEXT_CHAR_TO_TCHAR (the_kind.get ()),
+ bufSize + 1,
+ fl_) == 0
+ && bufSize != 0)
+ {
+ this->setstate (badbit);
+ return *this;
+ }
+ record.kind (ACE_CString (the_kind.get (), 0, false));
+ }
//ref
switch (fscanf(fl_, "%d\n", &bufSize))
@@ -293,18 +313,27 @@ TAO_NS_FlatFileStream::operator >>(
this->setstate (eofbit);
return *this;
}
- char *ref = new char[bufSize+1];
- //char *ref;
- //ACE_NEW(ref, char[bufSize+1]);
- if (ACE_OS::fgets(ACE_TEXT_CHAR_TO_TCHAR(ref), bufSize+1, fl_) == 0 &&
- bufSize != 0)
+
+ if (bufSize < 0
+ || static_cast<ACE_CString::size_type> (bufSize) >= max_buf_len)
{
this->setstate (badbit);
return *this;
}
- ACE_CString newRef(ref);
- record.ref(newRef);
- delete [] ref;
+
+ {
+ ACE_Auto_Basic_Array_Ptr<char> the_ref (new char[bufSize + 1]);
+ the_ref[0] = '\0';
+ if (ACE_OS::fgets (ACE_TEXT_CHAR_TO_TCHAR (the_ref.get ()),
+ bufSize + 1,
+ fl_) == 0
+ && bufSize != 0)
+ {
+ this->setstate (badbit);
+ return *this;
+ }
+ record.ref (ACE_CString (the_ref.get (), 0, false));
+ }
return *this;