faille callvote ( crash )

Forum concernant ce jeu et les serveurs que j'héberge. (ce sous-forum remplace conseiljedi.com)
Post Reply
User avatar
yberion
Posts: 19
Joined: Wed Feb 17, 2010 6:12 pm

faille callvote ( crash )

Post by yberion » Wed Feb 17, 2010 6:17 pm

Coucou : x

J'ai actuellement un clan, âFj d'environ 60 membres et 3 serveur dont deux en japlus ( 91.121.143.172:21400 et 92.48.126.226:29070 , forum : http://jk-team.forum-actif.net/ ), j'ai trouvais il y a de cela pas mal de temps un nouveau crash avec les votes, je te montre :

Code: Select all

callvote fraglimit 20aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
J'obtiens ceci en mode console :

Code: Select all

******************** 
ERROR: Cvar_Update: src 20aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa length 319 exceeds MAX_CVAR_VALUE_STRING
*******************
Si un serveur a les vote je peux à coup sûr le crash.

Si tu pouvez fix cette faille ça serai cool.
Et si tu pouvais me donner le code corriger de la faille ( juste les lignes qu'il faut ) pour le sdk pour basejk ça serai sympa.

Merci d'avance ida : d

User avatar
Gamall
Hic sunt dracones
Posts: 4145
Joined: Fri May 26, 2006 11:09 pm
Contact:

Re: faille callvote ( crash )

Post by Gamall » Wed Feb 17, 2010 7:35 pm

Bonjour;

Note: j'ai pris ma retraite de JKA il y a longtemps (plusieurs années...). Ça ne m'empêche pas de continuer à répondre à une question de temps en temps, mais il ne faut pas compter sur moi pour publier des patches.
yberion wrote:Et si tu pouvais me donner le code corriger de la faille ( juste les lignes qu'il faut ) pour le sdk pour basejk ça serai sympa.
La vraie faille n'est pas dans le SDK, elle est dans le serveur, qui est closed-source.

Le code correspondant dans un serveur Quake 3 est:

Code: Select all

void    Cvar_Update( vmCvar_t *vmCvar ) {
    cvar_t    *cv = NULL; // bk001129
    assert(vmCvar); // bk

    if ( (unsigned)vmCvar->handle >= cvar_numIndexes ) {
        Com_Error( ERR_DROP, "Cvar_Update: handle out of range" );
    }

    cv = cvar_indexes + vmCvar->handle;

    if ( cv->modificationCount == vmCvar->modificationCount ) {
        return;
    }
    if ( !cv->string ) {
        return;        // variable might have been cleared by a cvar_restart
    }
    vmCvar->modificationCount = cv->modificationCount;
    // bk001129 - mismatches.
    if ( strlen(cv->string)+1 > MAX_CVAR_VALUE_STRING ) 
      Com_Error( ERR_DROP, "Cvar_Update: src %s length %d exceeds MAX_CVAR_VALUE_STRING",
             cv->string, 
             strlen(cv->string), 
             sizeof(vmCvar->string) );
    // bk001212 - Q_strncpyz guarantees zero padding and dest[MAX_CVAR_VALUE_STRING-1]==0 
    // bk001129 - paranoia. Never trust the destination string.
    // bk001129 - beware, sizeof(char*) is always 4 (for cv->string). 
    //            sizeof(vmCvar->string) always MAX_CVAR_VALUE_STRING
    //Q_strncpyz( vmCvar->string, cv->string, sizeof( vmCvar->string ) ); // id
    Q_strncpyz( vmCvar->string, cv->string,  MAX_CVAR_VALUE_STRING ); 

    vmCvar->value = cv->value;
    vmCvar->integer = cv->integer;
} 
Comme derrière la copie est bornée par MAX_CVAR_VALUE_STRING, ça ne devrait pas poser problème de désactiver l'instruction Com_Error(...), ou de la remplacer par un simple avertissement. Malheureusement, encore une fois on n'a pas les sources pour faire ça.

Ça ne veut pas dire que ce soit impossible à faire, mais si on veut procéder de cette manière, il faut le faire en assembleur, directement sur l'exécutable du serveur. Ce serait du ressort de Luigi. D'ailleurs il a fait des patches de ce type pour CoD il me semble.

Note: la commande callvote est ici
http://www.mt-wudan.com/jkamp/g__cmds_8c.html#a51

L'appel au serveur pour la récupération des arguments est ici:

Code: Select all

01916         trap_Argv( 1, arg1, sizeof( arg1 ) );
01917         trap_Argv( 2, arg2, sizeof( arg2 ) ); 
Pusique tu dis que désactiver le vote évite le crash, ça signifie que

Code: Select all

01892         if ( !g_allowVote.integer ) {
01893                 trap_SendServerCommand( ent-g_entities, va("print \"%s\n\"", G_GetStringEdString("MP_SVGAME", "NOVOTE")) );
01894                 return;
01895         } 
s'exécute *avant* Update. Donc hypothétiquement, on pourrait tester la longueur de l'argument avant les trapcalls. Mais en fait ça ne nous aide pas parce que les arguments sont traités dans le serveur, on peut juste les récupérer. On n'a pas accès au buffer avant le traitement par Update. A moins qu'il existe un trapcall qui renvoie le buffer tel-quel, mais je n'ai pas l'impression que ce soit le cas.

Tout ça pour dire que -- à première vue -- je ne pense pas qu'il soit possible de régler le problème par un mod (ie. jampgame), mais que ça relève d'un patch pour le serveur (jampgame, donc pas de source).

Voilà. Tu es bien sûr encouragé à demander une seconde opinion à qqn qui n'est pas en retraite. ;)
{<§ Gamall Wednesday Ida §>}
{ Mods and Programs - Mods TES-IV Oblivion }

User avatar
yberion
Posts: 19
Joined: Wed Feb 17, 2010 6:12 pm

Re: faille callvote ( crash )

Post by yberion » Wed Feb 17, 2010 8:55 pm

J'ai effectivement demandé à slider ( japlus ) et à aluigi par mp, j'attend une réponse.

Sinon je vais essayé de voir si je peux réglé le problème ( même si je ne suis pas vraiment très très bon en C ), je te tiens au courant.

User avatar
yberion
Posts: 19
Joined: Wed Feb 17, 2010 6:12 pm

Re: faille callvote ( crash )

Post by yberion » Wed Mar 10, 2010 6:26 pm

Voilà j'en ai parler à aluigi par mp et j'ai donc posté sur le forum.

http://aluigi.freeforums.org/crash-by-c ... t1301.html

Et chez slider :

http://www.japlus.net/phpBB2/viewtopic.php?p=8871

User avatar
Gamall
Hic sunt dracones
Posts: 4145
Joined: Fri May 26, 2006 11:09 pm
Contact:

Re: faille callvote ( crash )

Post by Gamall » Wed Mar 10, 2010 7:25 pm

Résumé:

Slider n'a pas donné de précisions.

Luigi est arrivé à la même conclusion que moi: désactiver l'instruction Com_Error(...).



Tu sais ce qu'il te reste à faire, je pense :ouioui
{<§ Gamall Wednesday Ida §>}
{ Mods and Programs - Mods TES-IV Oblivion }

User avatar
yberion
Posts: 19
Joined: Wed Feb 17, 2010 6:12 pm

Re: faille callvote ( crash )

Post by yberion » Wed Mar 10, 2010 9:19 pm

En fait, j'ai juste modifier un truc, dans q_shared.h chercher :

Code: Select all

#define	MAX_STRING_TOKENS	1024	// max tokens resulting from Cmd_TokenizeString
Et le remplacer simplement par :

Code: Select all

#define	MAX_STRING_TOKENS	75	// max tokens resulting from Cmd_TokenizeString
Pas besoin d'injection, après tu me dis si ça pourrais suffire.

En tous les cas, ça foncitonne très bien.

User avatar
yberion
Posts: 19
Joined: Wed Feb 17, 2010 6:12 pm

Re: faille callvote ( crash )

Post by yberion » Thu Mar 11, 2010 2:24 pm

aluigi a en fait modifier directement la taille du tableau sans passer par une constante de préprocesseur et donc :

Code: Select all

char   arg2[75];

Post Reply

Who is online

Users browsing this forum: No registered users and 118 guests