summaryrefslogtreecommitdiff
path: root/src/saveload/saveload.cpp
diff options
context:
space:
mode:
authorrubidium <rubidium@openttd.org>2014-05-16 17:41:55 +0000
committerrubidium <rubidium@openttd.org>2014-05-16 17:41:55 +0000
commit46792e58dd689f6db76f35fd60b9946aba0bb846 (patch)
tree923e12bc8231e92bed9a8dc3e1b745041589df14 /src/saveload/saveload.cpp
parent191fd09d32b4f070da9f229724af4b4d90c9decb (diff)
downloadopenttd-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.cpp41
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: