Skip to content

Commit a29918a

Browse files
EmilyV99connorjclark
authored andcommitted
fix: deleting subscreens resulting in invalid/crashy data
1 parent f30fd98 commit a29918a

File tree

5 files changed

+23
-1
lines changed

5 files changed

+23
-1
lines changed

src/base/dmap.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,15 @@
11
#include "dmap.h"
2+
#include "subscr.h"
23

34
dmap *DMaps;
5+
6+
void dmap::validate_subscreens()
7+
{
8+
if(active_subscreen >= subscreens_active.size())
9+
active_subscreen = 0;
10+
if(passive_subscreen >= subscreens_passive.size())
11+
passive_subscreen = 0;
12+
if(overlay_subscreen >= subscreens_overlay.size())
13+
overlay_subscreen = 0;
14+
}
15+

src/base/dmap.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,8 @@ struct dmap
6868
{
6969
*this = dmap();
7070
}
71+
72+
void validate_subscreens();
7173
};
7274

7375
extern dmap *DMaps;

src/subscr.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3371,7 +3371,7 @@ void update_subscreens(int32_t dmap)
33713371
new_sub_indexes[sstOVERLAY] = indx;
33723372
}
33733373

3374-
if(get_qr(qr_OLD_SUBSCR) && new_subscreen_active)
3374+
if(get_qr(qr_OLD_SUBSCR) && new_subscreen_active && next_active)
33753375
{
33763376
next_active->curpage = new_subscreen_active->curpage;
33773377
next_active->cur_page().cursor_pos = new_subscreen_active->cur_page().cursor_pos;

src/zq/zq_class.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7527,6 +7527,8 @@ int32_t writedmaps(PACKFILE *f, word version, word build, word start_dmap, word
75277527

75287528
for(int32_t i=start_dmap; i<start_dmap+dmap_count; i++)
75297529
{
7530+
DMaps[i].validate_subscreens();
7531+
75307532
if(!p_putc(DMaps[i].map,f))
75317533
{
75327534
new_return(6);

src/zq/zq_subscr.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2879,14 +2879,20 @@ void delete_subscreen(size_t ind, byte ty)
28792879
case sstACTIVE:
28802880
if(DMaps[i].active_subscreen > count)
28812881
--DMaps[i].active_subscreen;
2882+
else if(DMaps[i].active_subscreen == count)
2883+
DMaps[i].active_subscreen = 0;
28822884
break;
28832885
case sstPASSIVE:
28842886
if(DMaps[i].passive_subscreen > count)
28852887
--DMaps[i].passive_subscreen;
2888+
else if(DMaps[i].passive_subscreen == count)
2889+
DMaps[i].passive_subscreen = 0;
28862890
break;
28872891
case sstOVERLAY:
28882892
if(DMaps[i].overlay_subscreen > count)
28892893
--DMaps[i].overlay_subscreen;
2894+
else if(DMaps[i].overlay_subscreen == count)
2895+
DMaps[i].overlay_subscreen = 0;
28902896
break;
28912897
}
28922898
}

0 commit comments

Comments
 (0)