PDA

View Full Version : [C sotto linux] segmentatio fault


huntercity
05-07-2002, 16:53
per quale maledetto motivo mi da segmentation fault in questo pezzo di 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);




mi esplode quando faccio la gethostbyname
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

ilsensine
05-07-2002, 17:45
Chi inizializza hostB?

huntercity
05-07-2002, 17:58
Originariamente inviato da ilsensine
[B]Chi inizializza hostB?

ti metto il file che faccio prima
comunque hostB veniva inizializzato
non mi torna neanche la parte con la
fork e execvp non ho capito come vanno passati
gli argomenti

grazie

ilsensine
05-07-2002, 22:12
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 ;) Non vorrei infatti che l'errore è proprio nelle righe che ti ho indicato. Controlla anche i malloc precedenti, sono forse un pò troppo "ottimisti".