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.