sys_jail_attach()

Can kernel thread or kernel module invoke sys_jail_attach() ? In our programs, if this call is invoked under kernel module or kernel thread , it always returns success , even when jail id is invalid.
 
You will probably get more meaningful answers if you explained what you're trying to do.
 
We want to create kernel sockets from a kernel module which needs to bind to addresses under different jails. Hence we want to a way to attach kernel module to different jails before creating kernel socket. We tried invoking sys_jail_attach() in task Q handler(mytcp_work_handler) as below, which resulted in kernel crash.
We would like to know if the call sys_jail_attach can be invoked in kernel space through a kernel thread(task Q thread)?

We are using Freebsd 14.0.
Code:
root@bsdvm1:~ # uname -a
FreeBSD bsdvm1 14.0-CURRENT FreeBSD 14.0-CURRENT #0 main-n261872-1fb7d2cf999e: Thu Mar 30 10:18:47 UTC 2023     root@releng1.nyi.freebsd.org:/usr/obj/usr/src/amd64.amd64/sys/GENERIC amd64
root@bsdvm1:~ #

We have jail with id 1 configured on the system.
Code:
root@bsdvm1:~ # jls
   JID  IP Address      Hostname                      Path
     1                  bsdvm1                        /
code snippet:
Code:
static void mytcp_work_handler(void *context, int pending) {
        int error = 0, jerr=0;
            int jail_id = 1;
            struct file *fp;
            struct thread *tdp;
           // struct jail_attach_args ja;
            struct jail_attach_args ja = { .jid = jail_id };
            struct sockaddr_in addr;
           // ja.jid = 1;
            printf("entering ioctl2  \n");
            jerr=sys_jail_attach(curthread, &ja);  <=================
            if (jerr<0)
               printf("Attach Failed - Main Thread");
            else
            printf (" Kernel in jail %d \n ", jerr);
            tdp = curthread; // Get current thread
            printf("about to invoke socreate \n");
            error = socreate(PF_INET, &so, SOCK_STREAM, IPPROTO_TCP, tdp->td_ucred, tdp);
Crash dump:
Code:
(kgdb) bt
#0  __curthread () at /usr/src/sys/amd64/include/pcpu_aux.h:59
#1  doadump (textdump=1) at /usr/src/sys/kern/kern_shutdown.c:407
#2  0xffffffff804b4af8 in db_fncall_generic (args=0xfffffe011bb806f0, addr=<optimized out>, rv=<optimized out>, nargs=<optimized out>)
    at /usr/src/sys/ddb/db_command.c:628
#3  db_fncall (dummy1=<optimized out>, dummy2=<optimized out>, dummy3=<optimized out>, dummy4=<optimized out>)
    at /usr/src/sys/ddb/db_command.c:676
#4  0xffffffff804b456d in db_command (last_cmdp=<optimized out>, cmd_table=<optimized out>, dopager=true) at /usr/src/sys/ddb/db_command.c:506
#5  0xffffffff804b423d in db_command_loop () at /usr/src/sys/ddb/db_command.c:553
#6  0xffffffff804b78f6 in db_trap (type=<optimized out>, code=<optimized out>) at /usr/src/sys/ddb/db_main.c:270
#7  0xffffffff80c3dffe in kdb_trap (type=type@entry=3, code=code@entry=0, tf=tf@entry=0xfffffe011bb80a50) at /usr/src/sys/kern/subr_kdb.c:745
#8  0xffffffff810e4696 in trap (frame=0xfffffe011bb80a50) at /usr/src/sys/amd64/amd64/trap.c:610
#9  <signal handler called>
#10 kdb_enter (why=<optimized out>, msg=<optimized out>) at /usr/src/sys/kern/subr_kdb.c:509
#11 0xffffffff80bef423 in vpanic (fmt=<optimized out>, ap=ap@entry=0xfffffe011bb80ba0) at /usr/src/sys/kern/kern_shutdown.c:960
#12 0xffffffff80bef1e3 in panic (fmt=0xffffffff81e853f0 <cnputs_mtx> "\037\307\035\201\377\377\377\377")
    at /usr/src/sys/kern/kern_shutdown.c:896
#13 0xffffffff810e4b29 in trap_fatal (frame=0xfffffe011bb80c90, eva=0) at /usr/src/sys/amd64/amd64/trap.c:954
#14 0xffffffff810e4bdb in trap_pfault (frame=0xfffffe011bb80c90, usermode=false, signo=<optimized out>, ucode=<optimized out>)
    at /usr/src/sys/amd64/amd64/trap.c:762
#15 <signal handler called>
#16 0xffffffff80bb1f25 in prison_proc_unlink (p=0xffffffff81e83910 <proc0>, pr=<optimized out>) at /usr/src/sys/kern/kern_jail.c:2982
#17 prison_proc_relink (opr=<optimized out>, npr=npr@entry=0xfffff8000b30a000, p=p@entry=0xffffffff81e83910 <proc0>)
    at /usr/src/sys/kern/kern_jail.c:2990
#18 0xffffffff80bae1ed in do_jail_attach (td=<optimized out>, pr=0xfffff8000b30a000, drflags=3) at /usr/src/sys/kern/kern_jail.c:2692
#19 0xffffffff82f192ae in mytcp_work_handler () from /usr/obj/usr/src/amd64.amd64/sk/ioctl_socket.ko
#20 0xffffffff80c5364a in taskqueue_run_locked (queue=queue@entry=0xfffff8000c77f200) at /usr/src/sys/kern/subr_taskqueue.c:514
#21 0xffffffff80c54712 in taskqueue_thread_loop (arg=arg@entry=0xffffffff82f1b150 <mytcp_taskqueue>) at /usr/src/sys/kern/subr_taskqueue.c:826
#22 0xffffffff80ba5770 in fork_exit (callout=0xffffffff80c54650 <taskqueue_thread_loop>, arg=0xffffffff82f1b150 <mytcp_taskqueue>,
    frame=0xfffffe011bb80f40) at /usr/src/sys/kern/kern_fork.c:1102
#23 <signal handler called>
#24 0x000030fd0f95c8ba in ?? ()
 
Last edited by a moderator:
Back
Top