bounds check for tun and tcp writing

pull/35/head
Jeff Becker 6 years ago
parent de17324012
commit c483ec5231
No known key found for this signature in database
GPG Key ID: F357B3B42F6F9B05

@ -117,10 +117,20 @@ llarp_ev_add_tun(struct llarp_ev_loop *loop, struct llarp_tun_io *tun)
} }
bool bool
llarp_ev_tun_async_write(struct llarp_tun_io *tun, const void *pkt, size_t sz) llarp_tcp_conn_async_write(struct llarp_tcp_conn *conn, const void *pkt,
size_t sz)
{ {
return static_cast< llarp::ev_io * >(tun->impl)->queue_write( constexpr size_t buffsz = llarp::ev_io::WriteBuffer::BufferSize;
(const byte_t *)pkt, sz); const byte_t *ptr = (const byte_t *)pkt;
llarp::ev_io *impl = static_cast< llarp::ev_io * >(conn->impl);
while(sz > buffsz)
{
if(!impl->queue_write((const byte_t *)ptr, buffsz))
return false;
ptr += buffsz;
sz -= buffsz;
}
return impl->queue_write(ptr, sz);
} }
bool bool
@ -149,11 +159,12 @@ llarp_tcp_acceptor_close(struct llarp_tcp_acceptor *tcp)
} }
bool bool
llarp_tcp_conn_async_write(struct llarp_tcp_conn *conn, const void *buf, llarp_ev_tun_async_write(struct llarp_tun_io *tun, const void *buf, size_t sz)
size_t sz)
{ {
return static_cast< llarp::ev_io * >(conn->impl) if(sz > llarp::ev_io::WriteBuffer::BufferSize)
->queue_write((const byte_t *)buf, sz); return false;
return static_cast< llarp::ev_io * >(tun->impl)->queue_write(
(const byte_t *)buf, sz);
} }
void void

@ -29,13 +29,14 @@ namespace llarp
{ {
struct WriteBuffer struct WriteBuffer
{ {
llarp_time_t timestamp = 0; static constexpr size_t BufferSize = 2048;
llarp_time_t timestamp = 0;
size_t bufsz; size_t bufsz;
byte_t buf[1500]; byte_t buf[BufferSize];
WriteBuffer() = default; WriteBuffer() = default;
WriteBuffer(const void* ptr, size_t sz) WriteBuffer(const byte_t* ptr, size_t sz)
{ {
if(sz <= sizeof(buf)) if(sz <= sizeof(buf))
{ {

Loading…
Cancel
Save