#include <fcntl.h>
+static fr_internal_encode_ctx_t encode_ctx = { .allow_name_only = true };
+
extern fr_app_t proto_ldap_sync;
static int transport_parse(TALLOC_CTX *ctx, void *out, UNUSED void *parent, CONF_ITEM *ci, conf_parser_t const *rule);
}
send:
- if (fr_internal_encode_list(&dbuff, &pairs, NULL) < 0) goto error;
+ if (fr_internal_encode_list(&dbuff, &pairs, &encode_ctx) < 0) goto error;
talloc_free(local);
return fr_dbuff_used(&dbuff);
#include "persistent_search.h"
#include "active_directory.h"
+static fr_internal_encode_ctx_t encode_ctx = { .allow_name_only = true };
+
extern fr_app_io_t proto_ldap_sync_ldap;
extern fr_app_io_t proto_ldap_sync_child;
if (!vp) goto error;
}
- if (fr_internal_encode_list(dbuff, &pairs, NULL) < 0) goto error;
+ if (fr_internal_encode_list(dbuff, &pairs, &encode_ctx) < 0) goto error;
talloc_free(local);
if (fr_network_listen_send_packet(thread->nr, thread->li, thread->li, fr_dbuff_buff(dbuff),
FR_DBUFF_TALLOC_THREAD_LOCAL(&dbuff, 1024, 4096);
- if (fr_internal_encode_list(dbuff, &sync_packet_ctx->pairs, NULL) < 0) return -1;
+ if (fr_internal_encode_list(dbuff, &sync_packet_ctx->pairs, &encode_ctx) < 0) return -1;
if (fr_network_listen_send_packet(thread->nr, thread->li, thread->li, fr_dbuff_buff(dbuff),
fr_dbuff_used(dbuff), fr_time(), sync_packet_ctx) < 0) return -1;
FR_DBUFF_TALLOC_THREAD_LOCAL(&dbuff, 1024, 4096);
- if (fr_internal_encode_list(dbuff, &pairs, NULL) < 0) return -1;
+ if (fr_internal_encode_list(dbuff, &pairs, &encode_ctx) < 0) return -1;
if (fr_network_listen_send_packet(thread->nr, thread->li, thread->li,
fr_dbuff_buff(dbuff), fr_dbuff_used(dbuff),
#include <freeradius-devel/util/net.h>
#include <freeradius-devel/util/proto.h>
+
+static fr_internal_encode_ctx_t default_encode_ctx = { };
+
/** We use the same header for all types
*
*/
fr_da_stack_t *da_stack, unsigned int depth,
fr_dcursor_t *cursor, void *encode_ctx)
{
- fr_dbuff_t work_dbuff = FR_DBUFF(dbuff);
- fr_dbuff_marker_t enc_field, len_field, value_field;
- fr_dbuff_t value_dbuff;
- fr_dict_attr_t const *da = da_stack->da[depth];
- fr_pair_t *vp = fr_dcursor_current(cursor);
- bool unknown = false, internal = false;
-
- ssize_t slen;
- size_t flen, vlen, mlen;
-
- uint8_t buff[sizeof(uint64_t)];
- uint8_t enc_byte = 0;
+ fr_dbuff_t work_dbuff = FR_DBUFF(dbuff);
+ fr_dbuff_marker_t enc_field, len_field, value_field;
+ fr_dbuff_t value_dbuff;
+ fr_dict_attr_t const *da = da_stack->da[depth];
+ fr_pair_t *vp = fr_dcursor_current(cursor);
+ bool unknown = false, internal = false;
+
+ ssize_t slen;
+ size_t flen, vlen, mlen;
+
+ uint8_t buff[sizeof(uint64_t)];
+ uint8_t enc_byte = 0;
+ fr_internal_encode_ctx_t *our_encode_ctx = encode_ctx;
+
+ if (!our_encode_ctx) our_encode_ctx = &default_encode_ctx;
+
+ /*
+ * Silently skip name only attributes if we're writing
+ * to a database or cache.
+ */
+ if (!our_encode_ctx->allow_name_only && vp->da->flags.name_only) return 0;
FR_PROTO_STACK_PRINT(da_stack, depth);
#define FR_INTERNAL_FLAG_UNKNOWN 0x80
#define FR_INTERNAL_FLAG_INTERNAL 0x40
+typedef struct {
+ bool allow_name_only; //!< Allow name only pairs. This should be set
+ ///< to true when encoding data that's being
+ ///< passed between threads in the same process.
+ ///< It should be set to false when encoding
+ ///< data that's stored in an external database
+ ///< or in the cache module.
+} fr_internal_encode_ctx_t;
+
/*
* $Id$
*