[PATCH rtems-libbsd] ipsec-tools: Fix copying fd_set prior to select
Christian MAUDERER
christian.mauderer at embedded-brains.de
Tue May 23 06:25:50 UTC 2023
Hello Chris,
On 2023-05-23 03:36, Chris Johns wrote:
> Hi,
>
> I have been resolving this by adding:
>
> #define preset_mask *preset_mask_prealloc
> #define active_mask *active_mask_prealloc
>
> as the assignment logic works as is. It does not catch FD_ZERO which is a shame
> but is helps avoid us adding a special case.
Thanks for the suggestion. I used that solution already in the file
during the initial port. But it doesn't work in this case (and maybe we
should check other cases in libbsd too). It only copies the first
element of the array of fd_sets.
The variables / defines are (in the patched version - see [1]):
static fd_set *allocated_preset_mask, *allocated_active_mask;
static struct fd_monitor *allocated_fd_monitors;
#define preset_mask (*allocated_preset_mask)
#define active_mask (*allocated_active_mask)
#define fd_monitors (allocated_fd_monitors)
They are allocated as follows (see [2]):
allocated_preset_mask = calloc(sizeof(fd_set),
howmany(rtems_libio_number_iops, sizeof(fd_set) * 8));
allocated_active_mask = calloc(sizeof(fd_set),
howmany(rtems_libio_number_iops, sizeof(fd_set) * 8));
allocated_fd_monitors = calloc(
rtems_libio_number_iops, sizeof(struct fd_monitor));
So basically it's a bunch of arrays of fd_sets. If I now use the
following (unpatched) assignment:
active_mask = preset_mask;
After the preprocessor the line will be
(*allocated_active_mask) = (*allocated_preset_mask);
Which copies only the first element. That's why I had to add the memcpy.
Did I miss some better solution?
Best regards
Christian
[1]
https://git.rtems.org/rtems-libbsd/tree/ipsec-tools/src/racoon/session.c?id=16be3a7c7d3141018c48d5131a3069184cd3937a#n136
[2]
https://git.rtems.org/rtems-libbsd/tree/ipsec-tools/src/racoon/session.c?id=16be3a7c7d3141018c48d5131a3069184cd3937a#n218
>
> Chris
>
> On 22/5/2023 5:36 pm, Christian Mauderer wrote:
>> The racoon session code copies an fd_set from one variable into another
>> prior to calling select. That works well for simple structures.
>>
>> In libbsd we have to allocate fd_sets instead of using fixed structures
>> to avoid a problem with file numbers bigger than FD_SETSIZE. The simple
>> assignment didn't work in that case.
>>
>> This patch makes sure that a memcpy is used instead.
>> ---
>> ipsec-tools/src/racoon/session.c | 7 +++++++
>> 1 file changed, 7 insertions(+)
>>
>> diff --git a/ipsec-tools/src/racoon/session.c b/ipsec-tools/src/racoon/session.c
>> index 7ea857ba..bd2bd316 100644
>> --- a/ipsec-tools/src/racoon/session.c
>> +++ b/ipsec-tools/src/racoon/session.c
>> @@ -215,6 +215,8 @@ session(void)
>> #ifndef __rtems__
>> FD_ZERO(&preset_mask);
>> #else /* __rtems__ */
>> + size_t allocated_mask_size = sizeof(fd_set) *
>> + howmany(rtems_libio_number_iops, sizeof(fd_set) * 8);
>> allocated_preset_mask = calloc(sizeof(fd_set),
>> howmany(rtems_libio_number_iops, sizeof(fd_set) * 8));
>> if (allocated_preset_mask == NULL)
>> @@ -352,7 +354,12 @@ session(void)
>>
>> /* schedular can change select() mask, so we reset
>> * the working copy here */
>> +#ifndef __rtems__
>> active_mask = preset_mask;
>> +#else /* __rtems__ */
>> + memcpy(allocated_active_mask, allocated_preset_mask,
>> + allocated_mask_size);
>> +#endif /* __rtems__ */
>>
>> error = select(nfds + 1, &active_mask, NULL, NULL, timeout);
>> if (error < 0) {
--
--------------------------------------------
embedded brains GmbH & Co. KG
Herr Christian MAUDERER
Dornierstr. 4
82178 Puchheim
Germany
email: christian.mauderer at embedded-brains.de
phone: +49-89-18 94 741 - 18
mobile: +49-176-152 206 08
Registergericht: Amtsgericht München
Registernummer: HRA 117265
Vertretungsberechtigte Geschäftsführer: Peter Rasmussen, Thomas Dörfler
Unsere Datenschutzerklärung finden Sie hier:
https://embedded-brains.de/datenschutzerklaerung/
More information about the devel
mailing list