]> git.pond.sub.org Git - empserver/commitdiff
file: Provide EF_WITH_CADEF_MAX_ENTRY_SIZE to clean up xditem()
authorMarkus Armbruster <armbru@pond.sub.org>
Mon, 27 Jan 2014 19:57:20 +0000 (20:57 +0100)
committerMarkus Armbruster <armbru@pond.sub.org>
Sun, 1 Feb 2015 15:52:59 +0000 (16:52 +0100)
xditem() needs a buffer that can hold entries of any xdumpable table.
It's been 2048 bytes and marked FIXME since day one.  Clean it up so
that if anyone ever goes crazy with entry sizes, we fail an assertion
during startup instead of overrunning the buffer during play.

Signed-off-by: Markus Armbruster <armbru@pond.sub.org>
include/file.h
src/lib/commands/xdump.c
src/lib/common/filetable.c

index 73be69bd908a3412b96fb016845cd8e0d4c49c8c..ac6f39e5b67792c3964180271d80e447e110b1bc 100644 (file)
@@ -27,7 +27,7 @@
  *  file.h: Describes Empire tables (`files' for historical reasons)
  *
  *  Known contributors to this file:
- *     Markus Armbruster, 2005-2012
+ *     Markus Armbruster, 2005-2014
  */
 
 #ifndef FILE_H
@@ -130,6 +130,12 @@ struct emptypedstr {
 /* Create table file, clobbering any existing file */
 #define EFF_CREATE     bit(16)
 
+/*
+ * A value larger than any struct empfile member size where member
+ * cadef is not null.
+ */
+#define EF_WITH_CADEF_MAX_ENTRY_SIZE 1024
+
 /*
  * Empire `file types'
  * These are really table IDs.  Some tables are backed by files, some
index 3b245b66773979915865e24a3dc0259d3b47aec0..e7b6853b6a8c5f35d45fcdd52500456ba389d008 100644 (file)
@@ -27,7 +27,7 @@
  *  xdump.c: Extended dump
  *
  *  Known contributors to this file:
- *     Markus Armbruster, 2004-2011
+ *     Markus Armbruster, 2004-2014
  */
 
 #include <config.h>
@@ -140,7 +140,7 @@ xditem(struct xdstr *xd, int type, char *arg)
     struct castr *ca;
     struct nstr_item ni;
     int n;
-    char buf[2048];            /* FIXME buffer size? */
+    unsigned char buf[EF_WITH_CADEF_MAX_ENTRY_SIZE];
 
     ca = ef_cadef(type);
     if (!ca)
index 36f687ff2f1f5bd2f5c95367e595669dd079444e..69b4b7c2df0e31f5849e4fdc7967ba5aed80c4c6 100644 (file)
  *  filetable.c: Empire game data file descriptions.
  *
  *  Known contributors to this file:
- *     Markus Armbruster, 2005-2013
+ *     Markus Armbruster, 2005-2014
  */
 
 #include <config.h>
 
+#include <assert.h>
 #include <stddef.h>
 #include "commodity.h"
 #include "file.h"
@@ -394,6 +395,11 @@ empfile_init(void)
 void
 empfile_fixup(void)
 {
+    struct empfile *ep;
+
     empfile[EF_SECTOR].nent = WORLD_SZ();
     empfile[EF_MAP].size = empfile[EF_BMAP].size = WORLD_SZ();
+
+    for (ep = empfile; ep->uid >= 0; ep++)
+       assert(!ep->cadef || ep->size <= EF_WITH_CADEF_MAX_ENTRY_SIZE);
 }