Subject: [Boost-bugs] [Boost C++ Libraries] #10731: make_permissions is case-inconsistent and requires unnecessary conversions
From: Boost C++ Libraries (noreply_at_[hidden])
Date: 2014-10-31 23:02:48
#10731: make_permissions is case-inconsistent and requires unnecessary conversions
-------------------------------+------------------------
Reporter: daniel.kruegler@⦠| Owner: bemandawes
Type: Bugs | Status: new
Milestone: To Be Determined | Component: filesystem
Version: Boost 1.56.0 | Severity: Problem
Keywords: |
-------------------------------+------------------------
There exist two notable issues with the internal function make_permissions
in operations.cpp (Windows only):
a) The usage of the macro BOOST_FILESYSTEM_STRICMP implies case-
insensitive comparison, but for compilers different from _MSC_VER it
actually calls the case-sensitive function std::strcmp.
b) The code uses up to four code-conversions (wchar_t->char) to invoke the
comparison function, all of the following form:
{{{
BOOST_FILESYSTEM_STRICMP(p.extension().string().c_str(), ".exe")
}}}
It seems that there exist a simple and consistent way to solve these
problems: Replace the macro BOOST_FILESYSTEM_STRICMP by
boost::algorithm::iequals and do not perform code conversion. Essentially
the make_permissions code could be changed to the following form -
assuming an additional inclusion of
{{{
#include "boost/algorithm/string/predicate.hpp"
}}}
and removal of the BOOST_FILESYSTEM_STRICMP macro definition (which is no-
where else used):
{{{
perms make_permissions(const path& p, DWORD attr)
{
perms prms = fs::owner_read | fs::group_read | fs::others_read;
if ((attr & FILE_ATTRIBUTE_READONLY) == 0)
prms |= fs::owner_write | fs::group_write | fs::others_write;
if (boost::algorithm::iequals(p.extension().c_str(), L".exe")
|| boost::algorithm::iequals(p.extension().c_str(), L".com")
|| boost::algorithm::iequals(p.extension().c_str(), L".bat")
|| boost::algorithm::iequals(p.extension().c_str(), L".cmd"))
prms |= fs::owner_exe | fs::group_exe | fs::others_exe;
return prms;
}
}}}
Given that boost::algorithm::iequals allows to provide a std::locale
object as additional argument, one could improve that solution even more
by providing the same locale as that from path_locale() within path.cpp.
Unfortunately there is no access within operations.cpp to that function
(which is within an unnamed namespace), so realizing this second
improvement would require a larger surgery.
-- Ticket URL: <https://svn.boost.org/trac/boost/ticket/10731> 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:17 UTC