struct state_entry_t *next;
int tries;
+ bool proxied;
TALLOC_CTX *ctx;
VALUE_PAIR *vps;
entry->state[8] = entry->state[2] ^ (((uint32_t) HEXIFY(RADIUSD_VERSION)) & 0xff);
entry->state[10] = entry->state[2] ^ ((((uint32_t) HEXIFY(RADIUSD_VERSION)) >> 8) & 0xff);
entry->state[12] = entry->state[2] ^ ((((uint32_t) HEXIFY(RADIUSD_VERSION)) >> 16) & 0xff);
+
+ fr_assert(!entry->proxied);
}
/*
x = fr_rand();
memcpy(entry->state + (i * 4), &x, sizeof(x));
}
+ } else {
+ /*
+ * There is a pre-existing State. It may be from
+ * another server, in which case we don't want to
+ * mangle external State
+ */
+ entry->proxied = (request->proxy && (request->proxy->dst_port != 0));
}
/*
/* Make unique for different virtual servers handling same request
*/
- if (request->server) {
+ if (request->server && !entry->proxied) {
/*
* Make unique for different virtual servers handling same request
*/
if (vp) return true;
/*
- *
+ * Create a State and add it to the packet.
*/
for (i = 0; i < sizeof(buffer) / sizeof(x); i++) {
x = fr_rand();
PTHREAD_MUTEX_UNLOCK(&state->mutex);
fr_state_cleanup(cleanup_list);
+#ifdef WITH_VERIFY_PTR
+ if (request->proxy_reply && (request->proxy_reply->dst_port != 0)) {
+ VALUE_PAIR *vp, *proxy;
+
+ vp = fr_pair_find_by_num(request->reply->vps, PW_STATE, 0, TAG_ANY);
+ fr_assert(vp != NULL);
+
+ proxy = fr_pair_find_by_num(request->proxy_reply->vps, PW_STATE, 0, TAG_ANY);
+ fr_assert(vp != NULL);
+
+ fr_assert(vp->vp_length == proxy->vp_length);
+ fr_assert(memcmp(vp->vp_octets, proxy->vp_octets, vp->vp_length) == 0);
+ }
+#endif
+
VERIFY_REQUEST(request);
return true;
}