Problema con malloc, sscanf e free

di il
3 risposte

Problema con malloc, sscanf e free

Salve a tutti e Buone Feste,
Vorrei esporvi un problema che non riesco a risolvere. La situazione è questa: ho una variabile puntatore a carattere allocata dinamicamente, successivamente questa variabile viene passata alla sscanf ed infine dato che non ho più necessità di questa variabile ovviamente la libero con una free. Il pezzo di codice in questione è il seguente:
char * tokenClassOfService;
	int result, tmpCustody, tmpPriority, tmpOrdinal, lifespan, classOfService, ackRequested;
	unsigned char srrFlags;
	BpCustodySwitch custodySwitch;
	BpExtendedCOS extendedCOS = { 0, 0, 0 };
	printf("AL: Before Option\n");
	/* Set option bundle */
	reportEid = al_ion_endpoint_id(spec->replyto);
	lifespan = (int) spec->expiration;
	custodySwitch = NoCustodyRequested;
	srrFlags = al_ion_bundle_srrFlags(spec->dopts);
	ackRequested = 0;
	Payload ion_payload = al_ion_bundle_payload((*payload));
	Object adu = ion_payload.content;
	Object newBundleObj;
	printf("AL: Before class of service\n");
	/* Create String for parse class of service */
	if(spec->dopts != BP_DOPTS_CUSTODY)
			tmpCustody = 0;
	else
			tmpCustody = 1;
	tmpPriority = al_ion_bundle_priority(spec->priority);
	if(tmpPriority == -1)
		return BP_EINVAL;
	tmpOrdinal = spec->priority.ordinal;
	tokenClassOfService = (char *)malloc(sizeof(int)*6);
	sprintf(tokenClassOfService,"%11u.%11u.%11u",tmpCustody,tmpPriority,tmpOrdinal);
	classOfService = bp_parse_class_of_service(tokenClassOfService,&extendedCOS,&custodySwitch,&tmpPriority);
	if(classOfService == 0)
		return BP_EINVAL;
	printf("AL: Before Send\n");
	/* Send Bundle*/
	result = bp_send(bpSap,BP_NONBLOCKING,destEid,reportEid,lifespan,classOfService,
			custodySwitch,srrFlags,ackRequested,&extendedCOS,adu,&newBundleObj);
	if(result == 0)
			return BP_ENOSPACE;
	if(result == -1)
			return BP_ESEND;
	printf("AL: Before Set Id\n");
	/* Set Id Bundle Sent*/
	Bundle bundleION;
	Sdr bpSdr = bp_get_sdr();
	sdr_begin_xn(bpSdr);
	sdr_read(bpSdr,(char*)&bundleION,(SdrAddress) newBundleObj,sizeof(Bundle));
	sdr_end_xn(bpSdr);
	char * tmpEidSource;
	printEid(&(bundleION.id.source),retrieveDictionary(&bundleION),&tmpEidSource);
	id->source = ion_al_endpoint_id(tmpEidSource);
	id->creation_ts = ion_al_timestamp(bundleION.id.creationTime);
	id->frag_offset = bundleION.id.fragmentOffset;
	id->orig_length = bundleION.totalAduLength;
	printf("AL: Before Handle \n");
	//
	handle = ion_al_handle(bpSap);
	printf("AL: Before Free\n");
	//Free resource
	free(destEid);
	free(reportEid);
	free(tokenClassOfService);
	return BP_SUCCESS;
La variabile che mi crea problemi è la tokenClassOfService, mentre la funzione bp_parse_class_of_service() usa al suo interno la sscanf.
Se provo ad eliminare free(tokenClassOfService) la seconda volta che richiamo questo pezzo di codice,ho l'errore: ./dtnperf_vION: malloc(): memory corruption: 0x08435f70 ecc..
Se inserisco la free ho l'errore: ./dtnperf_vION: free(): invalid next size (fast) ecc..
Se imposto la variabile tokenClassOfService come un array ho l'errore di segmentation fault.
Le sto provando tutte , qualcuno sa darmi anche solo un suggerimento per un altra soluzione?
Grazie mille in anticipo.

3 Risposte

  • Re: Problema con malloc, sscanf e free

    Occhio all'equivoco ... nella riga

    tokenClassOfService = (char *)malloc(sizeof(int)*6);

    tu predisponi lo spazio per 6 interi espressi in binario. Ovvero prevedi 24 byte nel tuo buffer (nel caso di un sistema a 32 bit).

    Con la seguente

    sprintf(tokenClassOfService,"%11u.%11u.%11u",tmpCustody,tmpPriority,tmpOrdinal);

    scrivi nel buffer i valori in ASCII utilizzando 36 caratteri.

    Ovvio quindi che corromperai la memoria.
  • Re: Problema con malloc, sscanf e free

    Un'errore stupido a cui non avevo fatto caso. Grazie mille
  • Re: Problema con malloc, sscanf e free

    Di nulla ... anche se ancora non capisco come tu l'abbia potuto fare ... quei 6 interi non li capisco ...
Devi accedere o registrarti per scrivere nel forum
3 risposte