Rollup merge of #130810 - kromych:master, r=workingjubilee · qinheping/verify-rust-std@bcb9d23 (original) (raw)

`@@ -105,84 +105,7 @@ mod os {

`

105

105

`}

`

106

106

`}

`

107

107

``

108

``

`-

#[cfg(target_os = "linux")]

`

109

``

`-

mod os {

`

110

``

`-

use super::DebuggerPresence;

`

111

``

`-

use crate::fs::File;

`

112

``

`-

use crate::io::Read;

`

113

``

-

114

``

`-

pub(super) fn is_debugger_present() -> Option {

`

115

``

`-

// This function is crafted with the following goals:

`

116

``

`-

// * Memory efficiency: It avoids crashing the panicking process due to

`

117

``

`-

// out-of-memory (OOM) conditions by not using large heap buffers or

`

118

``

`-

// allocating significant stack space, which could lead to stack overflow.

`

119

``

`-

// * Minimal binary size: The function uses a minimal set of facilities

`

120

``

`-

// from the standard library to avoid increasing the resulting binary size.

`

121

``

`-

//

`

122

``

`` -

// To achieve these goals, the function does not use [std::io::BufReader]

``

123

``

`-

// and instead reads the file byte by byte using a sliding window approach.

`

124

``

`-

// It's important to note that the "/proc/self/status" pseudo-file is synthesized

`

125

``

`-

// by the Virtual File System (VFS), meaning it is not read from a slow or

`

126

``

`-

// non-volatile storage medium so buffering might not be as beneficial because

`

127

``

`-

// all data is read from memory, though this approach does incur a syscall for

`

128

``

`-

// each byte read.

`

129

``

`-

//

`

130

``

`-

// We cannot make assumptions about the file size or the position of the

`

131

``

`-

// target prefix ("TracerPid:"), so the function does not use

`

132

``

`` -

// [std::fs::read_to_string] thus not employing UTF-8 to ASCII checking,

``

133

``

`-

// conversion, or parsing as we're looking for an ASCII prefix.

`

134

``

`-

//

`

135

``

`-

// These condiderations make the function deviate from the familiar concise pattern

`

136

``

`-

// of searching for a string in a text file.

`

137

``

-

138

``

`-

fn read_byte(file: &mut File) -> Option {

`

139

``

`-

let mut buffer = [0];

`

140

``

`-

file.read_exact(&mut buffer).ok()?;

`

141

``

`-

Some(buffer[0])

`

142

``

`-

}

`

143

``

-

144

``

`-

// The ASCII prefix of the datum we're interested in.

`

145

``

`-

const TRACER_PID: &[u8] = b"TracerPid:\t";

`

146

``

-

147

``

`-

let mut file = File::open("/proc/self/status").ok()?;

`

148

``

`-

let mut matched = 0;

`

149

``

-

150

``

`` -

// Look for the TRACER_PID prefix.

``

151

``

`-

while let Some(byte) = read_byte(&mut file) {

`

152

``

`-

if byte == TRACER_PID[matched] {

`

153

``

`-

matched += 1;

`

154

``

`-

if matched == TRACER_PID.len() {

`

155

``

`-

break;

`

156

``

`-

}

`

157

``

`-

} else {

`

158

``

`-

matched = 0;

`

159

``

`-

}

`

160

``

`-

}

`

161

``

-

162

``

`-

// Was the prefix found?

`

163

``

`-

if matched != TRACER_PID.len() {

`

164

``

`-

return None;

`

165

``

`-

}

`

166

``

-

167

``

`-

// It was; get the ASCII representation of the first digit

`

168

``

`-

// of the PID. That is enough to see if there is a debugger

`

169

``

`-

// attached as the kernel does not pad the PID on the left

`

170

``

`-

// with the leading zeroes.

`

171

``

`-

let byte = read_byte(&mut file)?;

`

172

``

`-

if byte.is_ascii_digit() && byte != b'0' {

`

173

``

`-

Some(DebuggerPresence::Detected)

`

174

``

`-

} else {

`

175

``

`-

Some(DebuggerPresence::NotDetected)

`

176

``

`-

}

`

177

``

`-

}

`

178

``

`-

}

`

179

``

-

180

``

`-

#[cfg(not(any(

`

181

``

`-

target_os = "windows",

`

182

``

`-

target_vendor = "apple",

`

183

``

`-

target_os = "freebsd",

`

184

``

`-

target_os = "linux"

`

185

``

`-

)))]

`

``

108

`+

#[cfg(not(any(target_os = "windows", target_vendor = "apple", target_os = "freebsd")))]

`

186

109

`mod os {

`

187

110

`pub(super) fn is_debugger_present() -> Optionsuper::DebuggerPresence {

`

188

111

`None

`