]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/slap.h
Silently restrict index_intlen to 4-255.
[openldap] / servers / slapd / slap.h
index 818a36bbac5c6b51e4393abd0430472f42f855f8..abafe18bdd85d27afde73cbfb5656c4d51566d24 100644 (file)
@@ -58,8 +58,6 @@
 
 LDAP_BEGIN_DECL
 
-#define SLAP_LIGHTWEIGHT_DISPATCHER /* experimental slapd architecture */
-
 #ifdef LDAP_DEVEL
 #define LDAP_COLLECTIVE_ATTRIBUTES
 #define LDAP_COMP_MATCH
@@ -101,6 +99,13 @@ LDAP_BEGIN_DECL
 #define SERVICE_NAME  OPENLDAP_PACKAGE "-slapd"
 #define SLAPD_ANONYMOUS ""
 
+#ifdef HAVE_TCPD
+# include <tcpd.h>
+# define SLAP_STRING_UNKNOWN   STRING_UNKNOWN
+#else /* ! TCP Wrappers */
+# define SLAP_STRING_UNKNOWN   "unknown"
+#endif /* ! TCP Wrappers */
+
 /* LDAPMod.mod_op value ===> Must be kept in sync with ldap.h!
  * This is a value used internally by the backends. It is needed to allow
  * adding values that already exist without getting an error as required by
@@ -549,7 +554,8 @@ struct MatchingRule {
  */
 #define SLAP_MR_VALUE_OF_ASSERTION_SYNTAX      0x0001U
 #define SLAP_MR_VALUE_OF_ATTRIBUTE_SYNTAX      0x0002U
-#define SLAP_MR_VALUE_OF_SYNTAX                        0x0003U
+#define SLAP_MR_VALUE_OF_SYNTAX                        (SLAP_MR_VALUE_OF_ASSERTION_SYNTAX|SLAP_MR_VALUE_OF_ATTRIBUTE_SYNTAX)
+#define SLAP_MR_DENORMALIZE                    (SLAP_MR_MUTATION_NORMALIZER)
 
 #define SLAP_MR_IS_VALUE_OF_ATTRIBUTE_SYNTAX( usage ) \
        ((usage) & SLAP_MR_VALUE_OF_ATTRIBUTE_SYNTAX )
@@ -561,6 +567,8 @@ struct MatchingRule {
 #else
 #define SLAP_MR_IS_VALUE_OF_SYNTAX( usage )    (1)
 #endif
+#define SLAP_MR_IS_DENORMALIZE( usage ) \
+       ((usage) & SLAP_MR_DENORMALIZE )
 
 /* either or both the asserted value or attribute value
  * may be provided in normalized form
@@ -683,10 +691,19 @@ struct AttributeType {
 
 #define SLAP_AT_MANAGEABLE             0x0800U /* no-user-mod can be by-passed */
 
+/* Note: ORDERED values have an ordering specifically set by the
+ * user, denoted by the {x} ordering prefix on the values.
+ *
+ * SORTED values are simply sorted by memcmp. SORTED values can
+ * be efficiently located by binary search. ORDERED values have no
+ * such advantage. An attribute cannot have both properties.
+ */
 #define        SLAP_AT_ORDERED_VAL             0x0001U /* values are ordered */
 #define        SLAP_AT_ORDERED_SIB             0x0002U /* siblings are ordered */
 #define        SLAP_AT_ORDERED                 0x0003U /* value has order index */
 
+#define        SLAP_AT_SORTED_VAL              0x0010U /* values should be sorted */
+
 #define        SLAP_AT_HARDCODE                0x10000U        /* hardcoded schema */
 #define        SLAP_AT_DELETED                 0x20000U
 
@@ -972,6 +989,11 @@ struct AttributeAssertion {
        ComponentFilter         *aa_cf;         /* for attribute aliasing */
 #endif
 };
+#ifdef LDAP_COMP_MATCH
+#define ATTRIBUTEASSERTION_INIT { NULL, BER_BVNULL, NULL }
+#else
+#define ATTRIBUTEASSERTION_INIT { NULL, BER_BVNULL }
+#endif
 
 struct SubstringsAssertion {
        AttributeDescription    *sa_desc;
@@ -1097,20 +1119,28 @@ struct ValuesReturnFilter {
 
 /*
  * represents an attribute (description + values)
+ * desc, vals, nvals, numvals fields must align with Modification
  */
 struct Attribute {
        AttributeDescription    *a_desc;
        BerVarray               a_vals;         /* preserved values */
        BerVarray               a_nvals;        /* normalized values */
-#ifdef LDAP_COMP_MATCH
-       ComponentData           *a_comp_data;   /* component values */
-#endif
-       Attribute               *a_next;
+       unsigned                a_numvals;      /* number of vals */
        unsigned                a_flags;
 #define SLAP_ATTR_IXADD                        0x1U
 #define SLAP_ATTR_IXDEL                        0x2U
 #define SLAP_ATTR_DONT_FREE_DATA       0x4U
 #define SLAP_ATTR_DONT_FREE_VALS       0x8U
+#define        SLAP_ATTR_SORTED_VALS           0x10U   /* values are sorted */
+
+/* These flags persist across an attr_dup() */
+#define        SLAP_ATTR_PERSISTENT_FLAGS \
+       SLAP_ATTR_SORTED_VALS
+
+       Attribute               *a_next;
+#ifdef LDAP_COMP_MATCH
+       ComponentData           *a_comp_data;   /* component values */
+#endif
 };
 
 
@@ -1157,8 +1187,13 @@ struct Entry {
 
 /*
  * A list of LDAPMods
+ * desc, values, nvalues, numvals must align with Attribute
  */
 struct Modification {
+       AttributeDescription *sm_desc;
+       BerVarray sm_values;
+       BerVarray sm_nvalues;
+       unsigned sm_numvals;
        short sm_op;
        short sm_flags;
 /* Set for internal mods, will bypass ACL checks. Only needed when
@@ -1166,11 +1201,7 @@ struct Modification {
  */
 #define        SLAP_MOD_INTERNAL       0x01
 #define        SLAP_MOD_MANAGING       0x02
-
-       AttributeDescription *sm_desc;
        struct berval sm_type;
-       BerVarray sm_values;
-       BerVarray sm_nvalues;
 };
 
 struct Modifications {
@@ -1181,17 +1212,10 @@ struct Modifications {
 #define        sml_type        sml_mod.sm_type
 #define sml_values     sml_mod.sm_values
 #define sml_nvalues    sml_mod.sm_nvalues
+#define sml_numvals    sml_mod.sm_numvals
        Modifications   *sml_next;
 };
 
-struct LDAPModList {
-       LDAPMod         ml_mod;
-       LDAPModList     *ml_next;
-#define ml_op          ml_mod.mod_op
-#define ml_type                ml_mod.mod_type
-#define ml_values      ml_mod.mod_values
-};
-
 /*
  * represents an access control list
  */
@@ -1652,7 +1676,7 @@ typedef BackendDB Backend;
 
 struct syncinfo_s;
 
-#define SLAP_SYNC_RID_SIZE     3
+#define SLAP_SYNC_RID_MAX      999
 #define SLAP_SYNC_SID_MAX      4095    /* based on liblutil/csn.c field width */
 #define SLAP_SYNCUUID_SET_SIZE 256
 
@@ -1740,6 +1764,7 @@ struct BackendDB {
 #define SLAP_DBFLAG_NOLASTMOD          0x0001U
 #define SLAP_DBFLAG_NO_SCHEMA_CHECK    0x0002U
 #define        SLAP_DBFLAG_HIDDEN              0x0004U
+#define        SLAP_DBFLAG_ONE_SUFFIX          0x0008U
 #define        SLAP_DBFLAG_GLUE_INSTANCE       0x0010U /* a glue backend */
 #define        SLAP_DBFLAG_GLUE_SUBORDINATE    0x0020U /* child of a glue hierarchy */
 #define        SLAP_DBFLAG_GLUE_LINKED         0x0040U /* child is connected to parent */
@@ -1757,6 +1782,7 @@ struct BackendDB {
 #define SLAP_NOLASTMOD(be)                     (SLAP_DBFLAGS(be) & SLAP_DBFLAG_NOLASTMOD)
 #define SLAP_LASTMOD(be)                       (!SLAP_NOLASTMOD(be))
 #define SLAP_DBHIDDEN(be)                      (SLAP_DBFLAGS(be) & SLAP_DBFLAG_HIDDEN)
+#define SLAP_DB_ONE_SUFFIX(be)         (SLAP_DBFLAGS(be) & SLAP_DBFLAG_ONE_SUFFIX)
 #define SLAP_ISOVERLAY(be)                     (SLAP_DBFLAGS(be) & SLAP_DBFLAG_OVERLAY)
 #define SLAP_ISGLOBALOVERLAY(be)               (SLAP_DBFLAGS(be) & SLAP_DBFLAG_GLOBAL_OVERLAY)
 #define SLAP_DBMONITORING(be)                  (SLAP_DBFLAGS(be) & SLAP_DBFLAG_MONITORING)
@@ -2306,8 +2332,9 @@ typedef unsigned long PagedResultsCookie;
 typedef struct PagedResultsState {
        Backend *ps_be;
        ber_int_t ps_size;
-       PagedResultsCookie ps_cookie;
        int ps_count;
+       PagedResultsCookie ps_cookie;
+       struct berval ps_cookieval;
 } PagedResultsState;
 
 struct slap_csn_entry {
@@ -2364,6 +2391,39 @@ struct slap_control_ids {
        int sc_valuesReturnFilter;
 };
 
+/*
+ * Operation indices
+ */
+typedef enum {
+       SLAP_OP_BIND = 0,
+       SLAP_OP_UNBIND,
+       SLAP_OP_SEARCH,
+       SLAP_OP_COMPARE,
+       SLAP_OP_MODIFY,
+       SLAP_OP_MODRDN,
+       SLAP_OP_ADD,
+       SLAP_OP_DELETE,
+       SLAP_OP_ABANDON,
+       SLAP_OP_EXTENDED,
+       SLAP_OP_LAST
+} slap_op_t;
+
+typedef struct slap_counters_t {
+       struct slap_counters_t  *sc_next;
+       ldap_pvt_thread_mutex_t sc_mutex;
+       ldap_pvt_mp_t           sc_bytes;
+       ldap_pvt_mp_t           sc_pdu;
+       ldap_pvt_mp_t           sc_entries;
+       ldap_pvt_mp_t           sc_refs;
+
+       ldap_pvt_mp_t           sc_ops_completed;
+       ldap_pvt_mp_t           sc_ops_initiated;
+#ifdef SLAPD_MONITOR
+       ldap_pvt_mp_t           sc_ops_completed_[SLAP_OP_LAST];
+       ldap_pvt_mp_t           sc_ops_initiated_[SLAP_OP_LAST];
+#endif /* SLAPD_MONITOR */
+} slap_counters_t;
+
 /*
  * represents an operation pending from an ldap client
  */
@@ -2381,6 +2441,8 @@ typedef struct Opheader {
        void    *oh_tmpmemctx;          /* slab malloc context */
        BerMemoryFunctions *oh_tmpmfuncs;
 
+       slap_counters_t *oh_counters;
+
        char            oh_log_prefix[ /* sizeof("conn=18446744073709551615 op=18446744073709551615") */ SLAP_TEXT_BUFLEN ];
 
 #ifdef LDAP_SLAPI
@@ -2413,6 +2475,7 @@ struct Operation {
 #define o_threadctx o_hdr->oh_threadctx
 #define o_tmpmemctx o_hdr->oh_tmpmemctx
 #define o_tmpmfuncs o_hdr->oh_tmpmfuncs
+#define o_counters o_hdr->oh_counters
 
 #define        o_tmpalloc      o_tmpmfuncs->bmf_malloc
 #define o_tmpcalloc    o_tmpmfuncs->bmf_calloc
@@ -2642,6 +2705,7 @@ struct Connection {
        int                     c_struct_state; /* structure management state */
        int                     c_conn_state;   /* connection state */
        int                     c_conn_idx;             /* slot in connections array */
+       ber_socket_t    c_sd;
        const char      *c_close_reason; /* why connection is closing */
 
        ldap_pvt_thread_mutex_t c_mutex; /* protect the connection */
@@ -2659,7 +2723,6 @@ struct Connection {
 #define c_sock_name c_listener->sl_name        /* sock name (trans=addr:port) */
 
        /* only can be changed by binding thread */
-       int             c_sasl_bind_in_progress;        /* multi-op bind in progress */
        struct berval   c_sasl_bind_mech;                       /* mech in progress */
        struct berval   c_sasl_dn;      /* temporary storage */
        struct berval   c_sasl_authz_dn;        /* SASL proxy authz */
@@ -2686,7 +2749,10 @@ struct Connection {
        ldap_pvt_thread_cond_t  c_write_cv;             /* used to wait for sd write-ready*/
 
        BerElement      *c_currentber;  /* ber we're attempting to read */
-       int             c_writewaiter;  /* true if writer is waiting */
+
+       char            c_sasl_bind_in_progress;        /* multi-op bind in progress */
+
+       char            c_writewaiter;  /* true if writer is waiting */
 
 #define        CONN_IS_TLS     1
 #define        CONN_IS_UDP     2
@@ -2694,14 +2760,14 @@ struct Connection {
 #define        CONN_IS_IPC     8
 
 #ifdef LDAP_CONNECTIONLESS
-       int     c_is_udp;               /* true if this is (C)LDAP over UDP */
+       char    c_is_udp;               /* true if this is (C)LDAP over UDP */
 #endif
 #ifdef HAVE_TLS
-       int     c_is_tls;               /* true if this LDAP over raw TLS */
-       int     c_needs_tls_accept;     /* true if SSL_accept should be called */
+       char    c_is_tls;               /* true if this LDAP over raw TLS */
+       char    c_needs_tls_accept;     /* true if SSL_accept should be called */
 #endif
-       int             c_sasl_layers;   /* true if we need to install SASL i/o handlers */
-       int     c_sasl_done;            /* SASL completed once */
+       char    c_sasl_layers;   /* true if we need to install SASL i/o handlers */
+       char    c_sasl_done;            /* SASL completed once */
        void    *c_sasl_authctx;        /* SASL authentication context */
        void    *c_sasl_sockctx;        /* SASL security layer context */
        void    *c_sasl_extra;          /* SASL session extra stuff */
@@ -2784,47 +2850,12 @@ struct slap_listener {
        int     sl_is_udp;              /* UDP listener is also data port */
 #endif
        int     sl_mute;        /* Listener is temporarily disabled due to emfile */
-#ifdef SLAP_LIGHTWEIGHT_DISPATCHER
        int     sl_busy;        /* Listener is busy (accept thread activated) */
-#endif
        ber_socket_t sl_sd;
        Sockaddr sl_sa;
 #define sl_addr        sl_sa.sa_in_addr
 };
 
-/*
- * Operation indices
- */
-typedef enum {
-       SLAP_OP_BIND = 0,
-       SLAP_OP_UNBIND,
-       SLAP_OP_SEARCH,
-       SLAP_OP_COMPARE,
-       SLAP_OP_MODIFY,
-       SLAP_OP_MODRDN,
-       SLAP_OP_ADD,
-       SLAP_OP_DELETE,
-       SLAP_OP_ABANDON,
-       SLAP_OP_EXTENDED,
-       SLAP_OP_LAST
-} slap_op_t;
-
-typedef struct slap_counters_t {
-       ldap_pvt_thread_mutex_t sc_sent_mutex;
-       ldap_pvt_mp_t           sc_bytes;
-       ldap_pvt_mp_t           sc_pdu;
-       ldap_pvt_mp_t           sc_entries;
-       ldap_pvt_mp_t           sc_refs;
-
-       ldap_pvt_thread_mutex_t sc_ops_mutex;
-       ldap_pvt_mp_t           sc_ops_completed;
-       ldap_pvt_mp_t           sc_ops_initiated;
-#ifdef SLAPD_MONITOR
-       ldap_pvt_mp_t           sc_ops_completed_[SLAP_OP_LAST];
-       ldap_pvt_mp_t           sc_ops_initiated_[SLAP_OP_LAST];
-#endif /* SLAPD_MONITOR */
-} slap_counters_t;
-
 /*
  * Better know these all around slapd
  */