MOO-cows Mailing List Archive

[Prev][Next][Index][Thread]

Re: 1.8.0 p3 error



Kai Storbeck writes:
> ;for i in (properties(#87));delete_property(#87,i);endfor
> #-1:Input to EVAL, line 4:  Property not found
> ... called from built-in function eval()
> ... called from #57:eval_cmd_string (this == #2), line 18
> ... called from #57:eval*-d (this == #2), line 10
> (End of traceback)
> ;for i in (properties(#87));delete_property(#87,i);endfor
> *** Shutting down: server panic ***

This is due to a nasty occasional memory smash in delete_property(); it comes
up only when you're deleting more than 5/8 of the properties off an object that
had more than 8 of them.  (I *said* it was occasional...)

To patch this, replace the entire function db_delete_propdef() in
db_properties.c with the version given below.

	Pavel

PS- This is release 1.8.0alpha3, not 1.8.0p3; that may come later... :-)

-------------------------------------------------------------------------------
int
db_delete_propdef(Objid oid, const char *pname)
{
    Proplist   *props = &dbpriv_find_object(oid)->propdefs;
    int		hash = str_hash(pname);
    int    	count = props->cur_length;
    int    	max   = props->max_length;
    int		i, j;
	
    for (i = 0; i < count; i++) {
	Propdef p;
	    
	p = props->l[i];
	if (p.hash == hash  &&  !mystrcasecmp(p.name, pname)) {
	    if (p.name)
		free_str(p.name);

	    if (max > 8  &&  props->cur_length <= ((max * 3) / 8)) {
		int		new_size = max / 2;
		Propdef	       *new_props;

		new_props = mymalloc(new_size * sizeof(Propdef), M_PROPDEF);
		    
		for (j = 0; j < i; j++)
		    new_props[j] = props->l[j];
		for (j = i + 1; j < count; j++)
		    new_props[j - 1] = props->l[j];

		myfree(props->l, M_PROPDEF);
		props->l = new_props;
		props->max_length = new_size;
	    } else
		for (j = i + 1; j < count; j++)
		    props->l[j - 1] = props->l[j];

	    props->cur_length--;
	    remove_prop_recursively(oid, i);

	    return 1;
	}
    }
    
    return 0;
}
-------------------------------------------------------------------------------


References:

Home | Subject Index | Thread Index