Page MenuHomeFreeBSD

Preserve syscall flags for dynamically loaded syscalls

Authored by on Jul 13 2017, 12:38 AM.



Using the suite, the PosixMqueue.CapModeForked test was failing due to an ECAPMODE after calling kmq_notify(). On further inspection, the following code from sys/kern/uipc_mqueue.c initialized the dynamically loaded syscall entry with sy_flags zeroed out:

static struct syscall_helper_data mq_syscalls[] = {

Not sure if this is the right way to go about this, please let me know.

Diff Detail

rS FreeBSD src repository - subversion
Automatic diff as part of commit; lint not applicable.
Automatic diff as part of commit; unit tests not applicable.

Event Timeline

I think that the idea of the fix is sound, but technically I do not like it. Why sy_flags is copied from the bogus main syscall table into new sysent, while other fields are copied from the module-provided sysents ?

IMO what should be done is module sysent entries fixed to provide correct sy_flags. To achieve this, you might need to add e.g. SYSCALL_INIT_HELPER_F) macro which would take sy_flags argument in addition to the argument already taken by the SYSCALL_INIT_HELPER(), and initialize modules' syscall_helper_data tables with the correct flags.

Changed module syscall init helpers to initialize flags

Changed module syscall init helpers to initialize flags

This looks good. Two more notes:

  • compat32 helpers need same treatment
  • I suggest to add a comment to capabilities.conf around the affected syscalls so that it is clear that flags might come from other place
  • Added comment to sys/kern/capabilities.conf for more information on where the sysents are being initialized
  • Added flags to SYSCALL32 initializers
This revision is now accepted and ready to land.Jul 14 2017, 7:58 AM
This revision was automatically updated to reflect the committed changes.