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

Lint Skipped
Unit Tests Skipped

Event Timeline

kib edited edge metadata.Jul 13 2017, 7:51 AM

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

kib added a comment.Jul 13 2017, 2:49 PM

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
kib accepted this revision.Jul 14 2017, 7:58 AM
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.