diff options
author | Thomas Preud'homme <robotux@celest.fr> | 2020-08-31 00:06:58 +0100 |
---|---|---|
committer | Thomas Preud'homme <robotux@celest.fr> | 2020-09-05 20:29:42 +0100 |
commit | 8efbbb6ede28a37326b2d0579e3558182bf5cc12 (patch) | |
tree | 62beeed286cc72e0c74a37d2bfeeb815fc7c6d7a | |
parent | ac95ce6e0538249e9c395904b49b078234fdcb5e (diff) |
Fix requirement for PATH_MAX
POSIX says PATH_MAX *may* be defined and on GNU Hurd it is in fact not
defined. This commit uses dynamic allocation to avoid relying on
PATH_MAX being defined.
Author: Thomas Preud'homme <robotux@debian.org>
Forwarded: https://github.com/alphaonex86/Ultracopier/pull/51
Applied-Upstream: commit:02afb78e2345f5c6fd0891fad554dca13179a0cd
Last-Update: 2020-08-31
3 files changed, 35 insertions, 20 deletions
diff --git a/plugins/CopyEngine/Ultracopier-Spec/ScanFileOrFolder.cpp b/plugins/CopyEngine/Ultracopier-Spec/ScanFileOrFolder.cpp index 014585d..940dddb 100755 --- a/plugins/CopyEngine/Ultracopier-Spec/ScanFileOrFolder.cpp +++ b/plugins/CopyEngine/Ultracopier-Spec/ScanFileOrFolder.cpp @@ -331,9 +331,14 @@ void ScanFileOrFolder::run() INTERNALTYPEPATH ScanFileOrFolder::resolvDestination(const INTERNALTYPEPATH &destination) { INTERNALTYPEPATH temp(destination); - char buf[PATH_MAX]; + std::vector<char> buf(512); ssize_t nbytes=0; - nbytes=readlink(TransferThread::internalStringTostring(destination).c_str(), buf, sizeof(buf)); + do { + buf.resize(buf.size()*2); + nbytes=readlink(TransferThread::internalStringTostring(destination).c_str(), buf.data(), buf.size()); + } while (nbytes == buf.size()); + if (nbytes!=-1) + buf.resize(nbytes); while(nbytes!=-1) { temp=FSabsolutePath(temp); if(!stringEndsWith(destination,'/') @@ -342,14 +347,19 @@ INTERNALTYPEPATH ScanFileOrFolder::resolvDestination(const INTERNALTYPEPATH &des #endif ) temp+=TransferThread::stringToInternalString("/"); - temp+=TransferThread::stringToInternalString(std::string(buf,nbytes)); + temp+=TransferThread::stringToInternalString(std::string(buf.data(), buf.size())); /// \todo change for pure c++ code #ifdef WIDESTRING temp=QFileInfo(QString::fromStdWString(temp)).absoluteFilePath().toStdWString(); #else temp=QFileInfo(QString::fromStdString(temp)).absoluteFilePath().toStdString(); #endif - nbytes=readlink(TransferThread::internalStringTostring(temp).c_str(), buf, sizeof(buf)); + do { + buf.resize(buf.size() * 2); + nbytes=readlink(TransferThread::internalStringTostring(temp).c_str(), buf.data(), buf.size()); + } while (nbytes == buf.size()); + if (nbytes!=-1) + buf.resize(nbytes); } return temp; /*do diff --git a/plugins/CopyEngine/Ultracopier-Spec/TransferThread.cpp b/plugins/CopyEngine/Ultracopier-Spec/TransferThread.cpp index 9cbad5a..d986b49 100755 --- a/plugins/CopyEngine/Ultracopier-Spec/TransferThread.cpp +++ b/plugins/CopyEngine/Ultracopier-Spec/TransferThread.cpp @@ -737,8 +737,7 @@ bool TransferThread::mkpath(const INTERNALTYPEPATH &path) } while(!pathSplit.empty()); return true; #else - char pathC[PATH_MAX]; - strcpy(pathC,TransferThread::internalStringTostring(path).c_str()); + std::string pathC(TransferThread::internalStringTostring(path)); if(!mkdir(path)) if(errno==EEXIST) return true; @@ -748,8 +747,7 @@ bool TransferThread::mkpath(const INTERNALTYPEPATH &path) std::string::size_type previouspos=path.size(); std::string::size_type lastpos=std::string::npos; - char pathCedit[PATH_MAX]; - strcpy(pathCedit,pathC); + std::string pathCedit(pathC); std::vector<std::string::size_type> pathSplit; pathSplit.push_back(path.size()); do @@ -773,14 +771,14 @@ bool TransferThread::mkpath(const INTERNALTYPEPATH &path) return false; #endif - pathCedit[lastpos]='\0'; + pathCedit.resize(lastpos); previouspos=lastpos; errno=0; #ifdef Q_OS_UNIX - if(::mkdir(pathCedit, mode)==-1) + if(::mkdir(pathCedit.c_str(), mode)==-1) #else - if(::mkdir(pathCedit)==-1) + if(::mkdir(pathCedit.c_str())==-1) #endif if(errno!=EEXIST && errno!=ENOENT) return false; @@ -791,14 +789,14 @@ bool TransferThread::mkpath(const INTERNALTYPEPATH &path) do { - strcpy(pathCedit,pathC); + pathCedit = pathC; lastpos=pathSplit.back(); pathSplit.pop_back(); - pathCedit[lastpos]='\0'; + pathCedit.resize(lastpos); #ifdef Q_OS_UNIX - if(::mkdir(pathCedit, mode)==-1) + if(::mkdir(pathCedit.c_str(), mode)==-1) #else - if(::mkdir(pathCedit)==-1) + if(::mkdir(pathCedit.c_str())==-1) #endif if(errno!=EEXIST) return false; diff --git a/plugins/CopyEngine/Ultracopier-Spec/async/TransferThreadAsync.cpp b/plugins/CopyEngine/Ultracopier-Spec/async/TransferThreadAsync.cpp index b5af928..b291b21 100755 --- a/plugins/CopyEngine/Ultracopier-Spec/async/TransferThreadAsync.cpp +++ b/plugins/CopyEngine/Ultracopier-Spec/async/TransferThreadAsync.cpp @@ -620,9 +620,16 @@ void TransferThreadAsync::ifCanStartTransfer() return; } } - char buf[PATH_MAX]; - const ssize_t s=readlink(TransferThread::internalStringTostring(source).c_str(),buf,sizeof(buf)); - buf[s]=0x00; + std::vector<char> buf(512); + ssize_t s=0; + do { + buf.resize(buf.size()*2); + s=readlink(TransferThread::internalStringTostring(source).c_str(),buf.data(),buf.size()); + } while (s == buf.size()); + if (s!=-1) { + buf.resize(s + 1); + buf[s]='\0'; + } if(s<0) { const int terr=errno; @@ -638,12 +645,12 @@ void TransferThreadAsync::ifCanStartTransfer() } else { - if(symlink(buf,TransferThread::internalStringTostring(destination).c_str())!=0) + if(symlink(buf.data(),TransferThread::internalStringTostring(destination).c_str())!=0) { const int terr=errno; const std::string &strError=strerror(terr); ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] stop copy in error "+ - buf+"->"+TransferThread::internalStringTostring(destination)+ + buf.data()+"->"+TransferThread::internalStringTostring(destination)+ " "+strError+"("+std::to_string(terr)+")" ); readError=true; |