From cc2f36492666be11da12890b35303a63e3aced87 Mon Sep 17 00:00:00 2001 From: Dominik Riebeling Date: Wed, 13 Apr 2022 21:31:02 +0200 Subject: rbutil: Fix ipodpatcher bootloader install on Windows. During bootloader installation ipodpatcher disk access is accidentially set up twice. This is not a problem except on Windows, which will abort with a "permission denied" error. Change-Id: I9a835ef0d49f24df741b7b2909c4bd87cb1c8341 --- utils/ipodpatcher/ipodio-posix.c | 1 + utils/ipodpatcher/ipodio-win32.c | 1 + utils/rbutilqt/base/bootloaderinstallipod.cpp | 28 ++++++++++++++------------- 3 files changed, 17 insertions(+), 13 deletions(-) diff --git a/utils/ipodpatcher/ipodio-posix.c b/utils/ipodpatcher/ipodio-posix.c index 9b386d994f..dc856a2e0d 100644 --- a/utils/ipodpatcher/ipodio-posix.c +++ b/utils/ipodpatcher/ipodio-posix.c @@ -355,6 +355,7 @@ int ipod_reopen_rw(struct ipod_t* ipod) int ipod_close(struct ipod_t* ipod) { close(ipod->dh); + ipod->dh = -1; return 0; } diff --git a/utils/ipodpatcher/ipodio-win32.c b/utils/ipodpatcher/ipodio-win32.c index cea218774a..2c52a64658 100644 --- a/utils/ipodpatcher/ipodio-win32.c +++ b/utils/ipodpatcher/ipodio-win32.c @@ -155,6 +155,7 @@ int ipod_close(struct ipod_t* ipod) { unlock_volume(ipod->dh); CloseHandle(ipod->dh); + ipod->dh = INVALID_HANDLE_VALUE; return 0; } diff --git a/utils/rbutilqt/base/bootloaderinstallipod.cpp b/utils/rbutilqt/base/bootloaderinstallipod.cpp index c556ea27d3..a809b813c0 100644 --- a/utils/rbutilqt/base/bootloaderinstallipod.cpp +++ b/utils/rbutilqt/base/bootloaderinstallipod.cpp @@ -42,19 +42,6 @@ BootloaderInstallIpod::~BootloaderInstallIpod() bool BootloaderInstallIpod::install(void) { - ipodInitialize(&ipod); - - if(ipod.sectorbuf == nullptr) { - emit logItem(tr("Error: can't allocate buffer memory!"), LOGERROR); - emit done(true); - return false; - } - - // save buffer pointer before cleaning up ipod_t structure - unsigned char* sb = ipod.sectorbuf; - memset(&ipod, 0, sizeof(struct ipod_t)); - ipod.sectorbuf = sb; - if(!ipodInitialize(&ipod)) { emit done(true); return false; @@ -223,6 +210,21 @@ BootloaderInstallBase::Capabilities BootloaderInstallIpod::capabilities(void) */ bool BootloaderInstallIpod::ipodInitialize(struct ipod_t *ipod) { + // if the ipod was already opened make sure to close it first. +#if defined(Q_OS_WIN32) + if(ipod->dh != INVALID_HANDLE_VALUE) +#else + if(ipod->dh >= 0) +#endif + { + ipod_close(ipod); + } + + // save buffer pointer before cleaning up ipod_t structure + unsigned char* sb = ipod->sectorbuf; + memset(ipod, 0, sizeof(struct ipod_t)); + ipod->sectorbuf = sb; + // initialize sector buffer. The sector buffer is part of the ipod_t // structure, so a second instance of this class will have its own buffer. if(ipod->sectorbuf == nullptr) { -- cgit v1.2.3