Skip to content

ObjectMap's find method can get stuck in an infinite loop. #745

@dotryen

Description

@dotryen

Part of my engine uses a Map to keep track of calls for a certain function.

var list: Array<Component>;
var firstUpdates: Map<Component, Bool>;

function ME_StartCheck(): Void {
    for (comp in list) {
        if (!comp.Enabled) continue;
        if (firstUpdates[comp]) continue;
        comp.OnStart();
        firstUpdates[comp] = true;
    }
}

After enough calls the find method gets caught in an infinite loop thanks to ckey starting as zero and _MNEXT(m,c) also returning zero.

_MSTATIC _MVAL_TYPE *_MNAME(find)( t_map *m, t_key key ) {
	int c, ckey;
	unsigned int hash;

	if( !m->values ) return NULL;
	hash = _MNAME(hash)(key);
	ckey = hash % ((unsigned)m->ncells);
	c = _MINDEX(m,ckey);
	while( c >= 0 ) {
		if( _MMATCH(c) )
			return &m->values[c].value;
		c = _MNEXT(m,c);
	}
	return NULL;
}

I'm not familiar enough with HashLink to come to a conclusion on how this happens. But the objects I store in the map are never iterated over or constantly changing. The map also isn't created in C, it is only interacted with via Haxe code.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions