/* $OpenLDAP$ */
/* This work is part of OpenLDAP Software <http://www.openldap.org/>.
*
- * Copyright 1998-2005 The OpenLDAP Foundation.
+ * Copyright 1998-2007 The OpenLDAP Foundation.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
#include <ac/string.h>
#include "slap.h"
+#include "lutil.h"
int
modify_add_values(
}
if ( permissive ) {
- for ( i = 0; !BER_BVISNULL( &mod->sm_values[i] ); i++ ) /* count 'em */;
- pmod.sm_values = (BerVarray)ch_malloc( (i + 1)*sizeof( struct berval ) );
+ for ( i = 0; !BER_BVISNULL( &mod->sm_values[i] ); i++ ) {
+ /* EMPTY -- just counting 'em */;
+ }
+
+ pmod.sm_values = (BerVarray)ch_malloc(
+ (i + 1) * sizeof( struct berval ));
if ( pmod.sm_nvalues != NULL ) {
pmod.sm_nvalues = (BerVarray)ch_malloc(
- (i + 1)*sizeof( struct berval ) );
+ (i + 1) * sizeof( struct berval ));
}
}
rc = LDAP_NO_SUCH_ATTRIBUTE;
}
} else if ( a->a_desc->ad_type->sat_flags & SLAP_AT_ORDERED_VAL ) {
- /* For an ordered attribute, renumber the value indices */
+ /* For an ordered attribute, renumber the value indices */
ordered_value_sort( a, 1 );
}
a = attr_find( e->e_attrs, mod->sm_desc );
if( a == NULL ) {
- *text = textbuf;
- snprintf( textbuf, textlen,
- "modify/increment: %s: no such attribute",
- mod->sm_desc->ad_cname.bv_val );
- return LDAP_NO_SUCH_ATTRIBUTE;
+ if ( permissive ) {
+ Modification modReplace = *mod;
+
+ modReplace.sm_op = LDAP_MOD_REPLACE;
+
+ return modify_add_values(e, &modReplace, permissive, text, textbuf, textlen);
+ } else {
+ *text = textbuf;
+ snprintf( textbuf, textlen,
+ "modify/increment: %s: no such attribute",
+ mod->sm_desc->ad_cname.bv_val );
+ return LDAP_NO_SUCH_ATTRIBUTE;
+ }
}
if ( !strcmp( a->a_desc->ad_type->sat_syntax_oid, SLAPD_INTEGER_SYNTAX )) {
int i;
char str[sizeof(long)*3 + 2]; /* overly long */
- long incr = atol( mod->sm_values[0].bv_val );
+ long incr;
+
+ if ( lutil_atol( &incr, mod->sm_values[0].bv_val ) != 0 ) {
+ *text = "modify/increment: invalid syntax of increment";
+ return LDAP_INVALID_SYNTAX;
+ }
/* treat zero and errors as a no-op */
if( incr == 0 ) {
for( i = 0; !BER_BVISNULL( &a->a_nvals[i] ); i++ ) {
char *tmp;
- long value = atol( a->a_nvals[i].bv_val );
- size_t strln = snprintf( str, sizeof(str), "%ld", value+incr );
+ long value;
+ size_t strln;
+ if ( lutil_atol( &value, a->a_nvals[i].bv_val ) != 0 ) {
+ *text = "modify/increment: invalid syntax of original value";
+ return LDAP_INVALID_SYNTAX;
+ }
+ strln = snprintf( str, sizeof(str), "%ld", value+incr );
tmp = SLAP_REALLOC( a->a_nvals[i].bv_val, strln+1 );
if( tmp == NULL ) {
*text = "modify/increment: reallocation error";
- return LDAP_OTHER;;
+ return LDAP_OTHER;
}
a->a_nvals[i].bv_val = tmp;
a->a_nvals[i].bv_len = strln;