From 0cc6c0ed4ca9a8bef4befdb2a077cf632cd80cbb Mon Sep 17 00:00:00 2001
From: Alug <alufoliehorst@gmail.com>
Date: Tue, 21 Nov 2023 15:27:07 +0100
Subject: [PATCH] Fix FOFs which use transferline flag and many linedefs
 randomly crashing

linenum could go out of bounds if you use more than 4 linedefs for such setup, hence making the game unable to retrieve textures and therefore crashing the games sometimes

many thx to indev c:
---
 src/hardware/hw_main.c | 4 ++--
 src/r_segs.c           | 2 +-
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c
index 86dd7c347..6c80a8a61 100644
--- a/src/hardware/hw_main.c
+++ b/src/hardware/hw_main.c
@@ -1639,7 +1639,7 @@ void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom
 
 				if (rover->master->flags & ML_TFERLINE)
 				{
-					size_t linenum = gr_curline->linedef-gr_backsector->lines[0];
+					size_t linenum = min(gr_curline->linedef-gr_backsector->lines[0], rover->master->frontsector->linecount);
 					newline = rover->master->frontsector->lines[0] + linenum;
 					texnum = R_GetTextureNum(sides[newline->sidenum[0]].midtexture);
 				}
@@ -1798,7 +1798,7 @@ void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom
 
 				if (rover->master->flags & ML_TFERLINE)
 				{
-					size_t linenum = gr_curline->linedef-gr_backsector->lines[0];
+					size_t linenum = min(gr_curline->linedef-gr_backsector->lines[0], rover->master->frontsector->linecount);
 					newline = rover->master->frontsector->lines[0] + linenum;
 					texnum = R_GetTextureNum(sides[newline->sidenum[0]].midtexture);
 				}
diff --git a/src/r_segs.c b/src/r_segs.c
index c531be52d..5dd46ea09 100644
--- a/src/r_segs.c
+++ b/src/r_segs.c
@@ -733,7 +733,7 @@ void R_RenderThickSideRange(drawseg_t *ds, INT32 x1, INT32 x2, ffloor_t *pfloor)
 
 	if (pfloor->master->flags & ML_TFERLINE)
 	{
-		size_t linenum = curline->linedef-backsector->lines[0];
+		size_t linenum = min(curline->linedef-backsector->lines[0], pfloor->master->frontsector->linecount);
 		newline = pfloor->master->frontsector->lines[0] + linenum;
 		texnum = R_GetTextureNum(sides[newline->sidenum[0]].midtexture);
 	}
-- 
GitLab