From 4c55c50c9e75e80b24a3a45d98edbb40b144ea45 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Blin?= <sebastien.blin@savoirfairelinux.com> Date: Wed, 17 May 2023 15:05:17 -0400 Subject: [PATCH] fileutils: fix eraseFile_win32 for read-only files GitLab: #855 Change-Id: Iaf9819d082b3b3e43291eb58f0ca59f168971542 --- src/fileutils.cpp | 3 +++ src/jamidht/conversationrepository.cpp | 3 ++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/fileutils.cpp b/src/fileutils.cpp index 8440f45e03..57ace9fc02 100644 --- a/src/fileutils.cpp +++ b/src/fileutils.cpp @@ -865,6 +865,9 @@ recursive_mkdir(const std::string& path, mode_t mode) bool eraseFile_win32(const std::string& path, bool dosync) { + // Note: from https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-deletefilea#remarks + // To delete a read-only file, first you must remove the read-only attribute. + SetFileAttributesA(path.c_str(), GetFileAttributesA(path.c_str()) & ~FILE_ATTRIBUTE_READONLY); HANDLE h = CreateFileA(path.c_str(), GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); if (h == INVALID_HANDLE_VALUE) { diff --git a/src/jamidht/conversationrepository.cpp b/src/jamidht/conversationrepository.cpp index 1a49b788f9..b26aa7a6f4 100644 --- a/src/jamidht/conversationrepository.cpp +++ b/src/jamidht/conversationrepository.cpp @@ -2589,7 +2589,8 @@ ConversationRepository::cloneConversation(const std::shared_ptr<JamiAccount>& ac if (fileutils::isDirectory(path)) { // If a crash occurs during a previous clone, just in case JAMI_WARNING("Removing existing directory {} (the dir exists and non empty)", path); - fileutils::removeAll(path, true); + if (!fileutils::removeAll(path, true)) + return nullptr; } JAMI_DEBUG("Start clone of {:s} to {:s}", url, path); -- GitLab