mirror of
https://git.libssh.org/projects/libssh.git
synced 2025-05-16 08:04:30 +03:00
pcap: Check return codes of buffer_add_* functions.
Found by Coverity.
This commit is contained in:
parent
9fe47da903
commit
114cc51a10
193
src/pcap.c
193
src/pcap.c
@ -163,12 +163,28 @@ int ssh_pcap_file_write_packet(ssh_pcap_file pcap, ssh_buffer packet, uint32_t o
|
|||||||
if(header == NULL)
|
if(header == NULL)
|
||||||
return SSH_ERROR;
|
return SSH_ERROR;
|
||||||
gettimeofday(&now,NULL);
|
gettimeofday(&now,NULL);
|
||||||
buffer_add_u32(header,htonl(now.tv_sec));
|
err = buffer_add_u32(header,htonl(now.tv_sec));
|
||||||
buffer_add_u32(header,htonl(now.tv_usec));
|
if (err < 0) {
|
||||||
buffer_add_u32(header,htonl(buffer_get_rest_len(packet)));
|
goto error;
|
||||||
buffer_add_u32(header,htonl(original_len));
|
}
|
||||||
buffer_add_buffer(header,packet);
|
err = buffer_add_u32(header,htonl(now.tv_usec));
|
||||||
|
if (err < 0) {
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
err = buffer_add_u32(header,htonl(buffer_get_rest_len(packet)));
|
||||||
|
if (err < 0) {
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
err = buffer_add_u32(header,htonl(original_len));
|
||||||
|
if (err < 0) {
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
err = buffer_add_buffer(header,packet);
|
||||||
|
if (err < 0) {
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
err=ssh_pcap_file_write(pcap,header);
|
err=ssh_pcap_file_write(pcap,header);
|
||||||
|
error:
|
||||||
ssh_buffer_free(header);
|
ssh_buffer_free(header);
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
@ -191,18 +207,40 @@ int ssh_pcap_file_open(ssh_pcap_file pcap, const char *filename){
|
|||||||
header=ssh_buffer_new();
|
header=ssh_buffer_new();
|
||||||
if(header==NULL)
|
if(header==NULL)
|
||||||
return SSH_ERROR;
|
return SSH_ERROR;
|
||||||
buffer_add_u32(header,htonl(PCAP_MAGIC));
|
err = buffer_add_u32(header,htonl(PCAP_MAGIC));
|
||||||
buffer_add_u16(header,htons(PCAP_VERSION_MAJOR));
|
if (err < 0) {
|
||||||
buffer_add_u16(header,htons(PCAP_VERSION_MINOR));
|
goto error;
|
||||||
|
}
|
||||||
|
err = buffer_add_u16(header,htons(PCAP_VERSION_MAJOR));
|
||||||
|
if (err < 0) {
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
err = buffer_add_u16(header,htons(PCAP_VERSION_MINOR));
|
||||||
|
if (err < 0) {
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
/* currently hardcode GMT to 0 */
|
/* currently hardcode GMT to 0 */
|
||||||
buffer_add_u32(header,htonl(0));
|
err = buffer_add_u32(header,htonl(0));
|
||||||
|
if (err < 0) {
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
/* accuracy */
|
/* accuracy */
|
||||||
buffer_add_u32(header,htonl(0));
|
err = buffer_add_u32(header,htonl(0));
|
||||||
|
if (err < 0) {
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
/* size of the biggest packet */
|
/* size of the biggest packet */
|
||||||
buffer_add_u32(header,htonl(MAX_PACKET_LEN));
|
err = buffer_add_u32(header,htonl(MAX_PACKET_LEN));
|
||||||
|
if (err < 0) {
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
/* we will write sort-of IP */
|
/* we will write sort-of IP */
|
||||||
buffer_add_u32(header,htonl(DLT_RAW));
|
err = buffer_add_u32(header,htonl(DLT_RAW));
|
||||||
|
if (err < 0) {
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
err=ssh_pcap_file_write(pcap,header);
|
err=ssh_pcap_file_write(pcap,header);
|
||||||
|
error:
|
||||||
ssh_buffer_free(header);
|
ssh_buffer_free(header);
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
@ -317,64 +355,143 @@ int ssh_pcap_context_write(ssh_pcap_context ctx,enum ssh_pcap_direction directio
|
|||||||
}
|
}
|
||||||
/* build an IP packet */
|
/* build an IP packet */
|
||||||
/* V4, 20 bytes */
|
/* V4, 20 bytes */
|
||||||
buffer_add_u8(ip,4 << 4 | 5);
|
err = buffer_add_u8(ip,4 << 4 | 5);
|
||||||
|
if (err < 0) {
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
/* tos */
|
/* tos */
|
||||||
buffer_add_u8(ip,0);
|
err = buffer_add_u8(ip,0);
|
||||||
|
if (err < 0) {
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
/* total len */
|
/* total len */
|
||||||
buffer_add_u16(ip,htons(origlen + TCPIPHDR_LEN));
|
err = buffer_add_u16(ip,htons(origlen + TCPIPHDR_LEN));
|
||||||
|
if (err < 0) {
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
/* IP id number */
|
/* IP id number */
|
||||||
buffer_add_u16(ip,htons(ctx->file->ipsequence));
|
err = buffer_add_u16(ip,htons(ctx->file->ipsequence));
|
||||||
|
if (err < 0) {
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
ctx->file->ipsequence++;
|
ctx->file->ipsequence++;
|
||||||
/* fragment offset */
|
/* fragment offset */
|
||||||
buffer_add_u16(ip,htons(0));
|
err = buffer_add_u16(ip,htons(0));
|
||||||
|
if (err < 0) {
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
/* TTL */
|
/* TTL */
|
||||||
buffer_add_u8(ip,64);
|
err = buffer_add_u8(ip,64);
|
||||||
|
if (err < 0) {
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
/* protocol TCP=6 */
|
/* protocol TCP=6 */
|
||||||
buffer_add_u8(ip,6);
|
err = buffer_add_u8(ip,6);
|
||||||
|
if (err < 0) {
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
/* checksum */
|
/* checksum */
|
||||||
buffer_add_u16(ip,0);
|
err = buffer_add_u16(ip,0);
|
||||||
|
if (err < 0) {
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
if(direction==SSH_PCAP_DIR_OUT){
|
if(direction==SSH_PCAP_DIR_OUT){
|
||||||
buffer_add_u32(ip,ctx->ipsource);
|
err = buffer_add_u32(ip,ctx->ipsource);
|
||||||
buffer_add_u32(ip,ctx->ipdest);
|
if (err < 0) {
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
err = buffer_add_u32(ip,ctx->ipdest);
|
||||||
|
if (err < 0) {
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
buffer_add_u32(ip,ctx->ipdest);
|
err = buffer_add_u32(ip,ctx->ipdest);
|
||||||
buffer_add_u32(ip,ctx->ipsource);
|
if (err < 0) {
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
err = buffer_add_u32(ip,ctx->ipsource);
|
||||||
|
if (err < 0) {
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
/* TCP */
|
/* TCP */
|
||||||
if(direction==SSH_PCAP_DIR_OUT){
|
if(direction==SSH_PCAP_DIR_OUT){
|
||||||
buffer_add_u16(ip,ctx->portsource);
|
err = buffer_add_u16(ip,ctx->portsource);
|
||||||
buffer_add_u16(ip,ctx->portdest);
|
if (err < 0) {
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
err = buffer_add_u16(ip,ctx->portdest);
|
||||||
|
if (err < 0) {
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
buffer_add_u16(ip,ctx->portdest);
|
err = buffer_add_u16(ip,ctx->portdest);
|
||||||
buffer_add_u16(ip,ctx->portsource);
|
if (err < 0) {
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
err = buffer_add_u16(ip,ctx->portsource);
|
||||||
|
if (err < 0) {
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
/* sequence number */
|
/* sequence number */
|
||||||
if(direction==SSH_PCAP_DIR_OUT){
|
if(direction==SSH_PCAP_DIR_OUT){
|
||||||
buffer_add_u32(ip,ntohl(ctx->outsequence));
|
err = buffer_add_u32(ip,ntohl(ctx->outsequence));
|
||||||
|
if (err < 0) {
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
ctx->outsequence+=origlen;
|
ctx->outsequence+=origlen;
|
||||||
} else {
|
} else {
|
||||||
buffer_add_u32(ip,ntohl(ctx->insequence));
|
err = buffer_add_u32(ip,ntohl(ctx->insequence));
|
||||||
|
if (err < 0) {
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
ctx->insequence+=origlen;
|
ctx->insequence+=origlen;
|
||||||
}
|
}
|
||||||
/* ack number */
|
/* ack number */
|
||||||
if(direction==SSH_PCAP_DIR_OUT){
|
if(direction==SSH_PCAP_DIR_OUT){
|
||||||
buffer_add_u32(ip,ntohl(ctx->insequence));
|
err = buffer_add_u32(ip,ntohl(ctx->insequence));
|
||||||
|
if (err < 0) {
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
buffer_add_u32(ip,ntohl(ctx->outsequence));
|
err = buffer_add_u32(ip,ntohl(ctx->outsequence));
|
||||||
|
if (err < 0) {
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
/* header len = 20 = 5 * 32 bits, at offset 4*/
|
/* header len = 20 = 5 * 32 bits, at offset 4*/
|
||||||
buffer_add_u8(ip,5 << 4);
|
err = buffer_add_u8(ip,5 << 4);
|
||||||
|
if (err < 0) {
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
/* flags */
|
/* flags */
|
||||||
buffer_add_u8(ip,TH_PUSH | TH_ACK);
|
err = buffer_add_u8(ip,TH_PUSH | TH_ACK);
|
||||||
|
if (err < 0) {
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
/* window */
|
/* window */
|
||||||
buffer_add_u16(ip,htons(65535));
|
err = buffer_add_u16(ip,htons(65535));
|
||||||
|
if (err < 0) {
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
/* checksum */
|
/* checksum */
|
||||||
buffer_add_u16(ip,htons(0));
|
err = buffer_add_u16(ip,htons(0));
|
||||||
|
if (err < 0) {
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
/* urgent data ptr */
|
/* urgent data ptr */
|
||||||
buffer_add_u16(ip,0);
|
err = buffer_add_u16(ip,0);
|
||||||
|
if (err < 0) {
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
/* actual data */
|
/* actual data */
|
||||||
buffer_add_data(ip,data,len);
|
err = buffer_add_data(ip,data,len);
|
||||||
|
if (err < 0) {
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
err=ssh_pcap_file_write_packet(ctx->file,ip,origlen + TCPIPHDR_LEN);
|
err=ssh_pcap_file_write_packet(ctx->file,ip,origlen + TCPIPHDR_LEN);
|
||||||
|
error:
|
||||||
ssh_buffer_free(ip);
|
ssh_buffer_free(ip);
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user