diff options
author | rubidium <rubidium@openttd.org> | 2014-05-16 17:41:55 +0000 |
---|---|---|
committer | rubidium <rubidium@openttd.org> | 2014-05-16 17:41:55 +0000 |
commit | 46792e58dd689f6db76f35fd60b9946aba0bb846 (patch) | |
tree | 923e12bc8231e92bed9a8dc3e1b745041589df14 /src/saveload/saveload.cpp | |
parent | 191fd09d32b4f070da9f229724af4b4d90c9decb (diff) | |
download | openttd-46792e58dd689f6db76f35fd60b9946aba0bb846.tar.xz |
(svn r26591) -Add: some instrumentation to catch most cases where the wrong number of bytes would be written into variables during loading (or read during saving)
Diffstat (limited to 'src/saveload/saveload.cpp')
-rw-r--r-- | src/saveload/saveload.cpp | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/src/saveload/saveload.cpp b/src/saveload/saveload.cpp index 2c57f0c8b..f3d2f6205 100644 --- a/src/saveload/saveload.cpp +++ b/src/saveload/saveload.cpp @@ -1464,9 +1464,50 @@ size_t SlCalcObjMemberLength(const void *object, const SaveLoad *sld) return 0; } +/** + * Check whether the variable size of the variable in the saveload configuration + * matches with the actual variable size. + * @param sld The saveload configuration to test. + */ +static bool IsVariableSizeRight(const SaveLoad *sld) +{ + switch (sld->cmd) { + case SL_VAR: + switch (GetVarMemType(sld->conv)) { + case SLE_VAR_BL: + return sld->size == sizeof(bool); + case SLE_VAR_I8: + case SLE_VAR_U8: + return sld->size == sizeof(int8); + case SLE_VAR_I16: + case SLE_VAR_U16: + return sld->size == sizeof(int16); + case SLE_VAR_I32: + case SLE_VAR_U32: + return sld->size == sizeof(int32); + case SLE_VAR_I64: + case SLE_VAR_U64: + return sld->size == sizeof(int64); + default: + return sld->size == sizeof(void *); + } + case SL_REF: + /* These should all be pointer sized. */ + return sld->size == sizeof(void *); + + case SL_STR: + /* These should be pointer sized, or fixed array. */ + return sld->size == sizeof(void *) || sld->size == sld->length; + + default: + return true; + } +} bool SlObjectMember(void *ptr, const SaveLoad *sld) { + assert(IsVariableSizeRight(sld)); + VarType conv = GB(sld->conv, 0, 8); switch (sld->cmd) { case SL_VAR: |