[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Criticité d'un bug pour slapd ?



Bonjour et bonne année,

Tout d'abord, je tiens à m'excuser si je ne poste pas sur la bonne liste, j'ai pensé que des DD seraient plus a même de me répondre.

Sur une testing avec slapd 2.1.30-3 (annuaire de 80000 entrées environ, tester avec des bases bdb ou ldbm) : suite à un problème [1], j'ai mis en évidence par un petit script perl (ci-joint) que des requetes ldap asynchrones font planter slapd sans traces dans les logs (le nombre de requetes nécessaire peut varier de 10 à 80000). Un ami a reproduit le problème sur son serveur openldap (8000 entrées environ).

Sur un openldap 2.2.18 recompilé par mes soins (avec une base bdb et l' annuaire reimporté via slapadd), le serveur n'avait pas planté au bout de 6.5 millions de requetes asynchrones.

Etant donné que le problème semble corrigé dans une version récente d'openldap, je pensais faire un rapport de bug sur le paquet slapd plutot qu'upstream.

Je me posais la question de la criticité d'un tel bug. J'aurais tendance à penser que c'est critique : serveur qui s'arrête sans raison.

Qu'en pensez-vous ?

[1] Pour la petite histoire, j'ai des problèmes de serveur openldap qui
s'arrête sans raison sans aucune trace dans les logs (ni sans raison
apparente en mode debug). Après avoir isolé les types d'applications
interrogeant ce serveur ldap, il s'avère que c'est la complétion
automatique de Thunderbird, qui fonctionne par requetes asynchrones, qui
fait planter slapd. J'ai donc fait un script perl réalisant des requetes asynchrones pour vérifier cette théorie.

Julien COMBES
#! /usr/bin/perl

use strict;
use Net::LDAP;

if(scalar(@ARGV)!=1)
  { die( "ldapasync.pl <nom serveur ldap>\n") }

my($i, $j, $filtre, $mesg);
my $serveurldap = $ARGV[0];
my $ldap = Net::LDAP->new($serveurldap, async => 1) or die "$@";

sub construct_filter
  {
    my($i, $nb_lettres, $lettres);
    srand;
   
    $lettres="";
    $nb_lettres=int(rand 5)+1;

    for($i=0; $i<=$nb_lettres; $i++)
      {
        $lettres=$lettres.sprintf "%c", int(rand 26)+97;
      }
    return $lettres;
  }

$ldap->bind;
for($i=0; $i<1000000000; $i++)
  {
    $filtre="cn=".construct_filter()."*";
    print $i."-".$filtre."\n";
    $mesg=$ldap->search( filter => $filtre, sizelimit => 20, timelimit => 5,  attrs => ['mail'] );
    
    $ldap->abandon( $mesg );    
  }

Reply to: