From 53b4bd019fe6b34559da1ce9c92533c9f79301ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Mr=C3=A1zek?= Date: Mon, 28 Mar 2016 20:52:14 +0200 Subject: NOISSUE fix bug in unpacking of forge pack200 jar files This caused failed downloads and broken files to be used. --- logic/minecraft/forge/ForgeXzDownload.cpp | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) (limited to 'logic/minecraft/forge') diff --git a/logic/minecraft/forge/ForgeXzDownload.cpp b/logic/minecraft/forge/ForgeXzDownload.cpp index 2a47bb26..adf96552 100644 --- a/logic/minecraft/forge/ForgeXzDownload.cpp +++ b/logic/minecraft/forge/ForgeXzDownload.cpp @@ -143,6 +143,7 @@ void ForgeXzDownload::downloadReadyRead() #include "xz.h" #include "unpack200.h" #include +#include const size_t buffer_size = 8196; @@ -275,7 +276,14 @@ void ForgeXzDownload::decompressAndInstall() failAndTryNextMirror(); return; } - FILE * file_in = fdopen(handle_in,"r"); + int handle_in_dup = dup (handle_in); + if(handle_in_dup == -1) + { + qCritical() << "Error reopening " << pack200_file.fileName(); + failAndTryNextMirror(); + return; + } + FILE *file_in = fdopen (handle_in_dup, "rb"); if(!file_in) { qCritical() << "Error reopening " << pack200_file.fileName(); @@ -296,7 +304,14 @@ void ForgeXzDownload::decompressAndInstall() failAndTryNextMirror(); return; } - FILE * file_out = fdopen(handle_out,"w"); + int handle_out_dup = dup (handle_out); + if(handle_out_dup == -1) + { + qCritical() << "Error reopening " << qfile_out.fileName(); + failAndTryNextMirror(); + return; + } + FILE *file_out = fdopen (handle_out_dup, "wb"); if(!file_out) { qCritical() << "Error opening " << qfile_out.fileName(); @@ -305,6 +320,7 @@ void ForgeXzDownload::decompressAndInstall() } try { + // NOTE: this takes ownership of both FILE pointers. That's why we duplicate them above. unpack_200(file_in, file_out); } catch (std::runtime_error &err) -- cgit v1.2.3