Boost logo

Boost-Commit :

Subject: [Boost-commit] svn:boost r80279 - in trunk/libs/filesystem: doc src test
From: bdawes_at_[hidden]
Date: 2012-08-28 08:57:03


Author: bemandawes
Date: 2012-08-28 08:57:02 EDT (Tue, 28 Aug 2012)
New Revision: 80279
URL: http://svn.boost.org/trac/boost/changeset/80279

Log:
Fix #7239, Stack overflow when calling create_directories(":D"). The reported problem was a symptom of an internal bug that caused path::filename() and path::parent_path() to fail on Windows for path(":"), and that in turn caused other functions that depend on filename() or parent_path() to fail, such as create_directories().
Text files modified:
   trunk/libs/filesystem/doc/release_history.html | 12 +++++++++++-
   trunk/libs/filesystem/src/operations.cpp | 1 +
   trunk/libs/filesystem/src/path.cpp | 2 +-
   trunk/libs/filesystem/test/path_test.cpp | 21 +++++++++++++++++++++
   4 files changed, 34 insertions(+), 2 deletions(-)

Modified: trunk/libs/filesystem/doc/release_history.html
==============================================================================
--- trunk/libs/filesystem/doc/release_history.html (original)
+++ trunk/libs/filesystem/doc/release_history.html 2012-08-28 08:57:02 EDT (Tue, 28 Aug 2012)
@@ -36,6 +36,16 @@
   </tr>
 </table>
 
+<h2>1.52.0</h2>
+<ul>
+ <li>Fix #7239, Stack
+ overflow when calling <code>create_directories(&quot;:D&quot;)</code>. The reported
+ problem was a symptom of an internal bug that caused <code>path::filename()</code>
+ and <code>path::parent_path()</code> to fail on Windows for <code>path(&quot;:&quot;)</code>,
+ and that in turn caused other functions that depend on <code>filename()</code>
+ or <code>parent_path()</code> to fail, such as <code>create_directories()</code>.</li>
+</ul>
+
 <h2>1.51.0</h2>
 <ul>
   <li>Add begin() and end() non-member functions for directory_iterator and
@@ -181,7 +191,7 @@
 </ul>
 <hr>
 <p>Revised
-<!--webbot bot="Timestamp" S-Type="EDITED" S-Format="%d %B, %Y" startspan -->13 July, 2012<!--webbot bot="Timestamp" endspan i-checksum="21091" --></p>
+<!--webbot bot="Timestamp" S-Type="EDITED" S-Format="%d %B, %Y" startspan -->28 August, 2012<!--webbot bot="Timestamp" endspan i-checksum="34454" --></p>
 <p>© Copyright Beman Dawes, 2011</p>
 <p> Use, modification, and distribution are subject to the Boost Software
 License, Version 1.0. See <a href="http://www.boost.org/LICENSE_1_0.txt">

Modified: trunk/libs/filesystem/src/operations.cpp
==============================================================================
--- trunk/libs/filesystem/src/operations.cpp (original)
+++ trunk/libs/filesystem/src/operations.cpp 2012-08-28 08:57:02 EDT (Tue, 28 Aug 2012)
@@ -927,6 +927,7 @@
     }
 
     path parent = p.parent_path();
+ BOOST_ASSERT_MSG(parent != p, "internal error: p == p.parent_path()");
     if (!parent.empty())
     {
       // determine if the parent exists

Modified: trunk/libs/filesystem/src/path.cpp
==============================================================================
--- trunk/libs/filesystem/src/path.cpp (original)
+++ trunk/libs/filesystem/src/path.cpp 2012-08-28 08:57:02 EDT (Tue, 28 Aug 2012)
@@ -510,7 +510,7 @@
     size_type pos(str.find_last_of(separators, end_pos-1));
 
 # ifdef BOOST_WINDOWS_API
- if (pos == string_type::npos)
+ if (pos == string_type::npos && end_pos > 1)
       pos = str.find_last_of(colon, end_pos-2);
 # endif
 

Modified: trunk/libs/filesystem/test/path_test.cpp
==============================================================================
--- trunk/libs/filesystem/test/path_test.cpp (original)
+++ trunk/libs/filesystem/test/path_test.cpp 2012-08-28 08:57:02 EDT (Tue, 28 Aug 2012)
@@ -1117,6 +1117,27 @@
     BOOST_TEST(p.has_parent_path());
     BOOST_TEST(p.is_absolute());
 
+ // ticket 2739, infinite recursion leading to stack overflow, was caused
+ // by failure to handle this case correctly on Windows.
+ p = path(":");
+ PATH_TEST_EQ(p.parent_path().string(), "");
+ PATH_TEST_EQ(p.filename(), ":");
+ BOOST_TEST(!p.has_parent_path());
+ BOOST_TEST(p.has_filename());
+
+ // test some similar cases that both POSIX and Windows should handle identically
+ p = path("c:");
+ PATH_TEST_EQ(p.parent_path().string(), "");
+ PATH_TEST_EQ(p.filename(), "c:");
+ BOOST_TEST(!p.has_parent_path());
+ BOOST_TEST(p.has_filename());
+ p = path("cc:");
+ PATH_TEST_EQ(p.parent_path().string(), "");
+ PATH_TEST_EQ(p.filename(), "cc:");
+ BOOST_TEST(!p.has_parent_path());
+ BOOST_TEST(p.has_filename());
+
+ // Windows specific tests
     if (platform == "Windows")
     {
  


Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk