dst->vb_bool = a->vb_bool | b->vb_bool;
break;
+ case T_XOR:
+ dst->vb_bool = a->vb_bool ^ b->vb_bool;
+ break;
+
default:
return ERR_INVALID;
}
fr_value_box_memdup_shallow(dst, dst->enumv, buf, a->vb_length, a->tainted | b->tainted);
break;
+ case T_XOR:
+ if (a->vb_length != b->vb_length) goto length_error;
+
+ buf = talloc_array(ctx, uint8_t, a->vb_length);
+ if (!buf) goto oom;
+
+ for (len = 0; len < a->vb_length; len++) {
+ buf[len] = a->vb_octets[len] ^ b->vb_octets[len];
+ }
+
+ fr_value_box_memdup_shallow(dst, dst->enumv, buf, a->vb_length, a->tainted | b->tainted);
+ break;
+
case T_RSHIFT:
if (b->vb_uint32 > a->vb_length) return ERR_UNDERFLOW;
case T_OR: \
dst->vb_ ## _t = in1->vb_ ## _t | in2->vb_ ## _t; \
break; \
+ \
+ case T_XOR: \
+ dst->vb_ ## _t = in1->vb_ ## _t ^ in2->vb_ ## _t; \
+ break; \
\
case T_RSHIFT: \
if (in2->vb_uint8 > (8 * sizeof(in1->vb_ ## _t))) return ERR_UNDERFLOW; \
case T_DIV:
case T_AND:
case T_OR:
+ case T_XOR:
case T_RSHIFT:
case T_LSHIFT:
if (a->type == b->type) {
case T_DIV:
case T_AND:
case T_OR:
+ case T_XOR:
case T_RSHIFT:
case T_LSHIFT:
fr_assert(hint != FR_TYPE_NULL);
rcode = fr_value_calc_binary_op(ctx, &out, dst->type, dst, T_OR, src);
break;
+ case T_OP_XOR_EQ:
+ rcode = fr_value_calc_binary_op(ctx, &out, dst->type, dst, T_XOR, src);
+ break;
+
case T_OP_RSHIFT_EQ:
rcode = fr_value_calc_binary_op(ctx, &out, dst->type, dst, T_RSHIFT, src);
break;