PDA

Visualizza la versione completa : [C] Ricerca in un file


Javino89
30-05-2012, 17:51
Salve.. di nuovo :-p Devo cercare un nome di un utente in un file di testo, e in caso di successo ritornare 1, altrimenti -1. Il nome di ogni utente è salvato in una struct (oltre alla sua password e al suo permesso).

Allego il codice e l'errore che ho in output:

Aggiunta di un utente al file:


int registraUtente(Utente utente) {

//Cerco se utente è già presente, in tal caso ritorna -1
int esito = cercaNome(utente);
if(esito == 1) {
printf("\nNome utente già presente, sceglierne un'altro.\n");
return -1;
}

else {

int ds = open("login",O_WRONLY|O_APPEND);
if(ds == -1) {
return -1;
}

int w = write(ds,&utente,sizeof(utente));
if(w == -1) {
return -1;
}

close(ds);
return 1;
}
}


Ricerca del nome utente nel file:


int cercaNome(Utente utente) {

Utente temp;

memset(temp.nickname,0,sizeof(temp.nickname));
memset(temp.password,0,sizeof(temp.password));

int cont = 0;

//Apro il file login

FILE *f;
f = fopen("login","r");
if(f == NULL) {
printf("Errore apertura elenco utenti\n");
chiudiServer();
}

//Conteggio gli utenti presenti

else {
while(fscanf(f,"%s %s %d",temp.nickname,temp.password,&temp.permesso) == -1) {
if(errno != EINTR) {
printf("\nErrore fscanf\n");
chiudiServer();
}
}
while(!feof(f)) {
while(fscanf(f,"%s %s %d",temp.nickname,temp.password,&temp.permesso) == -1) {
if(errno != EINTR) {
printf("\nErrore fscanf\n");
chiudiServer();
}
}
++cont;
}

rewind(f); //Riposizionamento indice del file

//Ricerca dell'utente
int i;
for(i=0; i<cont; i++) {
while(fscanf(f,"%s %s %d",temp.nickname,temp.password,&temp.permesso) == -1) {
if(errno != EINTR) {
printf("\nErrore fscanf\n");
chiudiServer();
}
}
if(strcmp(utente.nickname,temp.nickname) == 0) { //Utente trovato
while(fclose(f) != 0) {
if(errno != EINTR) {
printf("\nErrore fclose\n");
chiudiServer();
}
}
return 1;
}
}

while(fclose(f) != 0){
if(errno != EINTR){
printf("\nErrore fclose\n");
chiudiServer();
}
}

return -1;
}
}


Errore che capita quando dal client ho inserito nickname e password e premo invio. L'errore avviene nel terminale che simula il server, quindi è sicuramente riferito a questo codice, di preciso alla seconda funzione qui riportata.

*** stack smashing detected ***: ./server terminated
======= Backtrace: =========
/lib/x86_64-linux-gnu/libc.so.6(__fortify_fail+0x37)[0x7f00f2465007]
/lib/x86_64-linux-gnu/libc.so.6(__fortify_fail+0x0)[0x7f00f2464fd0]
./server[0x4015ac]
======= Memory map: ========
00400000-00402000 r-xp 00000000 08:06 2622024 /home/loris/Scrivania/TesinaC/server
00602000-00603000 r--p 00002000 08:06 2622024 /home/loris/Scrivania/TesinaC/server
00603000-00604000 rw-p 00003000 08:06 2622024 /home/loris/Scrivania/TesinaC/server
01da7000-01dc8000 rw-p 00000000 00:00 0 [heap]
7f00f2146000-7f00f215b000 r-xp 00000000 08:06 3673778 /lib/x86_64-linux-gnu/libgcc_s.so.1
7f00f215b000-7f00f235a000 ---p 00015000 08:06 3673778 /lib/x86_64-linux-gnu/libgcc_s.so.1
7f00f235a000-7f00f235b000 r--p 00014000 08:06 3673778 /lib/x86_64-linux-gnu/libgcc_s.so.1
7f00f235b000-7f00f235c000 rw-p 00015000 08:06 3673778 /lib/x86_64-linux-gnu/libgcc_s.so.1
7f00f235c000-7f00f250f000 r-xp 00000000 08:06 3677066 /lib/x86_64-linux-gnu/libc-2.15.so
7f00f250f000-7f00f270e000 ---p 001b3000 08:06 3677066 /lib/x86_64-linux-gnu/libc-2.15.so
7f00f270e000-7f00f2712000 r--p 001b2000 08:06 3677066 /lib/x86_64-linux-gnu/libc-2.15.so
7f00f2712000-7f00f2714000 rw-p 001b6000 08:06 3677066 /lib/x86_64-linux-gnu/libc-2.15.so
7f00f2714000-7f00f2719000 rw-p 00000000 00:00 0
7f00f2719000-7f00f273b000 r-xp 00000000 08:06 3677068 /lib/x86_64-linux-gnu/ld-2.15.so
7f00f2921000-7f00f2924000 rw-p 00000000 00:00 0
7f00f2937000-7f00f293b000 rw-p 00000000 00:00 0
7f00f293b000-7f00f293c000 r--p 00022000 08:06 3677068 /lib/x86_64-linux-gnu/ld-2.15.so
7f00f293c000-7f00f293e000 rw-p 00023000 08:06 3677068 /lib/x86_64-linux-gnu/ld-2.15.so
7fff326c8000-7fff326e9000 rw-p 00000000 00:00 0 [stack]
7fff327ff000-7fff32800000 r-xp 00000000 00:00 0 [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]
Annullato (core dump creato)

O.O Grazie per l'aiuto :)

Javino89
30-05-2012, 19:08
Ragazzi credo sia una protezione del sistema operativo dal buffer overflow.. e credo sia intrinsecamente collegato alla sfilza di \00\ che mi mette nel file tra i vari dati dell'utente...

oregon
30-05-2012, 19:12
Nessun protezione del sistema (o complotto della CIA) ...

E la sfilza di \00 è normale ...! Non ti sei convinto ancora dall'ultima discussione, vedo ...

Javino89
30-05-2012, 19:21
Non so dove mettere mano, penso che impazzirò prima di finire questo progetto :messner: Se non è una protezione del sistema dal buffer overflow allora cos'è?

oregon
30-05-2012, 20:27
Capiamoci ... intendevo che non è una protezione del "sistema operativo".

E' invece un messaggio che identifica un buffer overflow che si verifica nello stack e che è messo in essere da parte del compilatore (gcc) che inserisce codice opportuno nel tuo programma per eseguire tali test.

Cerca di identificare la "zona" del codice del server in cui avviene il problema.

Fossi in te, cercherei tra le fscanf ...

Loading