]> git.sur5r.net Git - openldap/commitdiff
Initial fix for berbuf alignment bug (ITS#2760)
authorKurt Zeilenga <kurt@openldap.org>
Sun, 12 Oct 2003 04:45:09 +0000 (04:45 +0000)
committerKurt Zeilenga <kurt@openldap.org>
Sun, 12 Oct 2003 04:45:09 +0000 (04:45 +0000)
Needs to be applied to other stack allocated berbufs.

include/lber.h
servers/slapd/passwd.c
servers/slapd/result.c
servers/slapd/str2filter.c

index 77a32fa8915bd3893a4a85d4550089016cdf4e3b..3b351c5818d64270f4352a74f0197fa9b6b9657f 100644 (file)
@@ -158,6 +158,17 @@ extern char ber_pvt_opt_on;
 #define LBER_OPT_ERROR         (-1)
 
 #define LBER_ELEMENT_SIZEOF (256) /* must be >= sizeof(BerElement) */
+typedef union ber_buffer_u {
+       char charbuf[LBER_ELEMENT_SIZEOF];
+
+       /* force alignment */
+       int intbuf;
+       long longbuf;
+       float floatbuf;
+       double doublebuf;
+       char* ptrbuf;
+} BerElementBuffer;
+
 typedef struct berelement BerElement;
 typedef struct sockbuf Sockbuf;
 typedef struct seqorset Seqorset;
index 80241ecd14134717ec0e5ef6697920b92c65619a..b1c7864fd2367e986742e2a5ff924c9afc537ff3 100644 (file)
@@ -83,8 +83,8 @@ int slap_passwd_parse( struct berval *reqdata,
        int rc = LDAP_SUCCESS;
        ber_tag_t tag;
        ber_len_t len;
-       char berbuf[LBER_ELEMENT_SIZEOF];
-       BerElement *ber = (BerElement *)berbuf;
+       BerElementBuffer berbuf;
+       BerElement *ber = (BerElement *)&berbuf;
 
        if( reqdata == NULL ) {
                return LDAP_SUCCESS;
@@ -224,9 +224,9 @@ struct berval * slap_passwd_return(
 {
        int rc;
        struct berval *bv = NULL;
-       char berbuf[LBER_ELEMENT_SIZEOF];
+       BerElementBuffer berbuf;
        /* opaque structure, size unknown but smaller than berbuf */
-       BerElement *ber = (BerElement *)berbuf;
+       BerElement *ber = (BerElement *)&berbuf;
 
        assert( cred != NULL );
 
index 08ddfda50f913cacdc873e450f6a35f8f99784e0..3beff2f438b98456e69d391222fa9f33bcce505b 100644 (file)
@@ -223,8 +223,8 @@ send_ldap_response(
        Operation *op,
        SlapReply *rs )
 {
-       char berbuf[LBER_ELEMENT_SIZEOF];
-       BerElement      *ber = (BerElement *)berbuf;
+       BerElementBuffer berbuf;
+       BerElement      *ber = (BerElement *) &berbuf;
        int             rc;
        long    bytes;
 
@@ -602,8 +602,8 @@ slap_send_ldap_intermediate( Operation *op, SlapReply *rs )
 int
 slap_send_search_entry( Operation *op, SlapReply *rs )
 {
-       char berbuf[LBER_ELEMENT_SIZEOF];
-       BerElement      *ber = (BerElement *)berbuf;
+       BerElementBuffer berbuf;
+       BerElement      *ber = (BerElement *) &berbuf;
        Attribute       *a, *aa;
        int             i, j, rc=-1, bytes;
        char            *edn;
@@ -1193,8 +1193,8 @@ error_return:;
 int
 slap_send_search_reference( Operation *op, SlapReply *rs )
 {
-       char berbuf[LBER_ELEMENT_SIZEOF];
-       BerElement      *ber = (BerElement *)berbuf;
+       BerElementBuffer berbuf;
+       BerElement      *ber = (BerElement *) &berbuf;
        int rc = 0;
        int bytes;
        void *mark;
@@ -1437,8 +1437,8 @@ int slap_read_controls(
 {
        int rc;
        struct berval bv;
-       char berbuf[LBER_ELEMENT_SIZEOF];
-       BerElement *ber = (BerElement *) berbuf;
+       BerElementBuffer berbuf;
+       BerElement *ber = (BerElement *) &berbuf;
        LDAPControl c;
        ber_len_t       siz, len;
        Operation myop;
index 310c3a56c90db9d92fbccaaea558c5118d3c6c21..0fc29bc22a6c732fbcb899536019a44b0dffe309 100644 (file)
@@ -28,8 +28,8 @@ str2filter_x( Operation *op, const char *str )
 {
        int rc;
        Filter  *f = NULL;
-       char berbuf[LBER_ELEMENT_SIZEOF];
-       BerElement *ber = (BerElement *)berbuf;
+       BerElementBuffer berbuf;
+       BerElement *ber = (BerElement *)&berbuf;
        const char *text = NULL;
 
 #ifdef NEW_LOGGING