[DEBUG] remove segfault when set /.. path

This commit is contained in:
Edouard DUPIN 2014-05-14 21:13:21 +02:00
parent 6bec5ddccb
commit 2059e5f06a

View File

@ -29,12 +29,15 @@ extern "C" {
#include <time.h> #include <time.h>
#endif #endif
#undef __class__
#define __class__ "FSNode"
#define TK_DBG_MODE TK_VERBOSE #define TK_DBG_MODE TK_VERBOSE
//#define TK_DBG_MODE TK_DEBUG //#define TK_DBG_MODE TK_DEBUG
std::string etk::simplifyPath(std::string _input) { std::string etk::simplifyPath(std::string _input) {
// step 1 : for windows change \ in /: // step 1 : for windows change \ in /:
TK_DBG_MODE("Siplify(1) : \"" << _input << "\""); TK_DBG_MODE("Simplify(1) : '" << _input << "'");
size_t currentPos = 0; size_t currentPos = 0;
if (_input.size() == 0) { if (_input.size() == 0) {
return _input; return _input;
@ -47,7 +50,7 @@ std::string etk::simplifyPath(std::string _input) {
continue; continue;
} }
// step 2 : remove all '//' // step 2 : remove all '//'
TK_DBG_MODE("Siplify(2) : \"" << _input << "\""); TK_DBG_MODE("Simplify(2) : '" << _input << "'");
currentPos = 0; currentPos = 0;
if (_input.size() <= 1) { if (_input.size() <= 1) {
return _input; return _input;
@ -61,12 +64,13 @@ std::string etk::simplifyPath(std::string _input) {
_input.erase(currentPos, 1); _input.erase(currentPos, 1);
} }
// step 3 : remove all '/./' // step 3 : remove all '/./'
TK_DBG_MODE("Siplify(3) : \"" << _input << "\""); TK_DBG_MODE("Simplify(3) : '" << _input << "'");
currentPos = 0; currentPos = 0;
if (_input.size() <= 1) { if (_input.size() <= 1) {
return _input; return _input;
} }
while(currentPos < _input.size()-2) { while( currentPos < _input.size()-2
&& _input.size() > 2) {
if ( _input[currentPos] != '/' if ( _input[currentPos] != '/'
|| _input[currentPos+1] != '.' || _input[currentPos+1] != '.'
|| _input[currentPos+2] != '/') { || _input[currentPos+2] != '/') {
@ -75,14 +79,15 @@ std::string etk::simplifyPath(std::string _input) {
} }
_input.erase(currentPos, 2); _input.erase(currentPos, 2);
} }
if (end_with(_input, "/.") == true) {
_input.erase(_input.size()-1, 1);
}
// step 4 remove xxx/.. // step 4 remove xxx/..
TK_DBG_MODE("Siplify(4) : \"" << _input << "\""); TK_DBG_MODE("Simplify(4) : '" << _input << "'");
size_t lastSlashPos = std::string::npos; size_t lastSlashPos = std::string::npos;
currentPos = 0; currentPos = 0;
if (_input.size() <= 2) { while( currentPos < _input.size()-2
return _input; && _input.size() > 2) {
}
while(currentPos < _input.size()-2) {
if ( _input[currentPos] != '/' if ( _input[currentPos] != '/'
|| _input[currentPos+1] != '.' || _input[currentPos+1] != '.'
|| _input[currentPos+2] != '.') { || _input[currentPos+2] != '.') {
@ -97,11 +102,21 @@ std::string etk::simplifyPath(std::string _input) {
continue; continue;
} }
_input.erase(lastSlashPos, currentPos+2-lastSlashPos+1); _input.erase(lastSlashPos, currentPos+2-lastSlashPos+1);
TK_DEBUG("update : \"" << _input << "\""); TK_DEBUG("update : '" << _input << "'");
lastSlashPos = std::string::npos; lastSlashPos = std::string::npos;
currentPos = 0; currentPos = 0;
} }
TK_DBG_MODE("Siplify(5) : \"" << _input << "\""); TK_DBG_MODE("Simplify(5) : '" << _input << "'");
if (_input.size() == 0) {
_input = "/";
}
if ( _input == "/../"
|| _input == "/.."
|| _input == "/./"
|| _input == "/.") {
_input = "/";
}
TK_DBG_MODE("Simplify(6) : '" << _input << "'");
return _input; return _input;
} }
@ -452,13 +467,6 @@ static int32_t FSNODE_LOCAL_mkPath(const char* _path, mode_t _mode) {
return (status); return (status);
} }
#undef __class__
#define __class__ "FSNode"
etk::FSNode::FSNode(const std::string& _nodeName) : etk::FSNode::FSNode(const std::string& _nodeName) :
m_userFileName(""), m_userFileName(""),
m_type(etk::FSN_TYPE_UNKNOW), m_type(etk::FSN_TYPE_UNKNOW),