Mise en forme de code: pensez à utiliser les balises [ tcl ] et [ /tcl ] (sans les espaces bien sûr) autour de vos codes tcl afin d'avoir un meilleur rendu et une coloration syntaxique. x


[Résolu] Crash de l'eggdrop
#1
Bonjour,

j'ai mon eggdrop qui crash suite à une condition qui utilise mysqltcl.


Quote:[16:20:07] monitoring : Amand / * / Test / 1 / 1 / 80 / FR / Testoune
[16:20:07] * Last context: tclhash.c/734 [Tcl proc: ::checkpays::who:gestion, param: $_raw1 $_raw2 $_raw3]
[16:20:07] * Please REPORT this BUG!
[16:20:07] * Check doc/BUG-REPORT on how to do so.
[16:20:07] * Wrote DEBUG
[16:20:07] * SEGMENT VIOLATION -- CRASHING!
[16:20:07] Received close notify warning during write
Segmentation fault

Je ne sais pas d'où ça peut provenir , j'ai essayé de régler le problème en mettant à jour eggdrop sur la 1.9.1 , sans succès.

Dans l'erreur il stipule la proc ::checkpays::who:gestion je pense du fait que j'envoie depuis cette proc des variables pour la proc monitoring 




Code:
::checkpays::monitoring $nick $ip $username $sslco $webirc $reputation $codepays $realname
Ensuite ma proc du monitoring avec la condition qui pose problème :


tcl
proc ::checkpays::monitoring {nick ip username sslco webirc reputation codepays realname} {
 
    set SESSION [md5 $nick]
 
    putlog "monitoring : $nick / $ip / $username / $sslco / $webirc / $reputation / $codepays / $realname"
 
    ## CONDITION QUI POSE PROBLÈME
    if {$codepays eq ""} {
            set qverif "SELECT * FROM logsusers WHERE codepays='unk' AND nick='$nick' AND username='$username' AND ip='$ip' AND realname='[mysqlescape $realname]' AND webirc='$webirc' AND sslco='$sslco'"
            set query "INSERT INTO logsusers (codepays, nick, username, ip, realname, webirc, sslco) VALUES ('unk', '$nick', '$username', '$ip', '[mysqlescape $realname]', '$webirc', '$sslco')"
 
            ::checkpays::service:connect
            set verif [::mysql::sel $::mysqlink $qverif]
 
            if {$verif != 0} {
            ::checkpays::service:deconnect
            return 0
            }
 
            set res [::mysql::exec $::mysqlink $query]
            ::checkpays::service:deconnect
    } else {
          set qverif "SELECT * FROM logsusers WHERE codepays='$codepays' AND nick='$nick' AND username='$username' AND ip='$ip' AND realname='[mysqlescape $realname]' AND webirc='$webirc' AND sslco='$sslco'"
            set query "INSERT INTO logsusers (codepays, nick, username, ip, realname, webirc, sslco) VALUES ('$codepays', '$nick', '$username', '$ip', '[mysqlescape $realname]', '$webirc', '$sslco')"
 
            ::checkpays::service:connect
            set verif [::mysql::sel $::mysqlink $qverif]
 
            if {$verif != 0} {
            ::checkpays::service:deconnect
            return 0
            }
 
            set res [::mysql::exec $::mysqlink $query]
            ::checkpays::service:deconnect
    }
 
    # Suppression des valeurs en mémoire.
    # https://www.astro.princeton.edu/~rhl/Tcl-Tk_docs/tcl/unset.n.html
    unset ::checkpays::DB($SESSION,USERNAME)
    unset ::checkpays::DB($SESSION,IP)
    unset ::checkpays::DB($SESSION,REPUTATION)
    unset ::checkpays::DB($SESSION,SSLCO)
    unset ::checkpays::DB($SESSION,WEBIRC)
    unset ::checkpays::DB($SESSION,CODEPAYS)
 
}


Mon putlog récupère bien toutes les variables.

Quand je retire la condition, l'eggdrop ne crash plus.

Ma procédure de connection à ma base sql :


tcl
proc ::checkpays::service:connect {} {
set ::mysqlink [::mysql::connect -host $::checkpays::sql(host) -user $::checkpays::sql(login) -password $::checkpays::sql(pass) -encoding binary]
::mysql::use $::mysqlink $::checkpays::sql(db)
}
 
proc ::checkpays::service:deconnect {} {
::mysql::close $::mysqlink; unset -nocomplain ::mysqlink
}


ça provient peut être de mysqltcl ? Je ne sais pas , si quelqu'un à une idée :)
  Reply
#2
Je vois une cause possible, ou souci potentiel: tu appelles mysqlescape, n'est-ce pas plutôt ::mysql::escape ? Et tu devrais effectuer ta connexion à la base de données avant d'utiliser les fonctionnalités du package (même si sur ce package, le escape est plutôt indépendant).

Tu devrais tester en ajoutant des putlog (le mieux étant un putlog de la requête) avant chaque exécution de requête pour savoir exactement où ça plante, car là je ne vois rien de bien étrange.
irc.zeolia.net - Offrez-moi un café
Merci de ne pas demander d'aide en MP
  Reply
#3
Tu as visé dans le mille , les deux appellations fonctionnent mysqlescape et  ::mysql::escape , il fallait que j'effectue la connexion à la base de donnée avant d'utiliser la fonction , bizarrement j'avais testé sur d'autre tcl, j'avais pas besoin de crée la connexion avant d'utiliser cette fonctionnalité.

Merci, sujet resolu.
  Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)