From 1bd665563bfff9e312f1b0cb5ecb6c9fd4812fd1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Mon, 9 Nov 2015 22:11:46 +0100 Subject: [PATCH] Improve memory setup for Linux DATASEG was mapped, but did not have its contents filled properly. It is now done as the process expects it. Extend memory checksum region to catch possible corruptions early. Fixes #2063 --- src/openrct2.c | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/src/openrct2.c b/src/openrct2.c index 483f0533f2..b3833ac573 100644 --- a/src/openrct2.c +++ b/src/openrct2.c @@ -501,7 +501,8 @@ static bool openrct2_setup_rct2_segment() // Linux will run OpenRCT2 as a native application and then load in the Windows PE, mapping the appropriate addresses as // necessary. Windows does not need to do this as OpenRCT2 runs as a DLL loaded from the Windows PE. #ifdef __linux__ - #define DATA_OFFSET 0x004A4000 + #define RDATA_OFFSET 0x004A4000 + #define DATASEG_OFFSET 0x005E2000 const char *exepath = "openrct2.exe"; gExeFd = open(exepath, O_RDONLY); @@ -567,7 +568,9 @@ static bool openrct2_setup_rct2_segment() } // .rdata and real part of .data // 0x9e2000 - 0x8a4000 = 0x13e000 - memcpy(gDataSegment, fbase + DATA_OFFSET, 0x13e000); + memcpy(gDataSegment, fbase + RDATA_OFFSET, 0x13e000); + // 0x8a4000 + 0xb84000 = 0x1428000 aka DATASEG + memcpy(gDataSegment + 0xB84000, fbase + DATASEG_OFFSET, 0x1000); err = munmap(fbase, file_size); if (err != 0) { @@ -577,13 +580,15 @@ static bool openrct2_setup_rct2_segment() #endif // __linux__ // Check that the expected data is at various addresses. - const uint32 c1 = sawyercoding_calculate_checksum((void *)0x009ACFA4, 128); - const uint32 c2 = sawyercoding_calculate_checksum((void *)0x009ACFA4, 720 * 4); - const uint32 exp_c1 = 32640; - const uint32 exp_c2 = 734400; + // Start at 0x9a6000, which is start of .data, to skip the region containing addresses to DLL + // calls, which can be changed by windows/wine loader. + const uint32 c1 = sawyercoding_calculate_checksum((void *)0x009A6000, 0x009E0000 - 0x009A6000); + const uint32 c2 = sawyercoding_calculate_checksum((void *)0x01428000, 0x014282BC - 0x01428000); + const uint32 exp_c1 = 10114815; + const uint32 exp_c2 = 23564; if (c1 != exp_c1 || c2 != exp_c2) { log_warning("c1 = %u, expected %u, match %d", c1, exp_c1, c1 == exp_c1); - log_warning("c1 = %u, expected %u, match %d", c2, exp_c2, c2 == exp_c2); + log_warning("c2 = %u, expected %u, match %d", c2, exp_c2, c2 == exp_c2); return false; }