least-effort "fix" octoshock exe load hard crash
This commit is contained in:
parent
a5efc8f93b
commit
76c8b33f16
Binary file not shown.
|
@ -78,6 +78,7 @@ copy /Y "$(TargetDir)$(TargetName).dll" "$(SolutionDir)..\..\..\output\dll\$(Tar
|
|||
<ClCompile Include="..\emuware\emuware.cpp" />
|
||||
<ClCompile Include="..\emuware\EW_state.cpp" />
|
||||
<ClCompile Include="..\endian.cpp" />
|
||||
<ClCompile Include="..\error.cpp" />
|
||||
<ClCompile Include="..\octoshock.cpp" />
|
||||
<ClCompile Include="..\psx\cdc.cpp" />
|
||||
<ClCompile Include="..\psx\cpu.cpp" />
|
||||
|
|
|
@ -0,0 +1,144 @@
|
|||
/******************************************************************************/
|
||||
/* Mednafen - Multi-system Emulator */
|
||||
/******************************************************************************/
|
||||
/* error.cpp:
|
||||
** Copyright (C) 2007-2016 Mednafen Team
|
||||
**
|
||||
** This program is free software; you can redistribute it and/or
|
||||
** modify it under the terms of the GNU General Public License
|
||||
** as published by the Free Software Foundation; either version 2
|
||||
** of the License, or (at your option) any later version.
|
||||
**
|
||||
** This program is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
*/
|
||||
|
||||
#include "error.h"
|
||||
#include <cstdarg>
|
||||
#include <cstdio>
|
||||
#include <vector>
|
||||
|
||||
MDFN_Error::MDFN_Error() noexcept
|
||||
{
|
||||
abort();
|
||||
}
|
||||
|
||||
MDFN_Error::MDFN_Error(int errno_code_new, const char *format, ...) noexcept
|
||||
{
|
||||
errno_code = errno_code_new;
|
||||
|
||||
va_list ap;
|
||||
va_start(ap, format);
|
||||
va_list ap_copy;
|
||||
va_copy(ap_copy, ap);
|
||||
std::vector<char> buf(1+vsnprintf(nullptr, 0, format, ap));
|
||||
va_end(ap);
|
||||
(void)vsnprintf(buf.data(), buf.size(),format, ap_copy);
|
||||
va_end(ap_copy);
|
||||
error_message = strdup(buf.data());
|
||||
va_end(ap);
|
||||
}
|
||||
|
||||
|
||||
MDFN_Error::MDFN_Error(const ErrnoHolder &enh)
|
||||
{
|
||||
errno_code = enh.Errno();
|
||||
|
||||
error_message = strdup(enh.StrError());
|
||||
}
|
||||
|
||||
|
||||
MDFN_Error::~MDFN_Error() noexcept
|
||||
{
|
||||
if(error_message)
|
||||
{
|
||||
free(error_message);
|
||||
error_message = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
MDFN_Error::MDFN_Error(const MDFN_Error &ze_error) noexcept
|
||||
{
|
||||
if(ze_error.error_message)
|
||||
error_message = strdup(ze_error.error_message);
|
||||
else
|
||||
error_message = NULL;
|
||||
|
||||
errno_code = ze_error.errno_code;
|
||||
}
|
||||
|
||||
MDFN_Error& MDFN_Error::operator=(const MDFN_Error &ze_error) noexcept
|
||||
{
|
||||
char *new_error_message = ze_error.error_message ? strdup(ze_error.error_message) : NULL;
|
||||
int new_errno_code = ze_error.errno_code;
|
||||
|
||||
if(error_message)
|
||||
free(error_message);
|
||||
|
||||
error_message = new_error_message;
|
||||
errno_code = new_errno_code;
|
||||
|
||||
return(*this);
|
||||
}
|
||||
|
||||
|
||||
const char * MDFN_Error::what(void) const noexcept
|
||||
{
|
||||
if(!error_message)
|
||||
return("Error allocating memory for the error message!");
|
||||
|
||||
return(error_message);
|
||||
}
|
||||
|
||||
int MDFN_Error::GetErrno(void) const noexcept
|
||||
{
|
||||
return(errno_code);
|
||||
}
|
||||
|
||||
static MDFN_NOWARN_UNUSED const char *srr_wrap(int ret, const char *local_strerror)
|
||||
{
|
||||
if(ret == -1)
|
||||
return("ERROR IN strerror_r()!!!");
|
||||
|
||||
return(local_strerror);
|
||||
}
|
||||
|
||||
static MDFN_NOWARN_UNUSED const char *srr_wrap(const char *ret, const char *local_strerror)
|
||||
{
|
||||
if(ret == NULL)
|
||||
return("ERROR IN strerror_r()!!!");
|
||||
|
||||
return(ret);
|
||||
}
|
||||
|
||||
void ErrnoHolder::SetErrno(int the_errno)
|
||||
{
|
||||
local_errno = the_errno;
|
||||
|
||||
if(the_errno == 0)
|
||||
local_strerror[0] = 0;
|
||||
else
|
||||
{
|
||||
#ifdef HAVE_STRERROR_R
|
||||
const char *retv;
|
||||
|
||||
retv = srr_wrap(strerror_r(the_errno, local_strerror, 256), local_strerror);
|
||||
|
||||
if(retv != local_strerror)
|
||||
strncpy(local_strerror, retv, 255);
|
||||
|
||||
#else // No strerror_r :(
|
||||
|
||||
strncpy(local_strerror, strerror(the_errno), 255);
|
||||
|
||||
#endif
|
||||
|
||||
local_strerror[255] = 0;
|
||||
}
|
||||
}
|
|
@ -4,6 +4,7 @@
|
|||
#include <errno.h>
|
||||
#include <string.h>
|
||||
#include <exception>
|
||||
#include "emuware/emuware.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
||||
|
@ -22,7 +23,7 @@ class MDFN_Error : public std::exception
|
|||
MDFN_Error(const MDFN_Error &ze_error) noexcept;
|
||||
MDFN_Error & operator=(const MDFN_Error &ze_error) noexcept;
|
||||
|
||||
// virtual const char *what(void) const noexcept;
|
||||
virtual const char *what(void) const noexcept;
|
||||
int GetErrno(void) const noexcept;
|
||||
|
||||
private:
|
||||
|
|
|
@ -1919,9 +1919,8 @@ static MDFN_COLD void LoadEXE(const uint8 *data, const uint32 size, bool ignore_
|
|||
uint32 TextStart;
|
||||
uint32 TextSize;
|
||||
|
||||
//TODO ERROR HANDLING
|
||||
//if(size < 0x800)
|
||||
// throw(MDFN_Error(0, "PS-EXE is too small."));
|
||||
if(size < 0x800)
|
||||
throw(MDFN_Error(0, "PS-EXE is too small."));
|
||||
|
||||
PC = MDFN_de32lsb<false>(&data[0x10]);
|
||||
SP = MDFN_de32lsb<false>(&data[0x30]);
|
||||
|
@ -1937,16 +1936,14 @@ static MDFN_COLD void LoadEXE(const uint8 *data, const uint32 size, bool ignore_
|
|||
|
||||
if(TextSize > 2048 * 1024)
|
||||
{
|
||||
//TODO ERROR HANDLING
|
||||
//throw(MDFN_Error(0, "Text section too large"));
|
||||
throw(MDFN_Error(0, "Text section too large"));
|
||||
}
|
||||
|
||||
//TODO ERROR HANDLING
|
||||
/*if(TextSize > (size - 0x800))
|
||||
if(TextSize > (size - 0x800))
|
||||
throw(MDFN_Error(0, "Text section recorded size is larger than data available in file. Header=0x%08x, Available=0x%08x", TextSize, size - 0x800));
|
||||
|
||||
if(TextSize < (size - 0x800))
|
||||
throw(MDFN_Error(0, "Text section recorded size is smaller than data available in file. Header=0x%08x, Available=0x%08x", TextSize, size - 0x800));*/
|
||||
throw(MDFN_Error(0, "Text section recorded size is smaller than data available in file. Header=0x%08x, Available=0x%08x", TextSize, size - 0x800));
|
||||
|
||||
if(!TextMem.size())
|
||||
{
|
||||
|
@ -2862,4 +2859,4 @@ EW_EXPORT s32 shock_PokeMemory(void* psx, u32 address, u8 value)
|
|||
CPU->PokeMem8(address, value);
|
||||
return SHOCK_OK;
|
||||
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue