This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "CMake".

The branch, next has been updated
       via  80756fc67a757c3daa43b51102624680e9c3559d (commit)
       via  fe27879c6b37d09084a740de843a54d39727c0f0 (commit)
      from  5c863804bae75118e2c06b75c817f7afd9bb372b (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=80756fc67a757c3daa43b51102624680e9c3559d
commit 80756fc67a757c3daa43b51102624680e9c3559d
Merge: 5c86380 fe27879
Author:     Brad King <brad.k...@kitware.com>
AuthorDate: Mon Jun 20 10:58:07 2016 -0400
Commit:     CMake Topic Stage <kwro...@kitware.com>
CommitDate: Mon Jun 20 10:58:07 2016 -0400

    Merge topic 'cmDependsJavaParserHelper-dangling-ptr' into next
    
    fe27879c cmDependsJavaParserHelper: fix dangling pointer


https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=fe27879c6b37d09084a740de843a54d39727c0f0
commit fe27879c6b37d09084a740de843a54d39727c0f0
Author:     Daniel Pfeifer <dan...@pfeifer-mail.de>
AuthorDate: Thu Jun 16 23:51:36 2016 +0200
Commit:     Brad King <brad.k...@kitware.com>
CommitDate: Mon Jun 20 10:56:39 2016 -0400

    cmDependsJavaParserHelper: fix dangling pointer
    
    The cmDependsJavaParserHelper tries to implement a "deep copy" in the
    assignment operator of the internal class CurrentClass.  To do that, it
    uses std::copy and std::back_inserter.  The copy constructor is
    implemented in terms of the assignment operator but it does not
    initialize the member NestedClasses, a pointer to vector.  This pointer
    is dereferenced in the assignment operator.  Change the pointer to a
    value and rely on the compiler generated special functions.

diff --git a/Source/cmDependsJavaParserHelper.cxx 
b/Source/cmDependsJavaParserHelper.cxx
index bd3ee4d..238e7a1 100644
--- a/Source/cmDependsJavaParserHelper.cxx
+++ b/Source/cmDependsJavaParserHelper.cxx
@@ -35,7 +35,7 @@ cmDependsJavaParserHelper::~cmDependsJavaParserHelper()
 }
 
 void cmDependsJavaParserHelper::CurrentClass::AddFileNamesForPrinting(
-  std::vector<std::string>* files, const char* prefix, const char* sep)
+  std::vector<std::string>* files, const char* prefix, const char* sep) const
 {
   std::string rname = "";
   if (prefix) {
@@ -44,8 +44,8 @@ void 
cmDependsJavaParserHelper::CurrentClass::AddFileNamesForPrinting(
   }
   rname += this->Name;
   files->push_back(rname);
-  std::vector<CurrentClass>::iterator it;
-  for (it = this->NestedClasses->begin(); it != this->NestedClasses->end();
+  std::vector<CurrentClass>::const_iterator it;
+  for (it = this->NestedClasses.begin(); it != this->NestedClasses.end();
        ++it) {
     it->AddFileNamesForPrinting(files, rname.c_str(), sep);
   }
@@ -191,25 +191,19 @@ void cmDependsJavaParserHelper::StartClass(const char* 
cls)
 
 void cmDependsJavaParserHelper::EndClass()
 {
-  CurrentClass* parent = 0;
-  CurrentClass* current = 0;
-  if (!this->ClassStack.empty()) {
-    current = &(*(this->ClassStack.end() - 1));
-    if (this->ClassStack.size() > 1) {
-      parent = &(*(this->ClassStack.end() - 2));
-    }
-  }
-  if (current == 0) {
+  if (this->ClassStack.empty()) {
     std::cerr << "Error when parsing. Current class is null" << std::endl;
     abort();
   }
-  if (parent == 0) {
+  if (this->ClassStack.size() <= 1) {
     std::cerr << "Error when parsing. Parent class is null" << std::endl;
     abort();
   }
+  CurrentClass& current = this->ClassStack.back();
+  CurrentClass& parent = this->ClassStack[this->ClassStack.size() - 2];
   this->CurrentDepth--;
-  parent->NestedClasses->push_back(*current);
-  this->ClassStack.erase(this->ClassStack.end() - 1, this->ClassStack.end());
+  parent.NestedClasses.push_back(current);
+  this->ClassStack.pop_back();
 }
 
 void cmDependsJavaParserHelper::PrintClasses()
@@ -228,10 +222,10 @@ void cmDependsJavaParserHelper::PrintClasses()
 std::vector<std::string> cmDependsJavaParserHelper::GetFilesProduced()
 {
   std::vector<std::string> files;
-  CurrentClass* toplevel = &(*(this->ClassStack.begin()));
-  std::vector<CurrentClass>::iterator it;
-  for (it = toplevel->NestedClasses->begin();
-       it != toplevel->NestedClasses->end(); ++it) {
+  CurrentClass const& toplevel = this->ClassStack.front();
+  std::vector<CurrentClass>::const_iterator it;
+  for (it = toplevel.NestedClasses.begin(); it != toplevel.NestedClasses.end();
+       ++it) {
     it->AddFileNamesForPrinting(&files, 0, "$");
   }
   return files;
@@ -309,11 +303,10 @@ int cmDependsJavaParserHelper::LexInput(char* buf, int 
maxlen)
     if (buf[0] == '\n') {
       this->CurrentLine++;
     }
-    return (1);
-  } else {
-    buf[0] = '\n';
-    return (0);
+    return 1;
   }
+  buf[0] = '\n';
+  return 0;
 }
 void cmDependsJavaParserHelper::Error(const char* str)
 {
diff --git a/Source/cmDependsJavaParserHelper.h 
b/Source/cmDependsJavaParserHelper.h
index a13d023..6ff0245 100644
--- a/Source/cmDependsJavaParserHelper.h
+++ b/Source/cmDependsJavaParserHelper.h
@@ -48,7 +48,7 @@ public:
 
   // For yacc
   void AddClassFound(const char* sclass);
-  void PrepareElement(ParserType* opt);
+  void PrepareElement(ParserType* me);
   void DeallocateParserType(char** pt);
   void CheckEmpty(int line, int cnt, ParserType* pt);
   void StartClass(const char* cls);
@@ -69,20 +69,9 @@ private:
   {
   public:
     std::string Name;
-    std::vector<CurrentClass>* NestedClasses;
-    CurrentClass() { this->NestedClasses = new std::vector<CurrentClass>; }
-    ~CurrentClass() { delete this->NestedClasses; }
-    CurrentClass& operator=(CurrentClass const& c)
-    {
-      this->NestedClasses->clear();
-      this->Name = c.Name;
-      std::copy(c.NestedClasses->begin(), c.NestedClasses->end(),
-                std::back_inserter(*this->NestedClasses));
-      return *this;
-    }
-    CurrentClass(CurrentClass const& c) { (*this) = c; }
+    std::vector<CurrentClass> NestedClasses;
     void AddFileNamesForPrinting(std::vector<std::string>* files,
-                                 const char* prefix, const char* sep);
+                                 const char* prefix, const char* sep) const;
   };
   std::string CurrentPackage;
   std::string::size_type InputBufferPos;

-----------------------------------------------------------------------

Summary of changes:


hooks/post-receive
-- 
CMake
_______________________________________________
Cmake-commits mailing list
Cmake-commits@cmake.org
http://public.kitware.com/mailman/listinfo/cmake-commits

Reply via email to