Setting group/other write flags not honoured in open
Hi folks,
I hope it's OK to ask this question here. I'm reading The Linux Programming Interface and am beginning to get to grips with the file oriented system calls.
I have a program that calls open to create a file, specifying the mode flags for owner, group, other read and write. The file is created sucessfully, but when I look at its permissions, I only see the read perms set for group and others:
Quoted 2 lines
./create_file foo
ls -l foo
-rw-r--r-- 1 nick users 0 Oct 31 14:52 foo
Why would that be? The entirety of my program is
#include <fcntl.h>
#include <unistd.h>
int main(int argc, char *argv[]) {
int open_flags = O_CREAT | O_WRONLY | O_TRUNC;
mode_t file_perms =
S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH;
int output_fd = open(argv[1], open_flags, file_perms);
close(output_fd);
}
I also ran the program with strace and the perms in the openat call are as I would expect:
openat(AT_FDCWD, "foo", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3
I don't understand why the group and other write flags aren't being set. Could someone help shed some light on this please?
I'm not sure what factors influence this, but I'm running openSUSE Leap 15.2, with kernel 5.3.18-lp152.47-default, gcc 7.5.0 and glibc 2.26.
Thanks,
Nicky
_______________________________________________
Kernelnewbies mailing list
[email protected]
https://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
Hey, I think this is because the process's umask is changing the mode. In fs/namei.c in the function lookup_open() there's this bit:
....
if (!IS_POSIXACL(dir->d_inode))
mode &= ~current_umask();
....
the open(2) and umask(2) manpages will explain how to deal with it
-Marcelo
Quoted 41 lines · Nicky Chorley
Hi folks,
I hope it's OK to ask this question here. I'm reading The Linux Programming Interface and am beginning to get to grips with the file oriented system calls.
I have a program that calls open to create a file, specifying the mode flags for owner, group, other read and write. The file is created sucessfully, but when I look at its permissions, I only see the read perms set for group and others:
Quoted 2 lines
./create_file foo
ls -l foo-rw-r--r-- 1 nick users 0 Oct 31 14:52 foo
Why would that be? The entirety of my program is
#include <
fcntl.h>
#include <unistd.h>int
main(int argc, char *argv[]){
intopen_flags=O_CREAT|O_WRONLY|O_TRUNC;
mode_tfile_perms=S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH;int output_fd = open(argv[1], open_flags, file_perms);
close(output_fd);
}I also ran the program with strace and the perms in the openat call are as I would expect:
openat(AT_FDCWD, "foo", O_WRONLY|O_CREAT|O_TRUNC, 0666)= 3I don't understand why the group and other write flags aren't being set. Could someone help shed some light on this please?
I'm not sure what factors influence this, but I'm running openSUSE Leap 15.2, with kernel 5.3.18-lp152.47-default, gcc 7.5.0 and glibc 2.26.
Quoted 9 lines
Thanks,
Nicky
_______________________________________________
Kernelnewbies mailing list
[email protected]
https://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
_______________________________________________
Kernelnewbies mailing list
[email protected]
https://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
I realised I never got back to this. Thanks Marcelo for that - I'll look into it.
Best,
Nicky
Quoted 8 lines · Marcelo Diop-Gonzalez
Hey, I think this is because the process's umask is changing the mode. In
fs/namei.cin the functionlookup_open()there's this bit:....
if (!IS_POSIXACL(dir->d_inode))
mode &= ~current_umask();
....
Quoted 60 lines
the open(2) and umask(2) manpages will explain how to deal with it
-Marcelo
Quoted 50 lines · Nicky Chorley
Hi folks,
I hope it's OK to ask this question here. I'm reading The Linux Programming Interface and am beginning to get to grips with the file oriented system calls.
I have a program that calls open to create a file, specifying the mode flags for owner, group, other read and write. The file is created sucessfully, but when I look at its permissions, I only see the read perms set for group and others:
Quoted 2 lines
./create_file foo
ls -l foo-rw-r--r-- 1 nick users 0 Oct 31 14:52 foo
Why would that be? The entirety of my program is
#include <
fcntl.h>
#include <unistd.h>int
main(int argc, char *argv[]){
intopen_flags=O_CREAT|O_WRONLY|O_TRUNC;
mode_tfile_perms=S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH;int output_fd = open(argv[1], open_flags, file_perms);
close(output_fd);
}I also ran the program with strace and the perms in the openat call are as I would expect:
openat(AT_FDCWD, "foo", O_WRONLY|O_CREAT|O_TRUNC, 0666)= 3I don't understand why the group and other write flags aren't being set. Could someone help shed some light on this please?
I'm not sure what factors influence this, but I'm running openSUSE Leap 15.2, with kernel 5.3.18-lp152.47-default, gcc 7.5.0 and glibc 2.26.
Thanks,
Nicky
_______________________________________________
Kernelnewbies mailing list
[email protected]
https://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
_______________________________________________
Kernelnewbies mailing list
[email protected]
https://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies