Add more error checks to sftp_packet_read().

git-svn-id: svn+ssh://svn.berlios.de/svnroot/repos/libssh/trunk@573 7dcaeef0-15fb-0310-b436-a5af3365683c
This commit is contained in:
Andreas Schneider
2009-04-22 14:52:04 +00:00
parent 6402559f28
commit ea59faaec9

View File

@@ -216,39 +216,54 @@ int sftp_packet_write(SFTP_SESSION *sftp,u8 type, BUFFER *payload){
}
SFTP_PACKET *sftp_packet_read(SFTP_SESSION *sftp) {
SFTP_PACKET *packet;
SFTP_PACKET *packet = NULL;
u32 size;
sftp_enter_function();
packet = malloc(sizeof(SFTP_PACKET));
if (packet == NULL) {
return NULL;
}
packet->sftp = sftp;
packet->payload = buffer_new();
if (packet->payload == NULL) {
SAFE_FREE(packet);
return NULL;
}
if (channel_read(sftp->channel, packet->payload, 4, 0) <= 0) {
buffer_free(packet->payload);
free(packet);
SAFE_FREE(packet);
sftp_leave_function();
return NULL;
}
buffer_get_u32(packet->payload,&size);
if (buffer_get_u32(packet->payload, &size) < 0) {
buffer_free(packet->payload);
SAFE_FREE(packet);
sftp_leave_function();
return NULL;
}
size = ntohl(size);
if (channel_read(sftp->channel, packet->payload, 1, 0) <= 0) {
buffer_free(packet->payload);
free(packet);
SAFE_FREE(packet);
sftp_leave_function();
return NULL;
}
buffer_get_u8(packet->payload, &packet->type);
if(size>1)
if (size > 1) {
if (channel_read(sftp->channel, packet->payload, size - 1, 0) <= 0) {
buffer_free(packet->payload);
free(packet);
SAFE_FREE(packet);
sftp_leave_function();
return NULL;
}
}
sftp_leave_function();
return packet;
}