From f4e3a92352fa44c3d1c0d2eb6509618054487be6 Mon Sep 17 00:00:00 2001 From: till straumann Date: Thu, 4 Nov 2021 13:50:55 +0100 Subject: [PATCH] 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