static bool_t is_transform_valid(struct transform_inst_if *transform)
{
- return transform->valid(transform->st);
+ return transform && transform->valid(transform->st);
}
static bool_t current_valid(struct site *st)
struct buffer_if *buf, \
const char **errmsg) \
{ \
+ if (!is_transform_valid(transform)) { \
+ *errmsg="transform not set up"; \
+ return 1; \
+ } \
return transform->fwdrev(transform->st,buf,errmsg); \
}
static void dispose_transform(struct transform_inst_if **transform_var)
{
- /* will become more sophisticated very shortly */
struct transform_inst_if *transform=*transform_var;
- transform->delkey(transform->st);
+ if (transform) {
+ transform->delkey(transform->st);
+ transform->destroy(transform->st);
+ }
+ *transform_var = 0;
}
#define CHECK_AVAIL(b,l) do { if ((b)->size<(l)) return False; } while(0)
static void set_new_transform(struct site *st)
{
- st->new_transform->setkey(st->new_transform->st,st->sharedsecret,
- st->sharedsecretlen,st->setup_priority);
+ struct transform_if *generator=st->transform;
+ struct transform_inst_if *generated=generator->create(generator->st);
+ generated->setkey(generated->st,st->sharedsecret,
+ st->sharedsecretlen,st->setup_priority);
+ dispose_transform(&st->new_transform);
+ st->new_transform=generated;
}
struct xinfoadd {
goto skew;
buffer_copy(msg0, &st->scratch);
- problem = call_transform_reverse
- (st,st->auxiliary_key.transform->st,msg0,&auxkey_err);
+ problem = call_transform_reverse(st,st->auxiliary_key.transform,
+ msg0,&auxkey_err);
if (problem==0) {
slog(st,LOG_DROP,"processing packet which uses auxiliary key");
if (st->auxiliary_is_new) {
for (i=0; i<st->ncomms; i++)
st->comms[i]->request_notify(st->comms[i]->st, st, site_incoming);
- st->current.transform=st->transform->create(st->transform->st);
- st->auxiliary_key.transform=st->transform->create(st->transform->st);
- st->new_transform=st->transform->create(st->transform->st);
+ st->current.transform=0;
+ st->auxiliary_key.transform=0;
+ st->new_transform=0;
st->auxiliary_is_new=0;
enter_state_stop(st);