Search code examples
linuxlinux-kernelkernelprocfs

how do I get current user in the kernel ie how to call current->uid the right way


I am writing a Loadable Kernel Modules (LKM) . This LKM needs to do some special stuff if the user that just executed cat/proc/ is the current user. so I am trying to figure out how to find this info. My first attempt was to use get_current_user() as defined in cred.h. but that is not working out. http://lxr.linux.no/linux+*/include/linux/cred.h#L290 I am no looking for other ways this is what I have found none seem to work How to get userID when writing Linux kernel module How do I call Linux syscall from kernel space?

function in question:

static int  getuid()
{
 return get_current_user()->uid;
}

gcc output:

make -C /lib/modules/2.6.32-358.11.1.el6.x86_64/build M=/root/git_prj1 modules
make[1]: Entering directory `/usr/src/kernels/2.6.32-358.11.1.el6.x86_64'
  CC [M]  /root/git_prj1/proc_setup.o
/root/git_prj1/proc_setup.c:37: warning: function declaration isn���t a prototype
/root/git_prj1/proc_setup.c: In function ���getuid���:
/root/git_prj1/proc_setup.c:39: error: dereferencing pointer to incomplete type
/root/git_prj1/proc_setup.c:39: error: implicit declaration of function ���get_uid���
/root/git_prj1/proc_setup.c:39: warning: assignment makes pointer from integer without a cast
/root/git_prj1/proc_setup.c:39: warning: return makes integer from pointer without a cast
/root/git_prj1/proc_setup.c: In function ���read_key���:
/root/git_prj1/proc_setup.c:52: warning: format ���%s��� expects type ���char *���, but argument 4 has type ���int���
make[2]: *** [/root/git_prj1/proc_setup.o] Error 1
make[1]: *** [_module_/root/git_prj1] Error 2
make[1]: Leaving directory `/usr/src/kernels/2.6.32-358.11.1.el6.x86_64'
make: *** [all] Error 2

Solution

  • Since I can't see the full source of your code, I can't say exactly what is wrong.

    However, I wrote up a quick demo and managed to get it to work fairly easily. I suspect you were simply missing a header in whatever code you had.

    danieltang@danieltang-virtual-machine:~/test_module$ cat test.c
    #include <linux/module.h>
    #include <linux/init.h>
    #include <linux/kernel.h>
    #include <linux/sched.h>
    #include <linux/cred.h>
    
    static int test_init(void)
    {
        printk(KERN_INFO "Current UID = %u\n",
            get_current_user()->uid);
    
        return 0;
    }
    
    static void test_exit(void)
    {
    }
    
    module_init(test_init);
    module_exit(test_exit);
    danieltang@danieltang-virtual-machine:~/test_module$ make
    make -C /lib/modules/3.5.0-17-generic/build  M=/home/danieltang/test_module   modules  
    make[1]: Entering directory `/usr/src/linux-headers-3.5.0-17-generic'
    Building with KERNELRELEASE = 3.5.0-17-generic
      Building modules, stage 2.
    Building with KERNELRELEASE = 3.5.0-17-generic
      MODPOST 1 modules
    make[1]: Leaving directory `/usr/src/linux-headers-3.5.0-17-generic'
    danieltang@danieltang-virtual-machine:~/test_module$ sudo insmod test.ko
    danieltang@danieltang-virtual-machine:~/test_module$ dmesg | tail -n1
    [ 3705.237507] Current UID = 0
    danieltang@danieltang-virtual-machine:~/test_module$