X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fmods.c;h=76bb81f51ea2a70cd5081f5ca0507bbe5ec4dc71;hb=72d2ee4d19ee76e7d81d402c4056ce665f797045;hp=40945fd21fbc9c5ab5c39b752eba3c00cb243b18;hpb=ecd86725f219cc892726d84ac9e273ed25f7bae8;p=openldap diff --git a/servers/slapd/mods.c b/servers/slapd/mods.c index 40945fd21f..76bb81f51e 100644 --- a/servers/slapd/mods.c +++ b/servers/slapd/mods.c @@ -1,7 +1,7 @@ /* $OpenLDAP$ */ /* This work is part of OpenLDAP Software . * - * Copyright 1998-2005 The OpenLDAP Foundation. + * Copyright 1998-2006 The OpenLDAP Foundation. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -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;