[Boost-bugs] [Boost C++ Libraries] #2996: [iostreams] Can't open mapped_file data file for read/write access on Windows

Subject: [Boost-bugs] [Boost C++ Libraries] #2996: [iostreams] Can't open mapped_file data file for read/write access on Windows
From: Boost C++ Libraries (noreply_at_[hidden])
Date: 2009-05-05 16:29:58


#2996: [iostreams] Can't open mapped_file data file for read/write access on
Windows
----------------------------------------------+-----------------------------
 Reporter: Allen Cronce <acronce_at_[hidden]> | Owner: turkanis
     Type: Bugs | Status: new
Milestone: Boost 1.39.0 | Component: iostreams
  Version: Boost 1.38.0 | Severity: Problem
 Keywords: |
----------------------------------------------+-----------------------------
 I see access errors when trying to use mapped_file open a data file for
 reading and writing under Windows (built with VS2005). The same code works
 fine under Mac OS X, which is posix, of course.

 Note that I originally found this problem under boost 1.35, but it is
 still present in the just released 1.39 version. Unfortunately it looks
 like trac has not been updated, so I cannot set the "version" to 1.38, or
 the "milestone" to 1.40.

 Here's a code sample that works on Mac OS X and fails under Windows:

 --snip--

 /**
 Test boost iostream mapped_file.
 */
 static int BoostMappedFileTest(void)
 {
         int result = 0;

         std::cout << "\nRunning BoostMappedFileTest..." << std::endl;

         // Initialize our test directory
         fs::path testDirPath( "BoostMappedFileTest" );
         create_directory(testDirPath);

         // Initialize a test file buffer with some data
         const size_t kTestFileSize = 4096;
         boost::scoped_array<char> fileBuffer( new char[kTestFileSize] );
         char* pCur = fileBuffer.get();
         char curChar = 0;
         for( size_t i = 0; i < kTestFileSize; ++i )
         {
                 *pCur++ = curChar++;
         }

         // Write the data to a test file. Be sure to explicitly close it.
         fs::path testFilePath( testDirPath / "test_mapped_file" );
         boost::filesystem::ofstream testFile( testFilePath, ios::trunc |
 ios::binary );
         testFile.write(fileBuffer.get(), kTestFileSize);
         testFile.close();

         // Try and open the test file as a memory mapped file.
         string testFilePathStr = testFilePath.file_string();
         mapped_file mappedFile(testFilePathStr);

         // We never get here under Windows. The file fails to
         // open with an access error.

         // Compare the mapped file data to our original buffer
         const char* mmConstData = mappedFile.const_data();
         bool compareSucceeded = (0 == memcmp(fileBuffer.get(),
 mmConstData, kTestFileSize));
         if (!compareSucceeded)
         {
                 throw runtime_error("The boost memory mapped file data
 doesn't match our buffer!");
         }

         return result;
 }

 --snip--

 The problem seems to come from passing GENERIC_ALL as the
 "dwDesiredAccess" parameter to the CreateFileA call. If I change the
 implementation to pass GENERIC_READ | GENERIC_WRITE, then it works in my
 test scenario. Please note that I haven't tried pointing the current code
 at an actual executable to see if it works with GENERIC_ALL.

 If you assume a strict interpretation of the mapped_file API, the mode of
 BOOST_IOS::in would map to GENERIC_READ in the Windows world, and
 BOOST_IOS::out would map to GENERIC_WRITE. There is no corresponding
 "execute" flag that I can see in this API.

 I've attached a diff created from the boost 1.39 release that fixes the
 problem.

 My email address (in case my trac preferences doesn't work) is
 acronce_at_gmail.com.

-- 
Ticket URL: <https://svn.boost.org/trac/boost/ticket/2996>
Boost C++ Libraries <http://www.boost.org/>
Boost provides free peer-reviewed portable C++ source libraries.

This archive was generated by hypermail 2.1.7 : 2017-02-16 18:50:00 UTC