summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDominik Riebeling <Dominik.Riebeling@gmail.com>2022-04-13 21:31:02 +0200
committerDominik Riebeling <Dominik.Riebeling@gmail.com>2022-04-13 21:36:44 +0200
commitcc2f36492666be11da12890b35303a63e3aced87 (patch)
tree54beafc2aca5cafe18690f22631c13c1a732ee75
parentb9ab75732ad53659b7aa9b6e7bb7e37769cb708f (diff)
downloadrockbox-cc2f364926.tar.gz
rockbox-cc2f364926.zip
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
-rw-r--r--utils/ipodpatcher/ipodio-posix.c1
-rw-r--r--utils/ipodpatcher/ipodio-win32.c1
-rw-r--r--utils/rbutilqt/base/bootloaderinstallipod.cpp28
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) {