ninis666 |
09-17-2012 10:51 AM |
check your lenght ... and read return values
1/ You dont check if the lenght is correct (you're expecting to read more than what you'll have to).
2/ You have to test the return value of read system call (take a look into the manpage).
By the way, dont you have to allocate memory for your temporary variables (except for your read buffer, it can't fit in stack in some systems). I think that you should use something like this :
Code:
void handlesocket(int newsockfd)
{
#define MAX 960000
int i, n, lenght, done;
char temp2;
char * buffer;
char temp[16];
if (newsockfd < 0) {
fprintf(stderr, "Failed to read lenght from socket : %m\n");
return;
}
i = 0;
while (1) {
n = read(newsockfd, &temp2, 1);
if (n < 0) {
if (errno != EAGAIN && errno != EWOULDBLOCK) {
fprintf(stderr, "Failed to read lenght from socket : %m\n");
return;
}
n = 0;
}
if (temp2 == '@')
break;
if (i >= sizeof temp) {
fprintf(stderr, "Toooo long lenght received (max = %d, %d received so far)\n", sizeof temp, i);
return;
}
temp[i++] = temp2;
temp[i] = '\0';
}
lenght = atoi(temp);
if (lenght <= 0 || lenght >= MAX) {
fprintf(stderr, "Invalid lenght received : %s\n", temp);
return;
}
buffer = new char [lenght + 1];
if (buffer == NULL) {
fprintf(stderr, "Cannot create buffer of %db\n", lenght + 1);
return;
}
printf("Reading %d bytes\n", lenght);
do {
n = read(newsockfd, buffer + done, lenght - done);
if (n < 0) {
if (errno != EAGAIN && errno != EWOULDBLOCK) {
fprintf(stderr, "Failed to read data from socket : %m\n");
return;
}
n = 0;
}
done += n;
} while (done < lenght);
buffer[lenght] = 0;
writeintofile(buffer);
close(newsockfd);
delete buffer;
}
|