mirror of
https://github.com/genodelabs/genode.git
synced 2025-05-06 10:38:31 +00:00
vfs_lxip: check that socket is ready for I/O
Check that the Linux socket structure is populated before performing read or write operations on control files. Fix #2679
This commit is contained in:
parent
eabe83d4f2
commit
01800ad1a3
@ -314,6 +314,8 @@ class Vfs::Lxip_file : public Vfs::File
|
|||||||
|
|
||||||
char _content_buffer[Lxip::MAX_DATA_LEN];
|
char _content_buffer[Lxip::MAX_DATA_LEN];
|
||||||
|
|
||||||
|
bool _sock_valid() { return _sock.sk != nullptr; }
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
Lxip_file(Lxip::Socket_dir &p, Linux::socket &s, char const *name)
|
Lxip_file(Lxip::Socket_dir &p, Linux::socket &s, char const *name)
|
||||||
@ -363,6 +365,8 @@ class Vfs::Lxip_data_file : public Vfs::Lxip_file
|
|||||||
{
|
{
|
||||||
using namespace Linux;
|
using namespace Linux;
|
||||||
|
|
||||||
|
if (!_sock_valid()) return -1;
|
||||||
|
|
||||||
iovec iov { const_cast<char *>(src), len };
|
iovec iov { const_cast<char *>(src), len };
|
||||||
|
|
||||||
msghdr msg = create_msghdr(&_parent.remote_addr(),
|
msghdr msg = create_msghdr(&_parent.remote_addr(),
|
||||||
@ -376,6 +380,8 @@ class Vfs::Lxip_data_file : public Vfs::Lxip_file
|
|||||||
{
|
{
|
||||||
using namespace Linux;
|
using namespace Linux;
|
||||||
|
|
||||||
|
if (!_sock_valid()) return -1;
|
||||||
|
|
||||||
iovec iov { dst, len };
|
iovec iov { dst, len };
|
||||||
|
|
||||||
msghdr msg = create_msghdr(nullptr, 0, len, &iov);
|
msghdr msg = create_msghdr(nullptr, 0, len, &iov);
|
||||||
@ -412,6 +418,8 @@ class Vfs::Lxip_bind_file : public Vfs::Lxip_file
|
|||||||
{
|
{
|
||||||
using namespace Linux;
|
using namespace Linux;
|
||||||
|
|
||||||
|
if (!_sock_valid()) return -1;
|
||||||
|
|
||||||
if (len > (sizeof(_content_buffer) - 2))
|
if (len > (sizeof(_content_buffer) - 2))
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
@ -475,6 +483,8 @@ class Vfs::Lxip_listen_file : public Vfs::Lxip_file
|
|||||||
Lxip::ssize_t write(char const *src, Genode::size_t len,
|
Lxip::ssize_t write(char const *src, Genode::size_t len,
|
||||||
file_size /* ignored */) override
|
file_size /* ignored */) override
|
||||||
{
|
{
|
||||||
|
if (!_sock_valid()) return -1;
|
||||||
|
|
||||||
if (len > (sizeof(_content_buffer) - 2))
|
if (len > (sizeof(_content_buffer) - 2))
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
@ -532,6 +542,8 @@ class Vfs::Lxip_connect_file : public Vfs::Lxip_file
|
|||||||
{
|
{
|
||||||
using namespace Linux;
|
using namespace Linux;
|
||||||
|
|
||||||
|
if (!_sock_valid()) return -1;
|
||||||
|
|
||||||
if (len > (sizeof(_content_buffer) - 2))
|
if (len > (sizeof(_content_buffer) - 2))
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
@ -604,6 +616,8 @@ class Vfs::Lxip_local_file : public Vfs::Lxip_file
|
|||||||
{
|
{
|
||||||
using namespace Linux;
|
using namespace Linux;
|
||||||
|
|
||||||
|
if (!_sock_valid()) return -1;
|
||||||
|
|
||||||
if (len < sizeof(_content_buffer))
|
if (len < sizeof(_content_buffer))
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
@ -666,6 +680,8 @@ class Vfs::Lxip_remote_file : public Vfs::Lxip_file
|
|||||||
{
|
{
|
||||||
using namespace Linux;
|
using namespace Linux;
|
||||||
|
|
||||||
|
if (!_sock_valid()) return -1;
|
||||||
|
|
||||||
sockaddr_storage addr_storage;
|
sockaddr_storage addr_storage;
|
||||||
sockaddr_in *addr = (sockaddr_in *)&addr_storage;
|
sockaddr_in *addr = (sockaddr_in *)&addr_storage;
|
||||||
|
|
||||||
@ -759,6 +775,8 @@ class Vfs::Lxip_accept_file : public Vfs::Lxip_file
|
|||||||
{
|
{
|
||||||
using namespace Linux;
|
using namespace Linux;
|
||||||
|
|
||||||
|
if (!_sock_valid()) return -1;
|
||||||
|
|
||||||
if (!poll(false, nullptr)) {
|
if (!poll(false, nullptr)) {
|
||||||
throw Would_block();
|
throw Would_block();
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user