Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Change default umask from 777 to 022 #22589

Merged
merged 10 commits into from
Sep 23, 2024
2 changes: 1 addition & 1 deletion system/lib/libc/emscripten_syscall_stubs.c
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ static int g_pid = 42;
static int g_pgid = 42;
static int g_ppid = 1;
static int g_sid = 42;
static mode_t g_umask = S_IRWXU | S_IRWXG | S_IRWXO;
static mode_t g_umask = S_IWGRP | S_IWOTH;
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For reference, here are the definitions of values used here:

#define S_ISUID 04000
#define S_ISGID 02000
#define S_ISVTX 01000
#define S_IRUSR 0400
#define S_IWUSR 0200
#define S_IXUSR 0100
#define S_IRWXU 0700
#define S_IRGRP 0040
#define S_IWGRP 0020
#define S_IXGRP 0010
#define S_IRWXG 0070
#define S_IROTH 0004
#define S_IWOTH 0002
#define S_IXOTH 0001
#define S_IRWXO 0007


#ifdef NDEBUG
#define REPORT(name)
Expand Down
65 changes: 65 additions & 0 deletions test/other/test_umask.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
/*
* Copyright 2024 The Emscripten Authors. All rights reserved.
* Emscripten is available under two separate licenses, the MIT license and the
* University of Illinois/NCSA Open Source License. Both these licenses can be
* found in the LICENSE file.
*/

#include <assert.h>
#include <errno.h>
#include <fcntl.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>

mode_t get_umask() {
mode_t current = umask(0); // Set umask to 0 and get the old value
umask(current); // Immediately set it back
return current;
}

void create_file(const char *path, const char *buffer) {
mode_t mode = 0777 - get_umask();
int fd = open(path, O_WRONLY | O_CREAT | O_EXCL, mode);
assert(fd >= 0);

int err = write(fd, buffer, sizeof(char) * strlen(buffer));
assert(err == (sizeof(char) * strlen(buffer)));

close(fd);
}

int main() {
// Get the default umask
mode_t default_umask = get_umask();
printf("default umask: %o\n", default_umask);
assert(default_umask == 022);

// Create a new file with default umask
create_file("umask_test_file", "abcdef");
struct stat st;
stat("umask_test_file", &st);
printf("default_umask - stat: %o\n", st.st_mode);
assert((st.st_mode & 0666) == 0644);
unlink("umask_test_file");

// Set new umask
mode_t new_umask = 027;
mode_t old_umask = umask(new_umask);

// Create a new file with new umask
create_file("umask_test_file", "abcdef");
stat("umask_test_file", &st);
printf("new_umask - stat: %o\n", st.st_mode);
assert((st.st_mode & 0666) == 0640);

// Restore the old umask
umask(old_umask);

puts("success");
return EXIT_SUCCESS;
}
5 changes: 5 additions & 0 deletions test/test_other.py
Original file line number Diff line number Diff line change
Expand Up @@ -7669,6 +7669,11 @@ def test_umask_0(self):
self.run_process([EMCC, 'src.c'])
self.assertContained('hello, world!', self.run_js('a.out.js'))

@crossplatform
@also_with_wasmfs
def test_umask(self):
self.do_runf('other/test_umask.c', 'success')

def test_no_missing_symbols(self):
# simple hello world should not show any missing symbols
self.run_process([EMCC, test_file('hello_world.c')])
Expand Down
Loading