/* $OpenLDAP$ */
/* This work is part of OpenLDAP Software <http://www.openldap.org/>.
*
- * Copyright 1998-2014 The OpenLDAP Foundation.
+ * Copyright 1998-2018 The OpenLDAP Foundation.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
#include "lutil_ldap.h"
#include "config.h"
+#ifdef _WIN32
+#define LUTIL_ATOULX lutil_atoullx
+#define Z "I"
+#else
+#define LUTIL_ATOULX lutil_atoulx
+#define Z "z"
+#endif
+
#define ARGS_STEP 512
/*
static int fp_getline(FILE *fp, ConfigArgs *c);
static void fp_getline_init(ConfigArgs *c);
-static char *strtok_quote(char *line, char *sep, char **quote_ptr);
+static char *strtok_quote(char *line, char *sep, char **quote_ptr, int *inquote);
static char *strtok_quote_ldif(char **line);
ConfigArgs *
if( (Conf[i].length && (!strncasecmp(c->argv[0], Conf[i].name, Conf[i].length))) ||
(!strcasecmp(c->argv[0], Conf[i].name)) ) break;
if ( !Conf[i].name ) return NULL;
+ if (( Conf[i].arg_type & ARGS_TYPES ) == ARG_BINARY ) {
+ size_t decode_len = LUTIL_BASE64_DECODE_LEN(c->linelen);
+ ch_free( c->tline );
+ c->tline = ch_malloc( decode_len+1 );
+ c->linelen = lutil_b64_pton( c->line, c->tline, decode_len );
+ if ( c->linelen < 0 )
+ {
+ ch_free( c->tline );
+ c->tline = NULL;
+ return NULL;
+ }
+ c->line = c->tline;
+ }
return Conf+i;
}
assert( c->argc == 2 );
if ( !check_only )
ber_str2bv( c->argv[1], 0, 1, &c->value_bv );
+ } else if(arg_type == ARG_BINARY) {
+ assert( c->argc == 2 );
+ if ( !check_only ) {
+ c->value_bv.bv_len = c->linelen;
+ c->value_bv.bv_val = ch_malloc( c->linelen );
+ AC_MEMCPY( c->value_bv.bv_val, c->line, c->linelen );
+ }
} else if(arg_type == ARG_DN) {
struct berval bv;
assert( c->argc == 2 );
break;
case ARG_ULONG:
assert( c->argc == 2 );
- if ( lutil_atoulx( &ularg, c->argv[1], 0 ) != 0 ) {
+ if ( LUTIL_ATOULX( &ularg, c->argv[1], 0 ) != 0 ) {
snprintf( c->cr_msg, sizeof( c->cr_msg ),
"<%s> unable to parse \"%s\" as unsigned long",
c->argv[0], c->argv[1] );
case ARG_INT: *(int*)ptr = c->value_int; break;
case ARG_UINT: *(unsigned*)ptr = c->value_uint; break;
case ARG_LONG: *(long*)ptr = c->value_long; break;
- case ARG_ULONG: *(unsigned long*)ptr = c->value_ulong; break;
+ case ARG_ULONG: *(size_t*)ptr = c->value_ulong; break;
case ARG_BER_LEN_T: *(ber_len_t*)ptr = c->value_ber_t; break;
case ARG_STRING: {
char *cc = *(char**)ptr;
break;
}
case ARG_BERVAL:
+ case ARG_BINARY:
*(struct berval *)ptr = c->value_bv;
break;
case ARG_ATDESC:
case ARG_INT: c->value_int = *(int *)ptr; break;
case ARG_UINT: c->value_uint = *(unsigned *)ptr; break;
case ARG_LONG: c->value_long = *(long *)ptr; break;
- case ARG_ULONG: c->value_ulong = *(unsigned long *)ptr; break;
+ case ARG_ULONG: c->value_ulong = *(size_t *)ptr; break;
case ARG_BER_LEN_T: c->value_ber_t = *(ber_len_t *)ptr; break;
case ARG_STRING:
if ( *(char **)ptr )
case ARG_INT: bv.bv_len = snprintf(bv.bv_val, sizeof( c->log ), "%d", c->value_int); break;
case ARG_UINT: bv.bv_len = snprintf(bv.bv_val, sizeof( c->log ), "%u", c->value_uint); break;
case ARG_LONG: bv.bv_len = snprintf(bv.bv_val, sizeof( c->log ), "%ld", c->value_long); break;
- case ARG_ULONG: bv.bv_len = snprintf(bv.bv_val, sizeof( c->log ), "%lu", c->value_ulong); break;
+ case ARG_ULONG: bv.bv_len = snprintf(bv.bv_val, sizeof( c->log ), "%" Z "u", c->value_ulong); break;
case ARG_BER_LEN_T: bv.bv_len = snprintf(bv.bv_val, sizeof( c->log ), "%ld", c->value_ber_t); break;
case ARG_ON_OFF: bv.bv_len = snprintf(bv.bv_val, sizeof( c->log ), "%s",
c->value_int ? "TRUE" : "FALSE"); break;
fprintf( stderr, "init_config_attrs: register_at failed\n" );
return code;
}
+ if (( ct[i].arg_type & ARGS_TYPES ) == ARG_BINARY ) {
+ ldif_must_b64_encode_register( ct[i].ad->ad_cname.bv_val,
+ ct[i].ad->ad_type->sat_oid );
+ }
}
return 0;
return beg;
}
-static void
+void
config_parse_ldif( ConfigArgs *c )
{
char *next;
config_parse_vals(ConfigTable *ct, ConfigArgs *c, int valx)
{
int rc = 0;
+ int arg_type = ct->arg_type & ARGS_TYPES;
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 ] != '"' ) {
+ if ( (( ct->arg_type & ARG_QUOTE ) && c->line[ 0 ] != '"' ) ||
+ (arg_type == ARG_BERVAL || arg_type == ARG_BINARY)) {
c->argv[c->argc] = c->line;
c->argc++;
c->argv[c->argc] = NULL;
config_parse_add(ConfigTable *ct, ConfigArgs *c, int valx)
{
int rc = 0;
+ int arg_type = ct->arg_type & ARGS_TYPES;
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 ] != '"' ) {
+ if ( (( ct->arg_type & ARG_QUOTE ) && c->line[ 0 ] != '"' ) ||
+ (arg_type == ARG_BERVAL || arg_type == ARG_BINARY)) {
c->argv[c->argc] = c->line;
c->argc++;
c->argv[c->argc] = NULL;
Debug(LDAP_DEBUG_ANY,
"could not stat config file \"%s\": %s (%d)\n",
fname, strerror(errno), errno);
+ ch_free( c->argv );
ch_free( c );
return(1);
}
Debug(LDAP_DEBUG_ANY,
"regular file expected, got \"%s\"\n",
fname, 0, 0 );
+ ch_free( c->argv );
ch_free( c );
return(1);
}
Debug(LDAP_DEBUG_ANY,
"could not open config file \"%s\": %s (%d)\n",
fname, strerror(errno), errno);
+ ch_free( c->argv );
ch_free( c );
return(1);
}
s = ++next;
}
- if ( s == '\0' ) {
+ if ( *s == '\0' ) {
sk2.sk_interval = 0;
- s++;
} else {
sk2.sk_interval = strtol( s, &next, 10 );
"slap_client_connect: "
"URI=%s TLS context initialization failed (%d)\n",
sb->sb_uri.bv_val, rc, 0 );
- return rc;
+ goto done;
}
#endif
static char *
-strtok_quote( char *line, char *sep, char **quote_ptr )
+strtok_quote( char *line, char *sep, char **quote_ptr, int *iqp )
{
int inquote;
char *tmp;
break;
}
}
+ *iqp = inquote;
return( tmp );
}
"dbpasswd", /* in back-sql */
NULL
};
+ static char *const raw[] = {
+ "attributetype", "objectclass", "ditcontentrule", "ldapsyntax", NULL };
char *quote_ptr;
int i = (int)(sizeof(hide)/sizeof(hide[0])) - 1;
+ int inquote = 0;
c->tline = ch_strdup(c->line);
- token = strtok_quote(c->tline, " \t", "e_ptr);
+ c->linelen = strlen(c->line);
+ token = strtok_quote(c->tline, " \t", "e_ptr, &inquote);
if(token) for(i = 0; hide[i]; i++) if(!strcasecmp(token, hide[i])) break;
if(quote_ptr) *quote_ptr = ' ';
- Debug(LDAP_DEBUG_CONFIG, "line %d (%s%s)\n", c->lineno,
+ Debug(LDAP_DEBUG_CONFIG, "%s (%s%s)\n", c->log,
hide[i] ? hide[i] : c->line, hide[i] ? " ***" : "");
if(quote_ptr) *quote_ptr = '\0';
- for(;; token = strtok_quote(NULL, " \t", "e_ptr)) {
+ for(;; token = strtok_quote(NULL, " \t", "e_ptr, &inquote)) {
if(c->argc >= c->argv_size) {
char **tmp;
tmp = ch_realloc(c->argv, (c->argv_size + ARGS_STEP) * sizeof(*c->argv));
if(!tmp) {
- Debug(LDAP_DEBUG_ANY, "line %d: out of memory\n", c->lineno, 0, 0);
+ Debug(LDAP_DEBUG_ANY, "%s: out of memory\n", c->log, 0, 0);
return -1;
}
c->argv = tmp;
c->argv[c->argc++] = token;
}
c->argv[c->argc] = NULL;
+ if (inquote) {
+ /* these directives parse c->line independently of argv tokenizing */
+ for(i = 0; raw[i]; i++) if (!strcasecmp(c->argv[0], raw[i])) return 0;
+
+ Debug(LDAP_DEBUG_ANY, "%s: unterminated quoted string \"%s\"\n", c->log, c->argv[c->argc-1], 0);
+ return -1;
+ }
return(0);
}