Changeset - r23314:13aead68010b
[Not reviewed]
master
0 3 0
PeterN - 6 years ago 2019-02-13 09:01:49
peter@fuzzle.org
Change: Use SlErrorCorrupt() on pool index error when loading a savegame, instead of terminating. (#7219)
3 files changed with 25 insertions and 3 deletions:
0 comments (0 inline, 0 general)
src/core/pool_func.hpp
Show inline comments
 
@@ -152,18 +152,20 @@ DEFINE_POOL_METHOD(void *)::GetNew(size_
 
 * @param size size of item
 
 * @param index index of item
 
 * @return pointer to allocated item
 
 * @note usererror() on failure! (index out of range or already used)
 
 * @note SlErrorCorruptFmt() on failure! (index out of range or already used)
 
 */
 
DEFINE_POOL_METHOD(void *)::GetNew(size_t size, size_t index)
 
{
 
	extern void NORETURN SlErrorCorruptFmt(const char *format, ...);
 

	
 
	if (index >= Tmax_size) {
 
		usererror("failed loading savegame: %s index " PRINTF_SIZE " out of range (" PRINTF_SIZE ")", this->name, index, Tmax_size);
 
		SlErrorCorruptFmt("%s index " PRINTF_SIZE " out of range (" PRINTF_SIZE ")", this->name, index, Tmax_size);
 
	}
 

	
 
	if (index >= this->size) this->ResizeFor(index);
 

	
 
	if (this->data[index] != NULL) {
 
		usererror("failed loading savegame: %s index " PRINTF_SIZE " already in use", this->name, index);
 
		SlErrorCorruptFmt("%s index " PRINTF_SIZE " already in use", this->name, index);
 
	}
 

	
 
	return this->AllocateItem(size, index);
src/saveload/saveload.cpp
Show inline comments
 
@@ -350,6 +350,25 @@ void NORETURN SlErrorCorrupt(const char 
 
	SlError(STR_GAME_SAVELOAD_ERROR_BROKEN_SAVEGAME, msg);
 
}
 

	
 
/**
 
 * Issue an SlErrorCorrupt with a format string.
 
 * @param format format string
 
 * @param ... arguments to format string
 
 * @note This function does never return as it throws an exception to
 
 *       break out of all the saveload code.
 
 */
 
void NORETURN SlErrorCorruptFmt(const char *format, ...)
 
{
 
	va_list ap;
 
	char msg[256];
 

	
 
	va_start(ap, format);
 
	vseprintf(msg, lastof(msg), format, ap);
 
	va_end(ap);
 

	
 
	SlErrorCorrupt(msg);
 
}
 

	
 

	
 
typedef void (*AsyncSaveFinishProc)();                ///< Callback for when the savegame loading is finished.
 
static AsyncSaveFinishProc _async_save_finish = NULL; ///< Callback to call when the savegame loading is finished.
src/saveload/saveload.h
Show inline comments
 
@@ -836,6 +836,7 @@ void SlObject(void *object, const SaveLo
 
bool SlObjectMember(void *object, const SaveLoad *sld);
 
void NORETURN SlError(StringID string, const char *extra_msg = NULL);
 
void NORETURN SlErrorCorrupt(const char *msg);
 
void NORETURN SlErrorCorruptFmt(const char *format, ...);
 

	
 
bool SaveloadCrashWithMissingNewGRFs();
 

	
0 comments (0 inline, 0 general)