|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Jun 2001
Città: Pisa
Messaggi: 628
|
[C sotto linux] segmentatio fault
per quale maledetto motivo mi da segmentation fault in questo pezzo di codice ??
Codice:
# include "header.h"
void timeout(int sig);
int main (int argc, char* argv[])
{
char *hostA;
char *hostB;
char *dir1;
char *dir2;
int i,j,len;
char *tmp;
BOOL ondemand = FALSE;
int sec = 10;
int server_socket,connect_socket;
unsigned int client_addr_len;
int retcode;
struct sockaddr_in client_addr, server_addr;
char localname[MAXSTRING];
char *remote_host_name;
struct hostent *local, *remote, *myhost;
MESSAGGIO msg;
if ((argc<3) || (argc>4))
{
printf("Usa sincronizza hostA:dir1 hostB:dir2 [-ondemand]\n");
return(-1);
}
.......................
/* creazione del socket */
/*printf("SINCRONIZZA: fase di inizializzazione\n"); */
server_socket = socket(AF_INET,SOCK_STREAM,0);
if(server_socket == -1) {
perror("SINCRONIZZA: aprendo il socket");
exit(-1);
}
/* pubblicazione dell'indirizzo */
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(SERVERPORT);
if(gethostname(localname,MAXBUFFER) == -1) {
perror("SINCRONIZZA: cercando il nome dell'host");
exit(-1);
}
[color=red]
/* fino a qui ci arrivo */
remote = gethostbyname(hostB);
/* qui non ci arrivo mi da un bel segmentation fault */
[/color]
remote_host_name = (char *) malloc (strlen(remote->h_name));
sprintf(remote_host_name,"%s",remote->h_name);
local = gethostbyname(localname);
if(strcmp(local->h_name, remote_host_name)==0)
myhost = gethostbyname("127.0.0.1");
else myhost = local;
free(remote_host_name);
memcpy(&server_addr.sin_addr,myhost->h_addr,
sizeof(server_addr.sin_addr));
retcode = bind(server_socket,
(struct sockaddr *)&server_addr,
sizeof(server_addr));
if(retcode == -1) {
perror("SINCRONIZZA: pubblicando il socket");
exit(-1);
}
/* accetto solo una connessione per volta */
listen(server_socket,1);
/* sistemazione delle cose per il timeout */
signal(SIGALRM, timeout);
siginterrupt(SIGALRM,1);
/* ciclo di accettazione delle connessioni */
/* printf("SINCRONIZZA: attendo connessione\n");*/
client_addr_len = sizeof(client_addr);
alarm(sec);
connect_socket = accept(server_socket,(struct sockaddr *) & client_addr,&client_addr_len);
if ((connect_socket==-1) || errno == EINTR)
{
perror("SINCRONIZZA: Accettando la connessione o Timeout scaduto \n");
exit(-1);
}
alarm(0);
printf("SINCRONIZZA: Aspetto 'AVVIATO' da SINCD\n");
/* leggo un msg */
retcode = read(connect_socket,(char *)&msg,sizeof(msg));
if(retcode == -1)
{
perror("SINCRONIZZA: leggendo il msg di avvio da SINCD");
close(connect_socket);
exit(-1);
}
printf("SINCRONIZZA: SINCD mi ha inviato %s\n",msg.msg);
/* trattamento della terminazione della connessione */
printf("SINCRONIZZA: Fine del messaggio, chiusura della connessione\n");
close(connect_socket);
pero' con il gdb funziona a run-time mi da segmentation fault qualcuno ravvisa qualche errore?? ho provato anche ad allocare prima remote con una malloc ma il risultato non cambia, poi ho visto dal man che gethostbyname restituisce un puntatore quindi penso che la struttura la crei lui grazie |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Chi inizializza hostB?
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: Jun 2001
Città: Pisa
Messaggi: 628
|
Quote:
comunque hostB veniva inizializzato non mi torna neanche la parte con la fork e execvp non ho capito come vanno passati gli argomenti grazie |
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Senza l'header non lo posso compilare; comunque ci sono dei possibili buffer overflow. Inoltre codici di questo tipo
sprintf(remote_host_name,"%s",remote->h_name); if(strcmp(local->h_name, remote_host_name)==0) sono sbagliati, in quanto local->h_name, remore->h_name anche se è sono char * non puntano ad una stringa, ma ad un semplice elenco di byte (char è anche un intero con segno a 1 byte). Visto che "%s" o strcmp si aspettano di trovare un "fine stringa", ecco un altro bel buffer overflow. nb per il debug non usare printf, ma fprintf(stderr, ...) in quanto la printf è bufferizzata e potresti perdere dei messaggi in presenza di un segmentation fault
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 10:09.



















