On Jun 3, 10:43 pm, Andrea <aciru...@gmail.com> wrote:
> I wrote this code:
>
> void * xmalloc (size_t size){
> register void *value = OPENSSL_malloc(size);
> if (value == 0)
> printf("virtual memory exhausted");
> return value;
>
> }
>
> int _chooseTSK(char* message,int seed){
> _hash hash,hash2;
> char *strp,*prova,*res;
> int result;
> BIGNUM *mess,*cmp,*rem,*k;
> BN_CTX *ctx;
> mess=BN_new();rem=BN_new();k=BN_new();cmp=BN_new() ;
> ctx = BN_CTX_new();
> _evp_hash(&hash,message);
> prova=xmalloc(2*strlen(hash.digest)+1);
> strcpy(prova,hex2str(hash.digest,hash.digest_size) );
> BN_hex2bn(&mess,(const char*) prova);
> BN_set_word(k,K);
> BN_mod(rem,mess,k,ctx);
> strp=xmalloc(BN_num_bytes(mess));
> strp = BN_bn2dec(mess);
> res = BN_bn2dec(rem);
> result=atoi((const char *) res);
> _evp_hash(&hash2,message);
> BN_dec2bn(&cmp,(const char*) hash2.digest);
> OPENSSL_free(strp);
> OPENSSL_free(mess);
> OPENSSL_free(rem);
> OPENSSL_free(k);
> OPENSSL_free(cmp);
> BN_CTX_end(ctx);
> return result;
>
> }
>
> int main(int argc,char** argv){
> int i,j;
> char* prova;
> char* speriamo="spero";
> prova=xmalloc(strlen(argv[1])+1+5);
> for(i=0;i<10;i++){
> printf("\n%d",_chooseTSK(argv[1],i));
> }
> printf("\n");
> for(j=0;j<1;j++){
> for(i=0;i<1000;i++){
> sprintf( prova, "%s|%d",argv[1],i);
> printf("\n%d: %d",i,_chooseTSK(prova,i));
> *prova="\0";
> }
> }
> free(prova);
> return 0;
>
> }
>
> During the execution of this program i always obtain unpredictable
> segmentation fault. After running it trough gdb debugger it tolds me
> this:
> Program received signal SIGSEGV, Segmentation fault.
> 0x08048b84 in main (argc=1, argv=0xbff8ac34) at parm_utility.c:48
> 48 prova=xmalloc(strlen(argv[1])+1+5);
>
> But i receive seg fault some time after 5 iteration sometime after 100
> iteration,
> any suggestion?
Other part of my code is listed below:
void * xmalloc2 (size_t size){
register void *value = OPENSSL_malloc(size);
if (value == 0)
printf("virtual memory exhausted");
return value;
}
int _evp_hash(_hash *hash,char *message){
const EVP_MD *md;
EVP_MD_CTX mdctx;
unsigned char *ret;
unsigned int md_len,i;
OpenSSL_add_all_digests();
md = EVP_get_digestbyname(HASH);
if(!md) {
printf("Unknown message digest %s\n",HASH);
exit(1);
}
if(!(ret=(unsigned char*) xmalloc2(EVP_MAX_MD_SIZE)))
return NULL;
EVP_DigestInit(&mdctx, md);
EVP_DigestUpdate(&mdctx, message, strlen(message));
EVP_DigestFinal(&mdctx, hash->digest , &md_len);
hash->digest_size=md_len;
hash->digest_size=md_len;
free(ret);
return 0;
}
void print_hex(unsigned char *bs, unsigned int n){
int i;
for (i=0;i<n;i++){
printf("%02x",bs[i]);
}
}
char* hex2str(unsigned char *hex,unsigned int len){
int i;
char app[3];
char *buf;
//app=malloc(sizeof(char));
buf=xmalloc2(2*len+1);
strcpy(buf,"");
for (i=0;i<len;i++){
sprintf(app,"%02x",hex[i]);
strcat(buf,app);
}
//free(app);
return buf;
}
I runned again gdb and this is the problem:
*** glibc detected *** malloc(): memory corruption (fast): 0x0804cc38
***
9: 3
Program received signal SIGABRT, Aborted.
0xffffe410 in __kernel_vsyscall ()
Program received signal SIGSEGV, Segmentation fault.
0xb7e70be4 in lh_insert () from /usr/lib/i686/cmov/libcrypto.so.0.9.8