Visualizzazione dei risultati da 1 a 5 su 5

Discussione: [C] Ricerca in un file

  1. #1

    [C] Ricerca in un file

    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:
    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;
    	}
    }
    Ricerca del nome utente nel file:
    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;	
    	}
    }
    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

  2. #2
    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...

  3. #3
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Nessun protezione del sistema (o complotto della CIA) ...

    E la sfilza di \00 è normale ...! Non ti sei convinto ancora dall'ultima discussione, vedo ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  4. #4
    Non so dove mettere mano, penso che impazzirò prima di finire questo progetto Se non è una protezione del sistema dal buffer overflow allora cos'è?

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    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 ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.