add: if (!correct_cache(*handle, offset, -(int)rules_size)) return 0;
context: delete_rules(unsigned int num_rules, unsigned int rules_size,	     unsigned int offset, unsigned int num_rules_offset,	     TC_HANDLE_T *handle){	unsigned int i;	if (offset + rules_size > (*handle)->entries.size) {		errno = EINVAL;		return 0;	}	/* Fix up entry points. */	for (i = 0; i < NUMHOOKS; i++) {		/* In practice, we never delete up to a hook entry,		   since the built-in chains are always first,		   so these two are never equal */		if ((*handle)->info.hook_entry[i] >= offset + rules_size)			(*handle)->info.hook_entry[i] -= rules_size;		else if ((*handle)->info.hook_entry[i] > offset) {			fprintf(stderr, "ERROR: Deleting entry %u %u %u\n",				i, (*handle)->info.hook_entry[i], offset);			abort();		}		/* Underflow points to policy (terminal) rule in                   built-in, so sequality is valid here (when deleting                   the last rule). */		if ((*handle)->info.underflow[i] >= offset + rules_size)			(*handle)->info.underflow[i] -= rules_size;		else if ((*handle)->info.underflow[i] > offset) {			fprintf(stderr, "ERROR: Deleting uflow %u %u %u\n",				i, (*handle)->info.underflow[i], offset);			abort();		}	}	/* Move the rules down. */	memmove((char *)(*handle)->entries.entrytable + offset,		(char *)(*handle)->entries.entrytable + offset + rules_size,		(*handle)->entries.size - (offset + rules_size));	/* Move the counter map down. */	memmove(&(*handle)->counter_map[num_rules_offset],		&(*handle)->counter_map[num_rules_offset + num_rules],		sizeof(struct counter_map)		* ((*handle)->new_number - (num_rules + num_rules_offset)));	/* Fix numbers */	(*handle)->new_number -= num_rules;	(*handle)->entries.size -= rules_size;	return set_verdict(offset, -(int)rules_size, handle);}