Greetings,
I think I hit upon the perfect circumstance to bust the hash table in
GetVariable (vars.c). I believe that the hash table is not going far enough
before reseting the increment as I end up in an infinite loop. See the comments
"//" below:
Debug("GetVariable(%s,%s): using scope '%s' for variable
'%s'\n",scopeid,vlval,ptr->scope,vlval);
if (CompareVariable(vlval,ptr->hashtable[slot]) != 0)
{
/* Recover from previous hash collision */
while (true)
{
i++;
if (i >= CF_HASHTABLESIZE-1)
// I think this should be (i >= CF_HASHTABLESIZE). The testcase I have seems to
have a value in the last slot of
// the hash table, which makes the loop never end.
//
//i:4965 slot:4968
//i:4966 slot:4968
//i:4967 slot:4968
//i:4968 slot:4968
//i:1 slot:4968
//i:2 slot:4968
//...
//i:4967 slot:4968
//i:4968 slot:4968
//i:1 slot:4968
//i:2 slot:4968
//...
// rinse, lather, repeat
{
i = 0;
}
if (CompareVariable(vlval,ptr->hashtable[i]) == 0)
{
found = true;
break;
}
/* Removed autolookup in Unix environment variables -
implement as getenv() fn instead */
if (i == slot)
{
found = false;
break;
}
}
if (!found)
{
Debug("No such variable found %s.%s\n",scope,lval);
*returnv = lval;
*rtype = CF_SCALAR;
return cf_notype;
}
}
_______________________________________________
Help-cfengine mailing list
[email protected]
https://cfengine.org/mailman/listinfo/help-cfengine