X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fmods.c;h=918a25a4ffb59c38200858c45e8b4ffbb2031c75;hb=93d0ef91e65c6d11991b1c36faba67f212f43a34;hp=40945fd21fbc9c5ab5c39b752eba3c00cb243b18;hpb=ecd86725f219cc892726d84ac9e273ed25f7bae8;p=openldap diff --git a/servers/slapd/mods.c b/servers/slapd/mods.c index 40945fd21f..918a25a4ff 100644 --- a/servers/slapd/mods.c +++ b/servers/slapd/mods.c @@ -28,6 +28,7 @@ #include #include "slap.h" +#include "lutil.h" int modify_add_values( @@ -386,7 +387,12 @@ modify_increment_values( 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 ) { @@ -395,13 +401,18 @@ modify_increment_values( 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;