From e6f966f395868ab6fbbd2474be5493f5c03267ef Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Sun, 18 Jan 2015 19:13:21 +0000 Subject: [PATCH 1/2] Fix intro crash. Caused by incorrect pointer address. Fixed crash on freeing unallocated memory. Fixed audio issue when channels set to zero. --- src/audio/audio.c | 46 +++++++++++++++++++++--------------------- src/drawing/drawing.c | 2 +- src/platform/windows.c | 2 +- 3 files changed, 25 insertions(+), 25 deletions(-) diff --git a/src/audio/audio.c b/src/audio/audio.c index 42e436e3c4..b66978f9cb 100644 --- a/src/audio/audio.c +++ b/src/audio/audio.c @@ -693,32 +693,32 @@ int sound_prepare(int sound_id, rct_sound *sound, int channels, int software) rct_sound_effect* sound_effect = sound_get_effect(sound_id); if (sound_effect) { if (sound_effect_loadvars(sound_effect, &bufferdesc.lpwfxFormat, &buffer, &bufferdesc.dwBufferBytes)) { - bufferdesc.dwFlags = DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_STATIC; - if (channels) { - if (channels == 2) { + if (channels == 0){ + bufferdesc.dwFlags = DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_STATIC; + } + else if (channels == 2) { bufferdesc.dwFlags = DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_CTRL3D | DSBCAPS_STATIC; - } else { + } else { bufferdesc.dwFlags = DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_CTRLVOLUME | DSBCAPS_CTRLPAN | DSBCAPS_CTRLFREQUENCY | DSBCAPS_STATIC; + } + if (RCT2_GLOBAL(0x009E2B90, uint32)) { + bufferdesc.dwFlags |= DSBCAPS_CTRLPAN; + } + if (software) { + bufferdesc.dwFlags |= DSBCAPS_LOCSOFTWARE; + } + if (SUCCEEDED(RCT2_GLOBAL(RCT2_ADDRESS_DIRECTSOUND, LPDIRECTSOUND)->lpVtbl->CreateSoundBuffer(RCT2_GLOBAL(RCT2_ADDRESS_DIRECTSOUND, LPDIRECTSOUND), &bufferdesc, &sound->dsbuffer, 0))) { + if (sound_fill_buffer(sound->dsbuffer, buffer, bufferdesc.dwBufferBytes)) { + sound->id = sound_id; + DSBCAPS caps; + caps.dwSize = sizeof(caps); + sound->dsbuffer->lpVtbl->GetCaps(sound->dsbuffer, &caps); + sound->has_caps = caps.dwFlags; + sound_add(sound); + return 1; } - if (RCT2_GLOBAL(0x009E2B90, uint32)) { - bufferdesc.dwFlags |= DSBCAPS_CTRLPAN; - } - if (software) { - bufferdesc.dwFlags |= DSBCAPS_LOCSOFTWARE; - } - if (SUCCEEDED(RCT2_GLOBAL(RCT2_ADDRESS_DIRECTSOUND, LPDIRECTSOUND)->lpVtbl->CreateSoundBuffer(RCT2_GLOBAL(RCT2_ADDRESS_DIRECTSOUND, LPDIRECTSOUND), &bufferdesc, &sound->dsbuffer, 0))) { - if (sound_fill_buffer(sound->dsbuffer, buffer, bufferdesc.dwBufferBytes)) { - sound->id = sound_id; - DSBCAPS caps; - caps.dwSize = sizeof(caps); - sound->dsbuffer->lpVtbl->GetCaps(sound->dsbuffer, &caps); - sound->has_caps = caps.dwFlags; - sound_add(sound); - return 1; - } - sound->dsbuffer->lpVtbl->Release(sound->dsbuffer); - sound->dsbuffer = 0; - } + sound->dsbuffer->lpVtbl->Release(sound->dsbuffer); + sound->dsbuffer = 0; } sound->dsbuffer = 0; } diff --git a/src/drawing/drawing.c b/src/drawing/drawing.c index 26a57dc3ec..fdd0be4148 100644 --- a/src/drawing/drawing.c +++ b/src/drawing/drawing.c @@ -136,7 +136,7 @@ void gfx_transpose_palette(int pal, unsigned char product) rct_g1_element g1 = RCT2_ADDRESS(RCT2_ADDRESS_G1_ELEMENTS, rct_g1_element)[pal]; int width = g1.width; int x = g1.x_offset; - uint8* dest_pointer = (uint8*)&(RCT2_ADDRESS(0x014124680,uint8)[x]); + uint8* dest_pointer = (uint8*)&(RCT2_ADDRESS(0x01424680, uint8)[x * 4]); uint8* source_pointer = g1.offset; for (; width > 0; width--) { diff --git a/src/platform/windows.c b/src/platform/windows.c index c258dbcc77..dc6763e776 100644 --- a/src/platform/windows.c +++ b/src/platform/windows.c @@ -70,7 +70,7 @@ __declspec(dllexport) int StartOpenRCT(HINSTANCE hInstance, HINSTANCE hPrevInsta // Get command line arguments in standard form argv = CommandLineToArgvA(lpCmdLine, &argc); runGame = cmdline_run(argv, argc); - LocalFree(argv); + //LocalFree(argv); if (runGame) openrct2_launch(); From efad54f1c6c2c93db118c6ed376b37fa03d4d486 Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Sun, 18 Jan 2015 20:56:08 +0000 Subject: [PATCH 2/2] Fix arg_parse accessing invalid memory due to mistake in setup code. Reintroduced free memory of command line parameters --- src/cmdline.c | 4 ---- src/platform/windows.c | 8 +++++--- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/src/cmdline.c b/src/cmdline.c index 3964c2f2be..d101e4ca25 100644 --- a/src/cmdline.c +++ b/src/cmdline.c @@ -50,10 +50,6 @@ static const char *const usage[] = { */ int cmdline_run(const char **argv, int argc) { - // For argparse's sake, add virtual first argument process path - argc++; - argv--; - // int version = 0, verbose = 0, width = 0, height = 0; diff --git a/src/platform/windows.c b/src/platform/windows.c index dc6763e776..a40c6e8bb4 100644 --- a/src/platform/windows.c +++ b/src/platform/windows.c @@ -70,7 +70,7 @@ __declspec(dllexport) int StartOpenRCT(HINSTANCE hInstance, HINSTANCE hPrevInsta // Get command line arguments in standard form argv = CommandLineToArgvA(lpCmdLine, &argc); runGame = cmdline_run(argv, argc); - //LocalFree(argv); + GlobalFree(argv); if (runGame) openrct2_launch(); @@ -243,11 +243,13 @@ PCHAR *CommandLineToArgvA(PCHAR CmdLine, int *_argc) i = ((len + 2) / 2)*sizeof(PVOID) + sizeof(PVOID); argv = (PCHAR*)GlobalAlloc(GMEM_FIXED, - i + (len + 2)*sizeof(CHAR)); + i + (len + 2)*sizeof(CHAR) + 1); _argv = (PCHAR)(((PUCHAR)argv) + i); - argc = 0; + // Add in virtual 1st command line argument, process path, for arg_parse's sake. + argv[0] = 0; + argc = 1; argv[argc] = _argv; in_QM = FALSE; in_TEXT = FALSE;