🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.os.linux.programowanie
Article #72881

Dziwny wyciek zasobów

#72881
From: Szyk Cech
Date: Sat, 09 Mar 2019 13:09
117 lines
5064 bytes
Witam

[WSTĘP]
Mam program w C++ oparty na bibliotece Qt. Generalnie program jest 
niezależny od systemu operacyjnego. Jednak z jakichś dziwnych względów 
biblioteka Qt nie ma możliwości operowania na datach plików i katalogów. 
Dlatego napisałem funkcję w oparciu o Api Linux-a realizującą kopiowanie 
dat plików. Jest to przydatne podczas kopiowania.

[PROBLEM]
Mam jakiś wyciek zasobów. W pewnym momencie operacja fopen się nie udaje 
(po całkiem sporej liczbie poprawnych operacji). Wg mnie wszystko 
powinno grać, ale błąd występuje.

[KOD]
Oto kod mojej funkcji:

void gCopyFileAtributes(QString aSource, QString aDest)
{
     if(!QFileInfo::exists(aSource))
         NOTIFY_EXCEPTION(QObject::tr("Source file does not exists: 
%1").arg(aSource), gLibraryId, eErrorCode::eFileSystemError);
     if(!QFileInfo::exists(aDest))
         NOTIFY_EXCEPTION(QObject::tr("Destination file does not exists: 
%1").arg(aDest), gLibraryId, eErrorCode::eFileSystemError);

     FILE* lSrc = fopen(aSource.toUtf8(), "r");
     if(!lSrc)
         NOTIFY_EXCEPTION(QObject::tr("fopen failed for file: %1: 
%2").arg(aSource).arg(strerror(errno)), gLibraryId, 
eErrorCode::eFileSystemError);

     FILE* lDest = fopen(aDest.toUtf8(), "w");
     if(!lDest)
     {
         fclose(lSrc);
         NOTIFY_EXCEPTION(QObject::tr("fopen failed for file: %1: 
%2").arg(aDest).arg(strerror(errno)), gLibraryId, 
eErrorCode::eFileSystemError);
     }

     struct stat lStat;
     if(fstat(fileno(lSrc),&lStat))
     {
         fclose(lSrc);
         fclose(lDest);
         NOTIFY_EXCEPTION(QObject::tr("fstat failed for file: %1: 
%2").arg(aSource).arg(strerror(errno)), gLibraryId, 
eErrorCode::eFileSystemError);
     }


     // Update to the same uid/gid
     if(fchown(fileno(lDest), lStat.st_uid,lStat.st_gid))
     {
         fclose(lSrc);
         fclose(lDest);
         NOTIFY_EXCEPTION(QObject::tr("fchown failed: 
%1").arg(strerror(errno)), gLibraryId, eErrorCode::eFileSystemError);
     }

     // Update the permissions
     if(fchmod(fileno(lDest), lStat.st_mode))
     {
         fclose(lSrc);
         fclose(lDest);
         NOTIFY_EXCEPTION(QObject::tr("fchmod failed: 
%1").arg(strerror(errno)), gLibraryId, eErrorCode::eFileSystemError);
     }

     // Change access time
     timeval lTimes[2];
     lTimes[0].tv_sec = lStat.st_atim.tv_sec;
     quint32 lUsecA(static_cast<quint32>(lStat.st_atim.tv_nsec / 1000));
     lTimes[0].tv_usec = lUsecA;

     // Change modification time
     lTimes[1].tv_sec = lStat.st_mtim.tv_sec;
     quint32 lUsecM(static_cast<quint32>(lStat.st_mtim.tv_nsec / 1000));
     lTimes[1].tv_usec = lUsecM;

     if(futimes(fileno(lDest), lTimes))
     {
         fclose(lSrc);
         fclose(lDest);
         NOTIFY_EXCEPTION(QObject::tr("futimes failed: 
%1").arg(strerror(errno)), gLibraryId, eErrorCode::eFileSystemError);
     }

     fclose(lSrc);
     fclose(lDest);
}

[OPIS FUNCKCJI]
Jak widać wszystko tworzone jest na stosie z wyjątkiem 2 zmiennych lSrc 
i lDest. Jednak one są zawsze zwalniane i po za tym wyjątki nie są 
zgłaszane w trakcie wcześniejszej pracy.

[OPIS ZGŁASZANEGO BŁĘDU]
File: ../../../../Kopia3/Src/Libs/Common/Src/FileTools.Linux.cpp, in 
line: 26, in function: gCopyFileAtributes
Error code: 3, Error message: fopen failed for file: 
/tmp/Kopia/!-dokumenty 2019-03-09 13-17-03/Programowanie/Qt/C++ GUI 
Programming with Qt 4/qt-book/chap06/mdieditor/images/new.png: Brak dostępu
Exception occurs! Sender: Common.so, Error code: 3
Message:
File: ../../../../Kopia3/Src/Libs/Common/Src/FileTools.Linux.cpp, in 
line: 26, in function: gCopyFileAtributes
Error code: 3, Error message: fopen failed for file: 
/tmp/Kopia/!-dokumenty 2019-03-09 13-17-03/Programowanie/Qt/C++ GUI 
Programming with Qt 4/qt-book/chap06/mdieditor/images/new.png: Brak dostępu
Bug report has been sent...

Może ktoś doradzi jak prawidłowo powinna wyglądać ta funkcja?
dzięki i pozdro
Szyk Cech
Technical Details
Message-ID: <IWOgE.6825$WX2.4449@fx16.fr7>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!news.nask.pl!news.nask.org.pl!news.unit0.net!newsreader4.netcologne.de!news.netcologne.de!peer03.ams1!peer.ams1.xlned.com!news.xlned.com!peer03.fr7!futter-mich.highwinds-media.com!news.highwinds-media.com!fx16.fr7.POSTED!not-for-mail

Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!news.nask.pl!news.nask.org.pl!news.unit0.net!newsreader4.netcologne.de!news.netcologne.de!peer03.ams1!peer.ams1.xlned.com!news.xlned.com!peer03.fr7!futter-mich.highwinds-media.com!news.highwinds-media.com!fx16.fr7.POSTED!not-for-mail
Newsgroups: pl.comp.os.linux.programowanie
X-Mozilla-News-Host: snews://newshosting.com:563
From: Szyk Cech <szykcech@spoko.pl>
Subject: Dziwny wyciek zasobów
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.5.1
MIME-Version: 1.0
Lines: 117
Message-ID: <IWOgE.6825$WX2.4449@fx16.fr7>
X-Complaints-To: abuse(at)newshosting.com
NNTP-Posting-Date: Sat, 09 Mar 2019 13:10:00 UTC
Organization: Newshosting.com - Highest quality at a great price! www.newshosting.com
Date: Sat, 9 Mar 2019 14:09:59 +0100
X-Received-Bytes: 4945
X-Received-Body-CRC: 249434268
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit