From 5437ec4ef13ac1963799076e84c5a63415446f7f Mon Sep 17 00:00:00 2001 From: till straumann Date: Thu, 14 Oct 2021 10:20:52 +0200 Subject: [PATCH 1/2] ioctl.c: FIX: must take io_sem around ecrt_master_send/ecrt_master_receive --- master/ioctl.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/master/ioctl.c b/master/ioctl.c index 100db4bb..52c88bbf 100644 --- a/master/ioctl.c +++ b/master/ioctl.c @@ -1899,7 +1899,9 @@ static ATTRIBUTES int ec_ioctl_send( return -EPERM; } + down( & master->io_sem ); ecrt_master_send(master); + up( & master->io_sem ); return 0; } @@ -1919,7 +1921,9 @@ static ATTRIBUTES int ec_ioctl_receive( return -EPERM; } + down( & master->io_sem ); ecrt_master_receive(master); + up( & master->io_sem ); return 0; } From f4e3a92352fa44c3d1c0d2eb6509618054487be6 Mon Sep 17 00:00:00 2001 From: till straumann Date: Thu, 4 Nov 2021 13:50:55 +0100 Subject: [PATCH 2/2] master/ioctl.c: FIX -- more points where io_sem must be locked Experienced corruption of master->datagram_queue because ecrt_domain_queue() (when called from ioctl) does not hold the io_sem! --- master/ioctl.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/master/ioctl.c b/master/ioctl.c index 52c88bbf..43a98c1a 100644 --- a/master/ioctl.c +++ b/master/ioctl.c @@ -2022,7 +2022,9 @@ static ATTRIBUTES int ec_ioctl_sync_ref( return -EPERM; } + down( & master->io_sem ); ecrt_master_sync_reference_clock(master); + up( & master->io_sem ); return 0; } @@ -2047,7 +2049,9 @@ static ATTRIBUTES int ec_ioctl_sync_ref_to( return -EFAULT; } + down( & master->io_sem ); ecrt_master_sync_reference_clock_to(master, time); + up( & master->io_sem ); return 0; } @@ -2067,7 +2071,9 @@ static ATTRIBUTES int ec_ioctl_sync_slaves( return -EPERM; } + down( & master->io_sem ); ecrt_master_sync_slave_clocks(master); + up( & master->io_sem ); return 0; } @@ -2118,7 +2124,9 @@ static ATTRIBUTES int ec_ioctl_sync_mon_queue( return -EPERM; } + down( & master->io_sem ); ecrt_master_sync_monitor_queue(master); + up( & master->io_sem ); return 0; } @@ -3181,7 +3189,9 @@ static ATTRIBUTES int ec_ioctl_domain_queue( return -ENOENT; } + down( & master->io_sem ); ecrt_domain_queue(domain); + up( & master->io_sem ); return 0; } @@ -3899,7 +3909,9 @@ static ATTRIBUTES int ec_ioctl_voe_exec( return -ENOENT; } + down( & master->io_sem ); data.state = ecrt_voe_handler_execute(voe); + up( & master->io_sem ); if (data.state == EC_REQUEST_SUCCESS && voe->dir == EC_DIR_INPUT) data.size = ecrt_voe_handler_data_size(voe); else