retitle 931199 buster-pu: package freeorion/0.4.8-1+deb10u1
user [email protected]
usertags 931199 - unblock
usertags 931199 pu
tags 931199 buster
thanks

Dear release team,

please find attached the debdiff between the version in Buster and
testing that fixes the load and save crash bug in freeorion.

Regards,

Markus
diff -Nru freeorion-0.4.8/debian/changelog freeorion-0.4.8/debian/changelog
--- freeorion-0.4.8/debian/changelog    2018-08-31 17:09:10.000000000 +0200
+++ freeorion-0.4.8/debian/changelog    2019-07-27 03:24:19.000000000 +0200
@@ -1,3 +1,22 @@
+freeorion (0.4.8-1+deb10u1) buster; urgency=medium
+
+  * Backport "Fix save or load game crash" patch to Buster.
+
+ -- Markus Koschany <[email protected]>  Sat, 27 Jul 2019 03:24:19 +0200
+
+freeorion (0.4.8-3) unstable; urgency=medium
+
+  * Really fix save or load game crash. (Closes: #930417)
+
+ -- Markus Koschany <[email protected]>  Sun, 23 Jun 2019 01:52:26 +0200
+
+freeorion (0.4.8-2) unstable; urgency=medium
+
+  * Fix save or load game crash. Thanks to Michal Mauser for the report and
+    Bernhard Übelacker for the investigation. (Closes: #930417)
+
+ -- Markus Koschany <[email protected]>  Sun, 16 Jun 2019 01:02:41 +0200
+
 freeorion (0.4.8-1) unstable; urgency=medium
 
   * New upstream version 0.4.8.
diff -Nru freeorion-0.4.8/debian/patches/debian-bug-930417.patch 
freeorion-0.4.8/debian/patches/debian-bug-930417.patch
--- freeorion-0.4.8/debian/patches/debian-bug-930417.patch      1970-01-01 
01:00:00.000000000 +0100
+++ freeorion-0.4.8/debian/patches/debian-bug-930417.patch      2019-07-27 
02:08:52.000000000 +0200
@@ -0,0 +1,147 @@
+From: Markus Koschany <[email protected]>
+Date: Sun, 16 Jun 2019 01:10:41 +0200
+Subject: debian-bug-930417
+
+Bug-Debian: https://bugs.debian.org/930417
+Origin: 
https://github.com/freeorion/freeorion/pull/2366/commits/1e94e406fa309c60c4b68ef08b424b65a7bd0e4d
+---
+ server/SaveLoad.cpp | 70 +++++++++++++++++++++++++++++------------------------
+ 1 file changed, 39 insertions(+), 31 deletions(-)
+
+diff --git a/server/SaveLoad.cpp b/server/SaveLoad.cpp
+index ecb73a3..37614d7 100644
+--- a/server/SaveLoad.cpp
++++ b/server/SaveLoad.cpp
+@@ -333,8 +333,13 @@ void LoadGame(const std::string& filename, 
ServerSaveGameData& server_save_game_
+         if (!ifs)
+             throw std::runtime_error(UNABLE_TO_OPEN_FILE);
+ 
+-        try {
+-            // first attempt binary deserialziation
++        std::string signature(5, '\0');
++        if (!ifs.read(&signature[0], 5))
++            throw std::runtime_error(UNABLE_TO_OPEN_FILE);
++        boost::iostreams::seek(ifs, 0, std::ios_base::beg);
++
++        if (strncmp(signature.c_str(), "<?xml", 5)) {
++            // XML file format signature not found; try as binary
+             freeorion_bin_iarchive ia(ifs);
+             DebugLogger() << "Reading binary iarchive";
+             ia >> BOOST_SERIALIZATION_NVP(ignored_save_preview_data);
+@@ -350,14 +355,10 @@ void LoadGame(const std::string& filename, 
ServerSaveGameData& server_save_game_
+             Deserialize(ia, universe);
+ 
+             DebugLogger() << "Done deserializing";
+-        } catch (...) {
+-            // if binary deserialization failed, try more-portable XML 
deserialization
+-
+-            // reset to start of stream (attempted binary serialization will 
have consumed some input...)
+-            boost::iostreams::seek(ifs, 0, std::ios_base::beg);
+-
++        } else {
+             // create archive with (preallocated) buffer...
+             freeorion_xml_iarchive xia(ifs);
++            DebugLogger() << "Reading XML iarchive";
+             // read from save file: uncompressed header serialized data, with 
compressed main archive string at end...
+             // deserialize uncompressed save header info
+             xia >> BOOST_SERIALIZATION_NVP(ignored_save_preview_data);
+@@ -458,18 +459,21 @@ void LoadGalaxySetupData(const std::string& filename, 
GalaxySetupData& galaxy_se
+         if (!ifs)
+             throw std::runtime_error(UNABLE_TO_OPEN_FILE);
+ 
+-        try {
+-            // first attempt binary deserialziation
++        std::string signature(5, '\0');
++        if (!ifs.read(&signature[0], 5))
++            throw std::runtime_error(UNABLE_TO_OPEN_FILE);
++        boost::iostreams::seek(ifs, 0, std::ios_base::beg);
++
++        if (strncmp(signature.c_str(), "<?xml", 5)) {
++            // XML file format signature not found; try as binary
++            DebugLogger() << "Attempting binary deserialization...";
+             freeorion_bin_iarchive ia(ifs);
+ 
+             ia >> BOOST_SERIALIZATION_NVP(ignored_save_preview_data);
+             ia >> BOOST_SERIALIZATION_NVP(galaxy_setup_data);
+ 
+-        } catch(...) {
+-            // if binary deserialization failed, try more-portable XML 
deserialization
+-
+-            // reset to start of stream (attempted binary serialization will 
have consumed some input...)
+-            boost::iostreams::seek(ifs, 0, std::ios_base::beg);
++        } else {
++            DebugLogger() << "Attempting XML deserialization...";
+             freeorion_xml_iarchive ia(ifs);
+ 
+             ia >> BOOST_SERIALIZATION_NVP(ignored_save_preview_data);
+@@ -498,8 +502,13 @@ void LoadPlayerSaveHeaderData(const std::string& 
filename, std::vector<PlayerSav
+         if (!ifs)
+             throw std::runtime_error(UNABLE_TO_OPEN_FILE);
+ 
+-        try {
+-            // first attempt binary deserialziation
++        std::string signature(5, '\0');
++        if (!ifs.read(&signature[0], 5))
++            throw std::runtime_error(UNABLE_TO_OPEN_FILE);
++        boost::iostreams::seek(ifs, 0, std::ios_base::beg);
++
++        if (strncmp(signature.c_str(), "<?xml", 5)) {
++            // XML file format signature not found; try as binary
+             DebugLogger() << "Attempting binary deserialization...";
+             freeorion_bin_iarchive ia(ifs);
+ 
+@@ -507,13 +516,8 @@ void LoadPlayerSaveHeaderData(const std::string& 
filename, std::vector<PlayerSav
+             ia >> BOOST_SERIALIZATION_NVP(ignored_galaxy_setup_data);
+             ia >> BOOST_SERIALIZATION_NVP(ignored_server_save_game_data);
+             ia >> BOOST_SERIALIZATION_NVP(player_save_header_data);
+-
+-        } catch (...) {
+-            // if binary deserialization failed, try more-portable XML 
deserialization
+-            DebugLogger() << "Trying again with XML deserialization...";
+-
+-            // reset to start of stream (attempted binary serialization will 
have consumed some input...)
+-            boost::iostreams::seek(ifs, 0, std::ios_base::beg);
++        } else {
++            DebugLogger() << "Attempting XML deserialization...";
+             freeorion_xml_iarchive ia(ifs);
+ 
+             ia >> BOOST_SERIALIZATION_NVP(ignored_save_preview_data);
+@@ -521,6 +525,7 @@ void LoadPlayerSaveHeaderData(const std::string& filename, 
std::vector<PlayerSav
+             ia >> BOOST_SERIALIZATION_NVP(ignored_server_save_game_data);
+             ia >> BOOST_SERIALIZATION_NVP(player_save_header_data);
+         }
++
+         // skipping additional deserialization which is not needed for this 
function
+         DebugLogger() << "Done reading player save game data...";
+     } catch (const std::exception& e) {
+@@ -545,8 +550,14 @@ void LoadEmpireSaveGameData(const std::string& filename, 
std::map<int, SaveGameE
+         if (!ifs)
+             throw std::runtime_error(UNABLE_TO_OPEN_FILE);
+ 
+-        try {
+-            // first attempt binary deserialziation
++        std::string signature(5, '\0');
++        if (!ifs.read(&signature[0], 5))
++            throw std::runtime_error(UNABLE_TO_OPEN_FILE);
++        boost::iostreams::seek(ifs, 0, std::ios_base::beg);
++
++        if (strncmp(signature.c_str(), "<?xml", 5)) {
++            // XML file format signature not found; try as binary
++            DebugLogger() << "Attempting binary deserialization...";
+             freeorion_bin_iarchive ia(ifs);
+ 
+             ia >> BOOST_SERIALIZATION_NVP(ignored_save_preview_data);
+@@ -555,11 +566,8 @@ void LoadEmpireSaveGameData(const std::string& filename, 
std::map<int, SaveGameE
+             ia >> BOOST_SERIALIZATION_NVP(ignored_player_save_header_data);
+             ia >> BOOST_SERIALIZATION_NVP(empire_save_game_data);
+ 
+-        } catch (...) {
+-            // if binary deserialization failed, try more-portable XML 
deserialization
+-
+-            // reset to start of stream (attempted binary serialization will 
have consumed some input...)
+-            boost::iostreams::seek(ifs, 0, std::ios_base::beg);
++        } else {
++            DebugLogger() << "Attempting XML deserialization...";
+             freeorion_xml_iarchive ia(ifs);
+ 
+             ia >> BOOST_SERIALIZATION_NVP(ignored_save_preview_data);
diff -Nru freeorion-0.4.8/debian/patches/really-fix-debian-bug-930417.patch 
freeorion-0.4.8/debian/patches/really-fix-debian-bug-930417.patch
--- freeorion-0.4.8/debian/patches/really-fix-debian-bug-930417.patch   
1970-01-01 01:00:00.000000000 +0100
+++ freeorion-0.4.8/debian/patches/really-fix-debian-bug-930417.patch   
2019-07-27 02:08:52.000000000 +0200
@@ -0,0 +1,44 @@
+From: Markus Koschany <[email protected]>
+Date: Sun, 23 Jun 2019 01:50:54 +0200
+Subject: really fix debian bug 930417
+
+Bug-Upstream: https://github.com/freeorion/freeorion/issues/2406
+Origin: 
https://github.com/freeorion/freeorion/commit/3e840f8d747fd0e6a513f3ef0278d3931f813109
+---
+ util/SaveGamePreviewUtils.cpp | 16 +++++++++-------
+ 1 file changed, 9 insertions(+), 7 deletions(-)
+
+diff --git a/util/SaveGamePreviewUtils.cpp b/util/SaveGamePreviewUtils.cpp
+index b9d49df..92122b1 100644
+--- a/util/SaveGamePreviewUtils.cpp
++++ b/util/SaveGamePreviewUtils.cpp
+@@ -65,7 +65,14 @@ namespace {
+ 
+         DebugLogger() << "LoadSaveGamePreviewData: Loading preview from: " << 
path.string();
+         try {
+-            try {
++            // read the first five letters of the stream and check if it is 
opening an xml file
++            std::string xxx5(5, ' ');
++            ifs.read(&xxx5[0], 5);
++            const std::string xml5{"<?xml"};
++            // reset to start of stream
++            boost::iostreams::seek(ifs, 0, std::ios_base::beg);
++            // binary deserialization iff document is not xml
++            if (xml5 != xxx5) {
+                 ScopedTimer timer("LoadSaveGamePreviewData (binary): " + 
path.string(), true);
+ 
+                 // first attempt binary deserialziation
+@@ -74,12 +81,7 @@ namespace {
+                 ia >> BOOST_SERIALIZATION_NVP(save_preview_data);
+                 ia >> BOOST_SERIALIZATION_NVP(galaxy_setup_data);
+ 
+-            } catch (...) {
+-                // if binary deserialization failed, try more-portable XML 
deserialization
+-
+-                // reset to start of stream (attempted binary serialization 
will have consumed some input...)
+-                boost::iostreams::seek(ifs, 0, std::ios_base::beg);
+-
++            } else {
+                 DebugLogger() << "Deserializing XML data";
+                 freeorion_xml_iarchive ia(ifs);
+                 ia >> BOOST_SERIALIZATION_NVP(save_preview_data);
diff -Nru freeorion-0.4.8/debian/patches/series 
freeorion-0.4.8/debian/patches/series
--- freeorion-0.4.8/debian/patches/series       1970-01-01 01:00:00.000000000 
+0100
+++ freeorion-0.4.8/debian/patches/series       2019-07-27 02:08:52.000000000 
+0200
@@ -0,0 +1,2 @@
+debian-bug-930417.patch
+really-fix-debian-bug-930417.patch

Attachment: signature.asc
Description: OpenPGP digital signature

Reply via email to