Newsgroup: it.comp.lang.c
Titolo: Stack Smashing detected

Salve,
sono uno studente di ingegneria informatica e sto preparando un
progetto per un esame utilizzando la libreria pthread di C. In pratica
devo realizzare una specie di server ftp multithreading. Sono da un
bel pò fermo perché non riesco a risolvere il problema in oggetto.
Magari c'è qualcuno che è molto più allenato di me e che magari sa
darmi una mano....sono disperato...Il problema si presenta al ritorno
della funzione list_file(..)...spero che qualcuno mi sappia dire dove
sbaglio...di seguito riporto il codice del server
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <stdio.h>
#include <pthread.h>
#include "myutils.h"
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#define BUFFER_LEN 2000
#define DIM 512
#define DIM2 512
void *body(void *arg);
int get_filesize( char* filename )
{
  struct stat file_info;
  if( !stat( filename, &file_info ) )
      return file_info.st_size;
  return -1;
}
int init_sd(int myport){
	struct sockaddr_in my_addr;
	int sd;
	bzero(&my_addr, sizeof(struct sockaddr_in));
	my_addr.sin_family=AF_INET;
	my_addr.sin_port=htons(myport);
	my_addr.sin_addr.s_addr=INADDR_ANY;
	sd=socket(AF_INET, SOCK_STREAM,0);
	if(bind(sd, CAST_ADDR(&my_addr), sizeof(my_addr))<0)
		sys_err("bind failed");
	if(listen(sd,5) <0)
		sys_err("listen failed");
	printf("Server listening on port %d\n", myport);
	return sd;
}
void *list_file(void* sa){
	char *msg;
	int sd=(int)sa;
	int num,ret,len_string;
	unsigned int msg_len;
	char cmd[BUFFER_LEN]="ls ";
	char buf[BUFFER_LEN];
	char aux[BUFFER_LEN];
	char prova[BUFFER_LEN];
	char aux1[]="/home/fabio/";
	FILE* fp;
	char nome_file[]="NSS.zip";
	num=random();
	ret=read(sd,&msg_len,sizeof(msg_len));
	if (ret!=sizeof(msg_len)){
		printf("SERVER: Error while getting msg_len from the client\n");
		exit(1);
	}
	msg=malloc(sizeof(char) * (msg_len+1));
	if(msg==NULL){
		printf("SERVER: Can't get the heap\n");
		exit(1);
	}
	ret=read(sd, msg, msg_len);
	if(ret!=msg_len){
		printf("SERVER: Error while getting the msg from the client\n");
		exit(1);
	}
	msg[msg_len]=0;
	sprintf(aux,"%d",num);
	strncat(prova, " > ",strlen(prova)+3);
	strncat(prova, aux1,strlen(prova)+strlen(aux1));
	strncat(prova,aux,strlen(prova)+strlen(aux));
	strncat(cmd,msg,(strlen(cmd)+strlen(msg)));
	strncat(cmd,prova,strlen(cmd)+strlen(prova));
	free(msg);
	fp=popen(cmd,"r");
	pclose(fp);
	strncat(aux1,aux,strlen(aux)+strlen(aux1));
	fp=fopen(aux1,"r");
	if(fp==NULL){
		printf("SERVER: Error can't open the file\n");
		exit(1);
	}
	while(fgets(buf,BUFFER_LEN,fp)){
		len_string=strlen(buf);
		buf[len_string-1]=0;
		write(sd, &len_string,sizeof(len_string));
		write(sd,&buf,len_string);
	}
	char terminazione[]="Fine";
	len_string=strlen(terminazione);
	write(sd, &len_string,sizeof(len_string));
	write(sd,&terminazione,len_string);
	fclose(fp);
	remove(aux1);
	return NULL;
}
void download_from_server(int sd){
	int len_string;
	FILE *fp;
	char aux[BUFFER_LEN];
	char nome_file[]="NSS.zip";
	char path_file[]="/home/fabio/sisop/";
	unsigned len;
	strncat(aux,path_file, strlen(path_file)+strlen(aux));
	strncat(aux,nome_file,strlen(aux)+strlen(nome_file));
	fp=fopen(aux,"rb");
	if(fp==NULL){
		printf("SERVER: Error can't open the file\n");
		exit(1);
	}
	len=strlen(nome_file);
	int size=get_filesize(aux);
	char buf[size+1];
	memset(&buf,0,size);
	write(sd,&size,sizeof(int));
	write(sd,&len,sizeof(len));
	write(sd,&nome_file,len);
	while(size>0){
		fread(buf,1,DIM,fp);
		write(sd,&buf,DIM);
		size=size-DIM;
	}
	fclose(fp);
	body((void*) sd);
}
void upload_to_server(int sk_c){
	int sk=sk_c;
    	int len=0;
	FILE *fp;
    	char nome_file_remoto[BUFFER_LEN];
    	char path_file_remoto[]="/home/fabio/";
	long size_file;
	read(sk,&size_file,sizeof(int));
	read(sk,&len,sizeof(len));
	read(sk,&nome_file_remoto,len);
	char buf[size_file+1];
	memset(&buf,0,size_file);
	strncat(path_file_remoto,nome_file_remoto,strlen(path_file_remoto)
+strlen(nome_file_remoto));
	fp=fopen(path_file_remoto,"wb");
	if(fp==NULL){
		printf("CLIENT: Error can't generate the file\n");
		exit(1);
	}
	while(size_file>0){
		read(sk,&buf,DIM2);
		fwrite(buf,1,DIM2,fp);
		size_file=size_file-DIM2;
	}
	fclose(fp);
	body((void*) sk);
}
void *body(void *arg){
	pthread_t tid2;
	int aux=(int) arg;
	int sd= aux;
	int scelta;
	pthread_detach(pthread_self());
	for(;;){
	read(sd,&scelta,sizeof(int));
	switch(scelta){
		case 76:
			pthread_create(&tid2,0,list_file,(void*)sd);
			pthread_join(tid2,NULL);
			break;
		case 68:
			download_from_server(sd);
			break;
		case 77:
			upload_to_server(sd);
			break;
		case 81:
			close(sd);
			exit(0);
			break;
		default:
			printf("Comando errato\n");
	}
	}
	close(sd);
	exit(0);
}
int main(int argc, char *argv[]){
	pthread_t tid;
	struct sockaddr_in c_add;
	int base_sd, curr_sd;
	int addrlen=0;
	int myport;
	int err=0;
	if(argc < 2) user_err("usage: server <port>");
	myport=atoi(argv[1]);
	base_sd=init_sd(myport);
	while (!err) {
		curr_sd=accept(base_sd, CAST_ADDR(&c_add), &addrlen);
		if(curr_sd < 0) sys_err("accept failed");
		pthread_create(&tid, 0, body, (void *)curr_sd);
	}
}
se volete potete contattarmi via email all'indirizzo 
pric...@tin.it
oppure rispondermi qui...vi ringrazio in anticipo

 oppure rispondermi qui...vi ringrazio in anticipo
ho sbagliato a scrivere l'email.....quella giusta è 
prin...@titn.it

 void *list_file(void* sa){
a sta povera funzione fari ritornare solo un NULL?
IMHO elimina il return che e' inutile
Ciao Jack
-- 
http://motoko.dyndns.org


<snip>
Già troppi errori, mi fermo qui. Davvero riesci a compilarlo?


Si si riesco a compilarlo...ho fatto le tue modifiche ma ottengo
sempre lo stesso errore...quando finisce la funzione list_file()
praticamente mi da questo errore maledetto...infatti non ritorna
nemmeno nello switch della funzione body()...ti ringrazio per l'aiuto
e spero di risolvere il problema col tuo aiuto

 e spero di risolvere il problema col tuo aiuto
Io correggerei tutti quegli errori (non solo quelli che ti ho scritto
io, ce ne sono altri) che hanno come effetto indirizzare letture e
scritture in parti casuali di memoria (come utilizzo di stringhe non
inizializzate, o passaggio di puntatori a puntatori alle read()).
Oltretutto ho visto che in alcuni punti usi in maniera
interscambiabile int e void* - non sono la stessa cosa.


il problema è nella popen che mi fa sballare il rientro nella funzione
body...ho provato a levare le funzioni popen e pclose e nn ho + lo
stack smashing...volevo a questo punto usare la execve() ma nn riesco
a fare la redirezione del comando ls su un file temporaneo da me
generato...magari potresti essermi d'aiuto...grazie cmq per
l'interessamento...