Core dumped avec un char= entier dans Openssl

Résolu/Fermé
Cyrard - 22 oct. 2008 à 21:25
Cyrard Messages postés 1 Date d'inscription jeudi 23 octobre 2008 Statut Membre Dernière intervention 24 octobre 2008 - 24 oct. 2008 à 10:22
Bonjour,
Voila en travaillant sur le code source d'Openssl 0.9.8i (le dernier ) je me suis rendu compte qu'une de ses fonctions provoquait systématiquement un :
Erreur de segmentation: core dumped

M_ASN1_I2D_seq_total()


J'ai donc creusé un peu cette fonction en explicitant les fonctions qu'elle appelait:
entre autres la fonction:
 void ASN1_put_object(unsigned char **pp, int constructed, int length, int tag, int xclass) 
dans laquelle j'ai placé des balises "printf"
;-) .
<color>


void ASN1_put_object(unsigned char **pp, int constructed, int length, int tag,
	     int xclass)
	{
	unsigned char *p= *pp;
	int i, ttag;

	i=(constructed)?V_ASN1_CONSTRUCTED:0;
	i|=(xclass&V_ASN1_PRIVATE);
	if (tag < 31)
/* le problème est ici c'est *p++=un entier */
		*(p++)=i|(tag&V_ASN1_PRIMITIVE_TAG);
	else
		{
		*(p++)=i|V_ASN1_PRIMITIVE_TAG;
		for(i = 0, ttag = tag; ttag > 0; i++) ttag >>=7;
		ttag = i;
		while(i-- > 0)
			{
			p[i] = tag & 0x7f;
			if(i != (ttag - 1)) p[i] |= 0x80;
			tag >>= 7;
			}
		p += ttag;
		}
	if (constructed == 2)
		*(p++)=0x80;
	else
		asn1_put_length(&p,length);
	*pp=p;
	}


</color>

De cette manière j'ai fini par isoler le problème:
a l'exécution la sale bête qui me fait perdre mon temps est en fait une allocation d'un entier( i|V_ASN1_PRIMITIVE_TAG ) (c'est bien un entier j'ai vérifié ce bout de code marche) à l'emplacement d'un unsigned char ( *p(++) ).

pour en avoir le cœur net j'ai donc réalisé le programme suivant:
#include <stdio.h>
#include <string.h>

int main(void)
{
unsigned char *d;
*d=14;
return 1;
}




et là ça compile mais à l'exécution ça me renvoie bien un
Erreur de segmentation (core dumped)


Que pensez vous de cela? Est-ce un bug ou bien me manque-t-il une librairie?
Tout simplement peut être y a t il une autre manière de l'écrire?

Merci

7 réponses

dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
23 oct. 2008 à 10:07
hello
c'est normal,* d est un pointeur qui ne pointe sur rien, donc *d=14; est illégal

char a;
char *d=&a;
*d=14;

*d pointe sur a qui est un char
1
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
23 oct. 2008 à 12:35
Bon, en fait, l'assignation à la déclaration est différente de l'assignation :
char a='0';
char *d=&a;
mais :
d=&a;
De même : char * d="essai";d="autre string";
"abc" est une constante de type 'const char *' où tu peux faire pointé d.
Dans ces cas là, l'erreur viens souvent du fait que tu déborde du tableau. vérifie par un accès (printf(*p)) que tu est bien dans un domaine mémoire autorisé.
1
Cyrard Messages postés 1 Date d'inscription jeudi 23 octobre 2008 Statut Membre Dernière intervention 24 octobre 2008 1
24 oct. 2008 à 10:22
Ok merci a tous .
Ca marche maintenant.
En effet le probleme venait du fait que le pointeur n'était pas mallocé. (il pointait sur une string assez grande)

Merci encore pour vos explications!
1
Personne n'a d'idée?
Je me suis mal exprimé je pense.
En fait je me demande si ce n'est pas un bug carrément dans openssl.
Mais que pensez vous seulement de ce genre de chose:
Un unsigned char: *d = un entier ça provoque un core dumped. Mais si j'écris un unsigned char a = un entier (sans l'étoile) ,là ça marche! Pourtant ça devrait être la même chose? Non?
#include <stdio.h>
#include <string.h>

int main(void)
{
unsigned char *d;
*d=14;
return 1;
}


0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Oulah je ne suis pas sûr de bien comprendre:
*d est un pointeur?
Moi je pensais que : d est un pointeur sur un char
*d est un char
ton code fonctionne en effet mais par rapport au code openssl (je n'ai remis que le début) comment pourrait on le modifier pour qu'il marche normalement? Je ne le comprend pas en integralite...
void ASN1_put_object(unsigned char **pp, int constructed, int length, int tag,
	     int xclass)
	{
	unsigned char *p= *pp;
	int i, ttag;

	i=(constructed)?V_ASN1_CONSTRUCTED:0;
	i|=(xclass&V_ASN1_PRIVATE);
	if (tag < 31)
		*(p++)=i|(tag&V_ASN1_PRIMITIVE_TAG);
0
Tu es sur que cest pas plutot : d=&a ?
Car d est le pointeur est *d est la variable pointee cad un char ici.
0
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
23 oct. 2008 à 12:05
non, char d=&a est faux , il faut définir d comme un pointeur *d.
0
Oups autant pour moi, j'annule mon message précèdent. Ça revient au meme.Mais bon au final tu initialise ton pointeur sur l'adresse de a qui est un char. Mais que se passe t il quand tu lui attribue la valeur 14?
*d=14; ça revient a faire: a=14; non?
Donc dans ce cas dans ma fonction ils ont essayer de mettre un caractere = un entier>9...
Quand j'essaie d'afficher a ça n'affiche rien...
#include <stdio.h>
#include <string.h>

int main(void)
{
unsigned char a;
unsigned char *d; d=&a;
*d=14;
if(*d==a)
printf("%s\n","*d==a");

printf("%c\n",a);

printf("%x\n",d);
return 1;

}
0