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:
Ricerca del nome utente nel file:codice: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; } }
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.codice: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; } }
*** 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![]()

Rispondi quotando
Se non è una protezione del sistema dal buffer overflow allora cos'è?
