Skip to content

Segfault on HLMDL skel_build #429

@mikota

Description

@mikota

I've been experiencing intermittent server crashes (both in listen server and dedicated) while the player is shooting. Note that it doesn't happen often, instead seemingly randomly, sometimes during the first couple of bullets shot since opening server, sometimes after 2-3 minutes of straight shooting (but only during shooting). Valgrind gave me this stack trace:

==57729== Invalid read of size 2
==57729==    at 0x403E565: HL_CalculateBones (gl_hlmdl.c:782)
==57729==    by 0x403FF4F: HL_SetupBones (gl_hlmdl.c:1127)
==57729==    by 0x4040550: HLMDL_GetBoneData_Internal (gl_hlmdl.c:1220)
==57729==    by 0x40405B1: HLMDL_GetBoneData (gl_hlmdl.c:1227)
==57729==    by 0x40795AD: Mod_GetBoneRelations (com_mesh.c:5209)
==57729==    by 0x437EDF8: PF_skel_build (pr_skelobj.c:2038)
==57729==    by 0x43ABC42: PR_ExecuteCode16 (execloop.h:934)
==57729==    by 0x43D1408: PR_ExecuteCode (pr_exec.c:1825)
==57729==    by 0x43D1714: PR_ExecuteProgram (pr_exec.c:1927)
==57729==    by 0x421B0F3: SV_RunFullQCMovement (pr_cmds.c:10526)
==57729==    by 0x42739B7: SV_RunCmd (sv_user.c:7474)
==57729==    by 0x42783AD: SV_ExecuteClientMessage (sv_user.c:8648)
==57729==  Address 0xffffffff0aa99b5a is not stack'd, malloc'd or (recently) free'd
==57729==

The offending QC code (at least, the only SSQC code that calls skel_build) is below:

	if (!ent.skeletonindex) return;
	float midbone = skel_find_bone(ent.skeletonindex, "Bip01 L Thigh");
	float retainfrac = 0.001;
	float addfrac = 1 - retainfrac;
	
	ent.frame = ent.anim_bottom.normal;
	if (ent.moveflags & MF_CROUCHED) {
		ent.frame = ent.anim_bottom.crouched;
	}
	ent.frame1time = ent.anim_bottom_time;
	skel_build(ent.skeletonindex, ent, ent.modelindex, 0,0,0,1);

	ent.frame = ent.anim_top.normal;
	if (ent.moveflags & MF_CROUCHED) {
		ent.frame = ent.anim_top.crouched;
	}
	ent.frame1time = ent.anim_top_time;
	skel_build(ent.skeletonindex, ent, ent.modelindex, retainfrac, 0, midbone);
	if (ent.flinchanim_time) {
		ent.frame = 99;
		ent.frame1time = 0;
		skel_build(ent.skeletonindex, ent, ent.modelindex, 0.5, 0, midbone);
	}
	return;

This code is called during the antilag rollback code, so that hitmodel tracelines can work correctly.
Interestingly, the client runs this same block, in other players predraw of course. But the client never crashes.

Eukara mentioned he had issues with hitmodel tracelines segfaulting as well, so maybe connected, I dont know.

The stack trace is from:

GIT Revision: git-6727-358437730 - 2026-01-27
Build config: config_fteqw.h

Build type: dedicated
 debug

But I tested and same crashes happen on a bunch of the newer github releases as well, both listen server and dedi.

Metadata

Metadata

Assignees

No one assigned

    Labels

    FTEQCCFor issues regarding the language, compiler, or its IDEGoldSrcAnything related to Half-Life 1 based engine gamesbugSomething isn't working

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions