• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #ifndef _FCNTL_H
17 #error "Never include this file directly; instead, include <fcntl.h>"
18 #endif
19 
20 #include "fortify.h"
21 
22 #ifdef __cplusplus
23 extern "C" {
24 #endif
25 
26 int __open_diagnose(const char*, int);
27 int __openat_diagnose(int, const char*, int);
28 #if defined(_LARGEFILE64_SOURCE) || defined(_GNU_SOURCE)
29 int __open64_diagnose(const char*, int);
30 int __openat64_diagnose(int, const char*, int);
31 #endif
32 /*
33  * Even in musl FORTIFY, the following is the easiest way to call a real open.
34  */
35 int __open_real(const char*, int, ...) __DIAGNOSE_RENAME(open);
36 int __openat_real(int, const char*, int, ...) __DIAGNOSE_RENAME(openat);
37 #if defined(_LARGEFILE64_SOURCE) || defined(_GNU_SOURCE)
38 int __open64_real(const char*, int, ...) __DIAGNOSE_RENAME(open64);
39 int __openat64_real(int, const char*, int, ...) __DIAGNOSE_RENAME(openat64);
40 #endif
41 
42 #ifdef __FORTIFY_COMPILATION
43 __DIAGNOSE_FORTIFY_INLINE
open(const char * const __DIAGNOSE_PASS_OBJECT_SIZE path,int flags)44 int open(const char* const __DIAGNOSE_PASS_OBJECT_SIZE path, int flags)
45 __DIAGNOSE_OVERLOAD
46 __DIAGNOSE_ERROR_IF(__DIAGNOSE_OPEN_MODES_USEFUL(flags), "'open' " OPEN_TOO_FEW_ARGS_ERROR)
47 {
48 #ifdef __FORTIFY_RUNTIME
49     return __open_diagnose(path, flags);
50 #else
51     return __open_real(path, flags);
52 #endif
53 }
54 
55 __DIAGNOSE_FORTIFY_INLINE
open(const char * const __DIAGNOSE_PASS_OBJECT_SIZE path,int flags,unsigned modes)56 int open(const char* const __DIAGNOSE_PASS_OBJECT_SIZE path, int flags, unsigned modes)
57 __DIAGNOSE_OVERLOAD
58 __DIAGNOSE_WARNING_IF(!__DIAGNOSE_OPEN_MODES_USEFUL(flags) && modes, "'open' " OPEN_USELESS_MODES_WARNING)
59 {
60     return __open_real(path, flags, modes);
61 }
62 
63 __DIAGNOSE_FORTIFY_INLINE
openat(int dirfd,const char * const __DIAGNOSE_PASS_OBJECT_SIZE path,int flags)64 int openat(int dirfd, const char* const __DIAGNOSE_PASS_OBJECT_SIZE path, int flags)
65 __DIAGNOSE_OVERLOAD
66 __DIAGNOSE_ERROR_IF(__DIAGNOSE_OPEN_MODES_USEFUL(flags), "'openat' " OPEN_TOO_FEW_ARGS_ERROR)
67 {
68 #ifdef __FORTIFY_RUNTIME
69     return __openat_diagnose(dirfd, path, flags);
70 #else
71     return __openat_real(dirfd, path, flags);
72 #endif
73 }
74 
75 __DIAGNOSE_FORTIFY_INLINE
openat(int dirfd,const char * const __DIAGNOSE_PASS_OBJECT_SIZE path,int flags,mode_t modes)76 int openat(int dirfd, const char* const __DIAGNOSE_PASS_OBJECT_SIZE path, int flags, mode_t modes)
77 __DIAGNOSE_OVERLOAD
78 __DIAGNOSE_WARNING_IF(!__DIAGNOSE_OPEN_MODES_USEFUL(flags) && modes, "'openat' " OPEN_USELESS_MODES_WARNING)
79 {
80     return __openat_real(dirfd, path, flags, modes);
81 }
82 
83 #if defined(_LARGEFILE64_SOURCE) || defined(_GNU_SOURCE)
84 __DIAGNOSE_FORTIFY_INLINE
open64(const char * const __DIAGNOSE_PASS_OBJECT_SIZE path,int flags)85 int open64(const char* const __DIAGNOSE_PASS_OBJECT_SIZE path, int flags)
86 __DIAGNOSE_OVERLOAD
87 __DIAGNOSE_ERROR_IF(__DIAGNOSE_OPEN_MODES_USEFUL(flags), "'open64' " OPEN_TOO_FEW_ARGS_ERROR)
88 {
89 #ifdef __FORTIFY_RUNTIME
90     return __open64_diagnose(path, flags);
91 #else
92     return __open64_real(path, flags);
93 #endif
94 }
95 
96 __DIAGNOSE_FORTIFY_INLINE
open64(const char * const __DIAGNOSE_PASS_OBJECT_SIZE path,int flags,mode_t modes)97 int open64(const char* const __DIAGNOSE_PASS_OBJECT_SIZE path, int flags, mode_t modes)
98 __DIAGNOSE_OVERLOAD
99 __DIAGNOSE_WARNING_IF(!__DIAGNOSE_OPEN_MODES_USEFUL(flags) && modes, "'open64' " OPEN_USELESS_MODES_WARNING)
100 {
101     return __open64_real(path, flags, modes);
102 }
103 
104 __DIAGNOSE_FORTIFY_INLINE
openat64(int dirfd,const char * const __DIAGNOSE_PASS_OBJECT_SIZE path,int flags)105 int openat64(int dirfd, const char* const __DIAGNOSE_PASS_OBJECT_SIZE path, int flags)
106 __DIAGNOSE_OVERLOAD
107 __DIAGNOSE_ERROR_IF(__DIAGNOSE_OPEN_MODES_USEFUL(flags), "'openat64' " OPEN_TOO_FEW_ARGS_ERROR)
108 {
109 #ifdef __FORTIFY_RUNTIME
110     return __openat64_diagnose(dirfd, path, flags);
111 #else
112     return __openat64_real(dirfd, path, flags);
113 #endif
114 }
115 
116 __DIAGNOSE_FORTIFY_INLINE
openat64(int dirfd,const char * const __DIAGNOSE_PASS_OBJECT_SIZE path,int flags,mode_t modes)117 int openat64(int dirfd, const char* const __DIAGNOSE_PASS_OBJECT_SIZE path, int flags, mode_t modes)
118 __DIAGNOSE_OVERLOAD
119 __DIAGNOSE_WARNING_IF(!__DIAGNOSE_OPEN_MODES_USEFUL(flags) && modes, "'openat64' " OPEN_USELESS_MODES_WARNING)
120 {
121     return __openat64_real(dirfd, path, flags, modes);
122 }
123 #endif
124 
125 #endif
126 
127 #ifdef __cplusplus
128 }
129 #endif