summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/sys/stat.h48
-rw-r--r--tests/Makefile1
-rw-r--r--tests/test_umask.c10
3 files changed, 59 insertions, 0 deletions
diff --git a/include/sys/stat.h b/include/sys/stat.h
new file mode 100644
index 0000000..2de34db
--- /dev/null
+++ b/include/sys/stat.h
@@ -0,0 +1,48 @@
1/*
2 * Copyright (C) 2015-2016 Dimitris Papastamos <sin@2f30.org>
3 * Copyright (C) 2022 q66 <q66@chimera-linux.org>
4 *
5 * Permission to use, copy, modify, and/or distribute this software for any
6 * purpose with or without fee is hereby granted.
7 *
8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15 */
16
17#ifndef _FORTIFY_SYS_STAT_H
18#define _FORTIFY_SYS_STAT_H
19
20#if !defined(__cplusplus) && !defined(__clang__)
21__extension__
22#endif
23#include_next <sys/stat.h>
24
25#if defined(_FORTIFY_SOURCE) && _FORTIFY_SOURCE > 0 && defined(__OPTIMIZE__) && __OPTIMIZE__ > 0
26#include "../fortify-headers.h"
27
28#ifdef __cplusplus
29extern "C" {
30#endif
31
32#if !defined(__clang__) /* FIXME */
33#undef umask
34
35__error_if(__m & ~0777, "'umask' called with invalid mode")
36_FORTIFY_FN(umask) mode_t umask(mode_t __m)
37{
38 return __orig_umask(__m);
39}
40#endif
41
42#ifdef __cplusplus
43}
44#endif
45
46#endif
47
48#endif
diff --git a/tests/Makefile b/tests/Makefile
index 5145b3b..5bc7fdb 100644
--- a/tests/Makefile
+++ b/tests/Makefile
@@ -91,6 +91,7 @@ TARGETS= \
91 test_strrchr_static_read \ 91 test_strrchr_static_read \
92 test_ttyname_r_dynamic \ 92 test_ttyname_r_dynamic \
93 test_ttyname_r_static \ 93 test_ttyname_r_static \
94 test_umask \
94 test_vsnprintf_dynamic \ 95 test_vsnprintf_dynamic \
95 test_vsnprintf_static \ 96 test_vsnprintf_static \
96 test_vsprintf \ 97 test_vsprintf \
diff --git a/tests/test_umask.c b/tests/test_umask.c
new file mode 100644
index 0000000..075782f
--- /dev/null
+++ b/tests/test_umask.c
@@ -0,0 +1,10 @@
1#include "common.h"
2
3#include <sys/stat.h>
4
5int main(int argc, char** argv) {
6#if !defined(__clang__)
7 umask(0666);
8#endif
9 return ret;
10}