diff options
| author | Magnus Auvinen <magnus.auvinen@gmail.com> | 2008-03-18 01:30:47 +0000 |
|---|---|---|
| committer | Magnus Auvinen <magnus.auvinen@gmail.com> | 2008-03-18 01:30:47 +0000 |
| commit | 944cd68addf377f794294391da6b291a41bc43f9 (patch) | |
| tree | 31910d336f28196e8918cce079b6fc154d2f5001 /src/engine/e_snapshot.c | |
| parent | 511720b0e4493617dfdbe87f98802e594e61d8ea (diff) | |
| download | zcatch-944cd68addf377f794294391da6b291a41bc43f9.tar.gz zcatch-944cd68addf377f794294391da6b291a41bc43f9.zip | |
loads of small fixes everywhere
Diffstat (limited to 'src/engine/e_snapshot.c')
| -rw-r--r-- | src/engine/e_snapshot.c | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/src/engine/e_snapshot.c b/src/engine/e_snapshot.c index 9dc64ae8..9d06f59d 100644 --- a/src/engine/e_snapshot.c +++ b/src/engine/e_snapshot.c @@ -313,6 +313,13 @@ int snapshot_create_delta(SNAPSHOT *from, SNAPSHOT *to, void *dstdata) return (int)((char*)data-(char*)dstdata); } +static int range_check(void *end, void *ptr, int size) +{ + if((const char *)ptr + size > (const char *)end) + return -1; + return 0; +} + int snapshot_unpack_delta(SNAPSHOT *from, SNAPSHOT *to, void *srcdata, int data_size) { SNAPBUILD builder; @@ -371,8 +378,7 @@ int snapshot_unpack_delta(SNAPSHOT *from, SNAPSHOT *to, void *srcdata, int data_ id = *data++; snapshot_current = type; - if(data+itemsize/4 > end) - return -1; + if(range_check(end, data, itemsize) || itemsize < 0) return -1; key = (type<<16)|id; @@ -380,6 +386,8 @@ int snapshot_unpack_delta(SNAPSHOT *from, SNAPSHOT *to, void *srcdata, int data_ newdata = snapbuild_get_item_data(&builder, key); if(!newdata) newdata = (int *)snapbuild_new_item(&builder, key>>16, key&0xffff, itemsize); + + if(range_check(end, newdata, itemsize)) return -1; fromindex = snapshot_get_item_index(from, key); if(fromindex != -1) @@ -553,12 +561,12 @@ void *snapbuild_new_item(SNAPBUILD *sb, int type, int id, int size) { SNAPSHOT_ITEM *obj = (SNAPSHOT_ITEM *)(sb->data+sb->data_size); - if(engine_stress(0.01f)) + /*if(stress_prob(0.01f)) { size += ((rand()%5) - 2)*4; if(size < 0) size = 0; - } + }*/ mem_zero(obj, sizeof(SNAPSHOT_ITEM) + size); obj->type_and_id = (type<<16)|id; |