int rad_checkfilename(const char *filename);
void *rad_malloc(size_t size); /* calls exit(1) on error! */
void *rad_calloc(size_t size); /* calls exit(1) on error! */
+void cfree(const void *ptr);
REQUEST *request_alloc(void);
REQUEST *request_alloc_fake(REQUEST *oldreq);
REQUEST *request_alloc_coa(REQUEST *request);
return ptr;
}
+/*
+ * Signature for free is dumb, and raises errors when we try
+ * to free const ptrs.
+ */
+void cfree(const void *ptr)
+{
+ void *tmp;
+ if (!ptr) return;
+
+ memcpy(&tmp, &ptr, sizeof(tmp));
+ free(tmp);
+}
+
/*
* Logs an error message and aborts the program
*
if (*tmpl == NULL) return;
if ((*tmpl)->name) {
- free((void *) (*tmpl)->name);
+ cfree((*tmpl)->name);
}
free(*tmpl);
{
rlm_cache_entry_t *c = data;
- free((void *) c->key);
+ cfree(c->key);
pairfree(&c->control);
pairfree(&c->request);
pairfree(&c->reply);
free(c);
}
-
/*
* Compare two entries by expiry time. There may be multiple
* entries with the same expiry time.
return ret;
}
-
/*
* A mapping of configuration file names to internal variables.
*
rlm_cache_t *inst = instance;
free(inst->key);
- free((void *) inst->xlat_name);
+ cfree(inst->xlat_name);
fr_heap_delete(inst->heap);
rbtree_free(inst->cache);
const VALUE_PAIR_MAP *map;
unsigned int total = 0;
- char *name;
+ const char *name;
for (map = expanded->maps; map != NULL; map = map->next)
{
- memcpy(&name, &(expanded->attrs[total++]), sizeof(name));
-
+ name = expanded->attrs[total++];
if (!name) return;
if (map->src->do_xlat) {
- free(name);
+ cfree(name);
}
}
}
this = (policy_named_t *) item;
rad_assert(this->name != NULL);
- free((void *) this->name);
+ rad_free(this->name);
rlm_policy_free_item(this->policy);
}
break;
policy_call_t *this;
this = (policy_call_t *) item;
- free((void *) this->name);
+ rad_free(this->name);
}
break;