/* extract and check controlValue */
        if ( strncasecmp( &val.bv_val[ i ], "controlValue ", STRLENOF( "controlValue " ) ) == 0 )
        {
+               ber_len_t valueStart, valueLen;
+
                i += STRLENOF( "controlValue " );
                for ( ; i < val.bv_len; i++ ) {
                        if ( !ASCII_SPACE( val.bv_val[ i ] ) ) {
                        return LDAP_INVALID_SYNTAX;
                }
 
-               for ( i++; i < val.bv_len; i++ ) {
+               i++;
+               valueStart = i;
+
+               for ( ; i < val.bv_len; i++ ) {
                        if ( val.bv_val[ i ] == '"' ) {
                                break;
                        }
                        return LDAP_INVALID_SYNTAX;
                }
 
+               valueLen = i - valueStart;
+               if ( (valueLen/2)*2 != valueLen ) {
+                       return LDAP_INVALID_SYNTAX;
+               }
+
                for ( i++; i < val.bv_len; i++ ) {
                        if ( !ASCII_SPACE( val.bv_val[ i ] ) ) {
                                break;