I'm stuck with the fanotify 
<http://man7.org/linux/man-pages/man7/fanotify.7.html>systemcall to get 
access control for file-access events, when a file on the device gets 
opened. My specs:
   
   - Samsung i9300 ARM with LineageOS 14.1 
   <https://wiki.lineageos.org/devices/i9300/>
   - Linux kernel 3.0.101 (fanotify is available in kernel > 2.6.36 / 
   android 5)
   - NDK r14b
   - rooted


I have build an Android native application (written in C) based on fsmon 
<https://github.com/nowsecure/fsmon>to handle the file access. After 
compiling I pushed the executable armeabi-v7 file with ADB on the device 
(/data/local/tmp/). Then I tried to execute (as su) the file and got 
following error message:

  
fanotify_mark: Invalid argument.

I had changed the kernel config by editing the 
/lineage/kernel/samsung/smdk4412/arch/arm/configs/lineageos_i9300_defconfig 
to:

CONFIG_FANOTIFY=y
CONFIG_FANOTIFY_ACCESS_PERMISSIONS=y


Also after flashing the new kernel and running

 cat /proc/config.gz | gunzip > running.config

from the device to get the kernel config, I can see that both config-params 
are activated. Following is the code (the calling function, if more is 
necessary, I will extend it) which crashes:

static bool fm_begin (FileMonitor *fm) {
 // Define event mask which fanotify should signal.
 // Important: the FAN_ALL_PERM_EVENTS flag to enable access control
 uint64_t fan_mask = FAN_OPEN | FAN_CLOSE | FAN_ACCESS | FAN_MODIFY | 
FAN_ALL_PERM_EVENTS;
 // Set which type of operation it should do on fanotify_mark() - adding 
the flaggs 
 unsigned int mark_flags = FAN_MARK_ADD, init_flags = 0;
 struct sigaction sa;
 int res = 0;


 // Set function to close the file descriptor
 fm->control_c = fm_control_c;
 sa.sa_flags = SA_SIGINFO | SA_RESTART;
 sigemptyset (&sa.sa_mask);
 sa.sa_sigaction = usr1_handler;
 if (sigaction (SIGUSR1, &sa, NULL) == -1) {
        printf ("Cannot set SIGUSR1 signal handler\n");
        return false;
 }
 fan_mask |= FAN_ONDIR;
 fan_mask |= FAN_EVENT_ON_CHILD;
 // Walk into subdirectories
 mark_flags |= FAN_MARK_MOUNT;
 
 // Important: Set FAN_CLASS_CONTENT to allow/deny access to files
 init_flags |= (fan_mask & FAN_ALL_PERM_EVENTS)
               ? FAN_CLASS_CONTENT
               : FAN_CLASS_NOTIF;
 if (!fm->root) {
    fm->root = "/";
 }


 // Call the fanotify_init systemcall with read only and enable for large 
files
 fan_fd = fanotify_init (init_flags, O_RDONLY | O_LARGEFILE);
 if (fan_fd < 0) {
    perror ("fanotify_init");
    return false;
 }

 // Call the fanotify_mark systemcall with flags
 // CRASHES HERE!!!!!!!!!!!!!!! res = -1
 res = fanotify_mark (fan_fd, mark_flags, fan_mask, AT_FDCWD, fm->root);
 if (res != 0) {
    printf("Result: %i\n", res); // == -1
    perror ("fanotify_mark");
    return false;
 }

 FD_ZERO (&rfds);
 FD_SET (fan_fd, &rfds);
 return true;
}

I logged the flags and they seemed to be valid, no null value or something 
else. I also tried different combinations of the mask, no result...

The fanotify_init() function works properly and doesn't throw an error 
(before I set the CONFIG in the kernel config-file, the application crashed 
here).

I tried the same code on Ubuntu and on a x86 Stock Android emulator 
(compiled AOSP) with success - the application get's started and I can 
control the access. But on the emulator the goldfish kernel is running.

Running "adb shell logcat" and "adb shell dmesg" doesn't show me an error 
on execution...

It's a little bit strange because the return value 1 (fanotify negate the 
value) of the fanotify_mark() call is on the errno.h list:

#define EPERM 1 /* Operation not permitted */

I think it's a kernel problem (not LineageOs) so this could be the right 
place to ask...

Some suggestions?...

-- 
-- 
unsubscribe: android-kernel+unsubscr...@googlegroups.com
website: http://groups.google.com/group/android-kernel
--- 
You received this message because you are subscribed to the Google Groups 
"Android Linux Kernel Development" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to android-kernel+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to