From 328da2975fc4e7848ea214bdf2b6037cff42aa05 Mon Sep 17 00:00:00 2001 From: Alexander Boettcher Date: Wed, 15 Feb 2017 15:36:27 +0100 Subject: [PATCH] vfs: fix races in fs_file_system with pthreads Change metadata before submitting a packet. If the submitting thread is a pthread, the metadata may be immediately change by the signal handler running in the context of the entrypoint thread. --- repos/os/src/lib/vfs/fs_file_system.h | 32 ++++++++++++++++----------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/repos/os/src/lib/vfs/fs_file_system.h b/repos/os/src/lib/vfs/fs_file_system.h index 2b5521f589..7b2290a0a6 100644 --- a/repos/os/src/lib/vfs/fs_file_system.h +++ b/repos/os/src/lib/vfs/fs_file_system.h @@ -161,14 +161,16 @@ class Vfs::Fs_file_system : public File_system clipped_count, seek_offset); + /* wait until packet was acknowledged */ + handle.queued_read_state = Handle_state::Queued_state::QUEUED; + /* pass packet to server side */ source.submit_packet(packet_in); - /* wait until packet was acknowledged */ - handle.queued_read_state = Handle_state::Queued_state::QUEUED; - do { + while (handle.queued_read_state != Handle_state::Queued_state::ACK) + { _env.ep().wait_and_dispatch_one_signal(); - } while (handle.queued_read_state != Handle_state::Queued_state::ACK); + } /* obtain result packet descriptor with updated status info */ Packet_descriptor const packet_out = handle.queued_read_packet; @@ -211,14 +213,16 @@ class Vfs::Fs_file_system : public File_system memcpy(source.packet_content(packet_in), buf, count); + /* wait until packet was acknowledged */ + handle.queued_write_state = Handle_state::Queued_state::QUEUED; + /* pass packet to server side */ source.submit_packet(packet_in); - /* wait until packet was acknowledged */ - handle.queued_write_state = Handle_state::Queued_state::QUEUED; - do { + while (handle.queued_write_state != Handle_state::Queued_state::ACK) + { _env.ep().wait_and_dispatch_one_signal(); - } while (handle.queued_write_state != Handle_state::Queued_state::ACK); + } /* obtain result packet descriptor with updated status info */ Packet_descriptor const packet_out = handle.queued_write_packet; @@ -746,14 +750,14 @@ class Vfs::Fs_file_system : public File_system ::File_system::Packet_descriptor::READ, clipped_count, handle->seek()); - /* pass packet to server side */ - source.submit_packet(packet); - handle->read_ready_state = Handle_state::Read_ready_state::IDLE; handle->queued_read_state = Handle_state::Queued_state::QUEUED; out_result = READ_QUEUED; + /* pass packet to server side */ + source.submit_packet(packet); + return true; } @@ -777,12 +781,13 @@ class Vfs::Fs_file_system : public File_system memcpy(dst, source.packet_content(packet), read_num_bytes); - source.release_packet(packet); handle->queued_read_state = Handle_state::Queued_state::IDLE; handle->queued_read_packet = ::File_system::Packet_descriptor(); out_count = read_num_bytes; + source.release_packet(packet); + return READ_OK; } @@ -811,9 +816,10 @@ class Vfs::Fs_file_system : public File_system Packet_descriptor::READ_READY, 0, 0); - source.submit_packet(packet); handle->read_ready_state = Handle_state::Read_ready_state::PENDING; + source.submit_packet(packet); + /* * When the packet is acknowledged the application is notified via * Io_response_handler::handle_io_response().