]> git.sur5r.net Git - openldap/commitdiff
better fix to ITS#3806
authorPierangelo Masarati <ando@openldap.org>
Tue, 28 Jun 2005 22:06:24 +0000 (22:06 +0000)
committerPierangelo Masarati <ando@openldap.org>
Tue, 28 Jun 2005 22:06:24 +0000 (22:06 +0000)
servers/slapd/bconfig.c
servers/slapd/config.c
servers/slapd/config.h

index d79f0770c1eb9044fd9bdf477b816cdc3221e9a0..86b93e47aa0672d0a4a1ae06645ccd1db8a79563 100644 (file)
@@ -159,6 +159,8 @@ enum {
        CFG_SASLSECP,
        CFG_SSTR_IF_MAX,
        CFG_SSTR_IF_MIN,
+
+       CFG_LAST
 };
 
 typedef struct {
@@ -270,7 +272,7 @@ static ConfigTable config_back_cf_table[] = {
                &config_generic, "( OLcfgGlAt:13 NAME 'olcDatabase' "
                        "DESC 'The backend type for a database instance' "
                        "SUP olcBackend SINGLE-VALUE X-ORDERED 'SIBLINGS' )", NULL, NULL },
-       { "defaultSearchBase", "dn", 2, 2, 0, ARG_PRE_BI|ARG_PRE_DB|ARG_DN|ARG_MAGIC,
+       { "defaultSearchBase", "dn", 2, 2, 0, ARG_PRE_BI|ARG_PRE_DB|ARG_DN|ARG_QUOTE|ARG_MAGIC,
                &config_search_base, "( OLcfgGlAt:14 NAME 'olcDefaultSearchBase' "
                        "SYNTAX OMsDN SINGLE-VALUE )", NULL, NULL },
        { "disallows", "features", 2, 0, 8, ARG_PRE_DB|ARG_MAGIC,
@@ -415,7 +417,7 @@ static ConfigTable config_back_cf_table[] = {
 #endif
                "( OLcfgGlAt:49 NAME 'olcReverseLookup' "
                        "SYNTAX OMsBoolean SINGLE-VALUE )", NULL, NULL },
-       { "rootdn", "dn", 2, 2, 0, ARG_DB|ARG_DN|ARG_MAGIC,
+       { "rootdn", "dn", 2, 2, 0, ARG_DB|ARG_DN|ARG_QUOTE|ARG_MAGIC,
                &config_rootdn, "( OLcfgDbAt:0.8 NAME 'olcRootDN' "
                        "SYNTAX OMsDN SINGLE-VALUE )", NULL, NULL },
        { "rootDSE", "file", 2, 2, 0, ARG_MAGIC|CFG_ROOTDSE,
@@ -454,7 +456,7 @@ static ConfigTable config_back_cf_table[] = {
                        "SYNTAX OMsDirectoryString SINGLE-VALUE )", NULL, NULL },
        { "saslRegexp", NULL, 3, 3, 0, ARG_MAGIC|CFG_AZREGEXP,
                &config_generic, NULL, NULL, NULL },
-       { "schemadn", "dn", 2, 2, 0, ARG_MAY_DB|ARG_DN|ARG_MAGIC,
+       { "schemadn", "dn", 2, 2, 0, ARG_MAY_DB|ARG_DN|ARG_QUOTE|ARG_MAGIC,
                &config_schema_dn, "( OLcfgGlAt:58 NAME 'olcSchemaDN' "
                        "SYNTAX OMsDN SINGLE-VALUE )", NULL, NULL },
        { "security", "factors", 2, 0, 0, ARG_MAY_DB|ARG_MAGIC,
@@ -477,7 +479,7 @@ static ConfigTable config_back_cf_table[] = {
 #endif
                "( OLcfgGlAt:63 NAME 'olcSrvtab' "
                        "SYNTAX OMsDirectoryString SINGLE-VALUE )", NULL, NULL },
-       { "suffix",     "suffix", 2, 2, 0, ARG_DB|ARG_DN|ARG_MAGIC,
+       { "suffix",     "suffix", 2, 2, 0, ARG_DB|ARG_DN|ARG_QUOTE|ARG_MAGIC,
                &config_suffix, "( OLcfgDbAt:0.10 NAME 'olcSuffix' "
                        "SYNTAX OMsDN )", NULL, NULL },
        { "syncrepl", NULL, 0, 0, 0, ARG_DB|ARG_MAGIC,
@@ -555,7 +557,7 @@ static ConfigTable config_back_cf_table[] = {
                        "SYNTAX OMsDirectoryString SINGLE-VALUE )", NULL, NULL },
        { "ucdata-path", "path", 2, 2, 0, ARG_IGNORED,
                NULL, NULL, NULL, NULL },
-       { "updatedn", "dn", 2, 2, 0, ARG_DB|ARG_MAGIC,
+       { "updatedn", "dn", 2, 2, 0, ARG_DB|ARG_DN|ARG_QUOTE|ARG_MAGIC,
                &config_updatedn, "( OLcfgDbAt:0.12 NAME 'olcUpdateDN' "
                        "SYNTAX OMsDN SINGLE-VALUE )", NULL, NULL },
        { "updateref", "url", 2, 2, 0, ARG_DB|ARG_MAGIC,
@@ -2781,22 +2783,12 @@ check_vals( ConfigTable *ct, ConfigArgs *ca, void *ptr, int isAttr )
                        return rc;
        }
        for ( i=0; vals[i].bv_val; i++ ) {
-               int freeline = 0;
-               if ( ad && ad->ad_type->sat_syntax == slap_schema.si_syn_distinguishedName ) {
-                       ca->line = ch_malloc( vals[i].bv_len + STRLENOF( "\"\"" ) + 1 );
-                       sprintf( ca->line, "\"%s\"", vals[i].bv_val );
-                       freeline = 1;
-               } else {
-                       ca->line = vals[i].bv_val;
-                       if ( sort ) {
-                               char *idx = strchr( ca->line, '}' );
-                               if ( idx ) ca->line = idx+1;
-                       }
+               ca->line = vals[i].bv_val;
+               if ( sort ) {
+                       char *idx = strchr( ca->line, '}' );
+                       if ( idx ) ca->line = idx+1;
                }
                rc = config_parse_vals( ct, ca, i );
-               if ( freeline ) {
-                       ch_free( ca->line );
-               }
                if ( rc ) {
                        break;
                }
@@ -3148,24 +3140,13 @@ config_add_internal( CfBackInfo *cfb, Entry *e, ConfigArgs *ca, SlapReply *rs, i
                ct = config_find_table( colst, nocs, a->a_desc );
                if ( !ct ) continue;    /* user data? */
                for (i=0; a->a_vals[i].bv_val; i++) {
-                       int freeline = 0;
-
-                       if ( a->a_desc && a->a_desc->ad_type->sat_syntax == slap_schema.si_syn_distinguishedName ) {
-                               ca->line = ch_malloc( a->a_vals[i].bv_len + STRLENOF( "\"\"" ) + 1 );
-                               sprintf( ca->line, "\"%s\"", a->a_vals[i].bv_val );
-                               freeline = 1;
-                       } else {
-                               ca->line = a->a_vals[i].bv_val;
-                               if ( a->a_desc->ad_type->sat_flags & SLAP_AT_ORDERED ) {
-                                       ptr = strchr( ca->line, '}' );
-                                       if ( ptr ) ca->line = ptr+1;
-                               }
+                       ca->line = a->a_vals[i].bv_val;
+                       if ( a->a_desc->ad_type->sat_flags & SLAP_AT_ORDERED ) {
+                               ptr = strchr( ca->line, '}' );
+                               if ( ptr ) ca->line = ptr+1;
                        }
                        ca->valx = i;
                        rc = config_parse_add( ct, ca );
-                       if ( freeline ) {
-                               ch_free( ca->line );
-                       }
                        if ( rc ) {
                                rc = LDAP_OTHER;
                                goto leave;
@@ -4211,6 +4192,9 @@ config_back_initialize( BackendInfo *bi )
        bi->bi_tool_entry_get = config_tool_entry_get;
        bi->bi_tool_entry_put = config_tool_entry_put;
 
+       /* Make sure we don't exceed the bits reserved for userland */
+       assert( ( ( CFG_LAST - 1 ) & ARGS_USERLAND ) == ( CFG_LAST - 1 ) );
+
        argv[3] = NULL;
        for (i=0; OidMacros[i].name; i++ ) {
                argv[1] = OidMacros[i].name;
index b446dcc4ca7ae7705e45f9979ecb8879ecca5b9d..d650f37472a32f76ff556ebfe9290f168f746b77 100644 (file)
@@ -473,17 +473,34 @@ init_config_ocs( ConfigOCs *ocs ) {
 int
 config_parse_vals(ConfigTable *ct, ConfigArgs *c, int valx)
 {
-       int rc = 0;
+       int     rc = 0;
+       char    *saveline = NULL;
 
        snprintf( c->log, sizeof( c->log ), "%s: value #%d",
                ct->ad->ad_cname.bv_val, valx );
        c->argc = 1;
        c->argv[0] = ct->ad->ad_cname.bv_val;
+
+       if ( ( ct->arg_type & ARG_QUOTE ) && c->line[ 0 ] != '"' ) {
+               ber_len_t       len;
+
+               saveline = c->line;
+               len = strlen( c->line );
+               c->line = ch_malloc( len + STRLENOF( "\"\"" ) + 1 );
+               sprintf( c->line, "\"%s\"", saveline );
+       }
+
        if ( fp_parse_line( c ) ) {
                rc = 1;
        } else {
                rc = config_check_vals( ct, c, 1 );
        }
+
+       if ( saveline ) {
+               ch_free( c->line );
+               c->line = saveline;
+       }
+
        if ( rc )
                rc = LDAP_CONSTRAINT_VIOLATION;
 
@@ -494,12 +511,24 @@ config_parse_vals(ConfigTable *ct, ConfigArgs *c, int valx)
 int
 config_parse_add(ConfigTable *ct, ConfigArgs *c)
 {
-       int rc = 0;
+       int     rc = 0;
+       char    *saveline = NULL;
 
        snprintf( c->log, sizeof( c->log ), "%s: value #%d",
                ct->ad->ad_cname.bv_val, c->valx );
        c->argc = 1;
        c->argv[0] = ct->ad->ad_cname.bv_val;
+
+       if ( ( ct->arg_type & ARG_QUOTE ) && c->line[ 0 ] != '"' ) {
+               ber_len_t       len;
+
+               saveline = c->line;
+               len = strlen( c->line );
+                       
+               c->line = ch_malloc( len + STRLENOF( "\"\"" ) + 1 );
+               sprintf( c->line, "\"%s\"", saveline );
+       }
+
        if ( fp_parse_line( c ) ) {
                rc = 1;
        } else {
@@ -507,6 +536,11 @@ config_parse_add(ConfigTable *ct, ConfigArgs *c)
                rc = config_add_vals( ct, c );
        }
 
+       if ( saveline ) {
+               ch_free( c->line );
+               c->line = saveline;
+       }
+
        ch_free( c->tline );
        return rc;
 }
index bee94817e22d63637206403a34546d2f12013c66..5ddd7552c0962f9f72f718758179a37d63d7175c 100644 (file)
@@ -62,6 +62,7 @@ typedef enum {
 #define        ARG_NO_INSERT   0x04000000      /* no arbitrary inserting */
 #define        ARG_NO_DELETE   0x08000000      /* no runtime deletes */
 #define ARG_UNIQUE     0x10000000
+#define        ARG_QUOTE       0x20000000      /* wrap with quotes before parsing */
 #define ARG_OFFSET     0x40000000
 #define ARG_MAGIC      0x80000000