struct ace_condition_token *result)
{
DATA_BLOB *v = NULL;
- struct ace_condition_bytes w = {0};
+ DATA_BLOB w = data_blob_null;
v = claim->values[offset].octet_value;
v->length, CONDITIONAL_ACE_MAX_LENGTH);
return false;
}
- if (v->length == 0) {
- w.bytes = NULL;
- w.length = 0;
- } else {
- w.bytes = talloc_memdup(mem_ctx, v->data, v->length);
- if (w.bytes == NULL) {
+ if (v->length != 0) {
+ w = data_blob_talloc(mem_ctx, v->data, v->length);
+ if (w.data == NULL) {
return false;
}
-
- w.length = v->length;
}
result->type = CONDITIONAL_ACE_TOKEN_OCTET_STRING;
}
*v = data_blob_talloc(mem_ctx,
- tok->data.bytes.bytes,
+ tok->data.bytes.data,
tok->data.bytes.length);
if (v->data == NULL) {
return false;
#include "lib/util/tsort.h"
#include "lib/util/debug.h"
#include "lib/util/bytearray.h"
+#include "lib/util/talloc_stack.h"
#include "util/discard.h"
/*
static ssize_t pull_bytes(TALLOC_CTX *mem_ctx,
uint8_t *data, size_t length,
- struct ace_condition_bytes *tok)
+ DATA_BLOB *tok)
{
- if (length < 4) {
+ ssize_t bytes_used;
+ enum ndr_err_code ndr_err;
+ DATA_BLOB v = data_blob_const(data, length);
+ struct ndr_pull *ndr = ndr_pull_init_blob(&v, mem_ctx);
+ if (ndr == NULL) {
return -1;
}
- tok->length = PULL_LE_U32(data, 0);
- if (tok->length > length - 4) {
+ ndr_err = ndr_pull_DATA_BLOB(ndr, NDR_SCALARS|NDR_BUFFERS, tok);
+ if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+ TALLOC_FREE(ndr);
return -1;
}
- tok->bytes = talloc_size(mem_ctx, tok->length + 1);
- if (tok->bytes == NULL) {
+ bytes_used = ndr->offset;
+ talloc_free(ndr);
+ return bytes_used;
+}
+
+static ssize_t push_bytes(uint8_t *data, size_t available,
+ const DATA_BLOB *tok)
+{
+ size_t offset;
+ enum ndr_err_code ndr_err;
+ TALLOC_CTX *frame = talloc_stackframe();
+ struct ndr_push *ndr = ndr_push_init_ctx(frame);
+ if (ndr == NULL) {
+ TALLOC_FREE(frame);
return -1;
}
- memcpy(tok->bytes, data + 4, tok->length);
- tok->bytes[tok->length] = 0;
- return tok->length + 4;
-}
+ ndr_err = ndr_push_DATA_BLOB(ndr, NDR_SCALARS|NDR_BUFFERS, *tok);
+ if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+ TALLOC_FREE(frame);
+ return -1;
+ }
-static ssize_t push_bytes(uint8_t *data, size_t length,
- const struct ace_condition_bytes *tok)
-{
- if (length < tok->length + 4) {
+ if (available < ndr->offset) {
+ TALLOC_FREE(frame);
return -1;
}
- PUSH_LE_U32(data, 0, tok->length);
- memcpy(data + 4, tok->bytes, tok->length);
- return tok->length + 4;
+ memcpy(data, ndr->data, ndr->offset);
+ offset = ndr->offset;
+ TALLOC_FREE(frame);
+ return offset;
}
-
static ssize_t pull_sid(TALLOC_CTX *mem_ctx,
uint8_t *data, size_t length,
struct ace_condition_sid *tok)
const struct ace_condition_token *rhs,
int *cmp)
{
- struct ace_condition_bytes a = lhs->data.bytes;
- struct ace_condition_bytes b = rhs->data.bytes;
- *cmp = memcmp(a.bytes, b.bytes, MIN(a.length, b.length));
- if (*cmp == 0) {
- *cmp = a.length - b.length;
- }
+ DATA_BLOB a = lhs->data.bytes;
+ DATA_BLOB b = rhs->data.bytes;
+ *cmp = data_blob_cmp(&a, &b);
return true;
}
case CONDITIONAL_ACE_TOKEN_OCTET_STRING:
utf8_len = MIN(tok->data.bytes.length, 9);
- hex_encode_buf(hex, tok->data.bytes.bytes, utf8_len);
+ hex_encode_buf(hex, tok->data.bytes.data, utf8_len);
snprintf(line, sizeof(line),
"%s %.*s (%d)\n",
{
bool ok;
char *hex = hex_encode_talloc(ctx->mem_ctx,
- tok->data.bytes.bytes,
+ tok->data.bytes.data,
tok->data.bytes.length);
ok = sddl_write(ctx, "#");
if (!ok) {
length /= 2;
- token.data.bytes.bytes = talloc_array(comp->mem_ctx, uint8_t, length);
- token.data.bytes.length = length;
+ token.data.bytes = data_blob_talloc_zero(comp->mem_ctx, length);
token.type = CONDITIONAL_ACE_TOKEN_OCTET_STRING;
for (i = 0; i < length; i++) {
pair[0] = (comp->sddl[j] == '#') ? '0' : comp->sddl[j];
pair[1] = (comp->sddl[j + 1] == '#') ? '0' : comp->sddl[j + 1];
- ok = hex_byte(pair, &token.data.bytes.bytes[i]);
+ ok = hex_byte(pair, &token.data.bytes.data[i]);
if (!ok) {
- talloc_free(token.data.bytes.bytes);
+ talloc_free(token.data.bytes.data);
comp_error(comp, "inexplicable error in octet string");
return false;
}