5851974b20
Release fork infrastructure: - REDBEAR_RELEASE=0.1.1 with offline enforcement (fetch/distclean/unfetch blocked) - 195 BLAKE3-verified source archives in standard format - Atomic provisioning via provision-release.sh (staging + .complete sentry) - 5-phase improvement plan: restore format auto-detection, source tree validation (validate-source-trees.py), archive-map.json, REPO_BINARY fallback Archive normalization: - Removed 87 duplicate/unversioned archives from shared pool - Regenerated all archives in consistent format with source/ + recipe.toml - BLAKE3SUMS and manifest.json generated from stable tarball set Patch management: - verify-patches.sh: pre-sync dry-run report (OK/REVERSED/CONFLICT) - 121 upstream-absorbed patches moved to absorbed/ directories - 43 active patches verified clean against rebased sources - Stress test: base updated to upstream HEAD, relibc reset and patched Compilation fixes: - relibc: Vec imports in redox-rt (proc.rs, lib.rs, sys.rs) - relibc: unsafe from_raw_parts in mod.rs (2024 edition) - fetch.rs: rev comparison handles short/full hash prefixes - kibi recipe: corrected rev mismatch New scripts: restore-sources.sh, provision-release.sh, verify-sources-archived.sh, check-upstream-releases.sh, validate-source-trees.py, verify-patches.sh, repair-archive-format.sh, generate-manifest.py Documentation: AGENTS.md, README.md, local/AGENTS.md updated for release fork model
92 lines
2.9 KiB
Diff
92 lines
2.9 KiB
Diff
diff --git a/src/header/netdb/lookup.rs b/src/header/netdb/lookup.rs
|
|
index 0734eec6..ccb00b65 100644
|
|
--- a/src/header/netdb/lookup.rs
|
|
+++ b/src/header/netdb/lookup.rs
|
|
@@ -17,10 +17,11 @@ use crate::header::{
|
|
netinet_in::{IPPROTO_UDP, in_addr, sockaddr_in},
|
|
sys_socket::{
|
|
self,
|
|
- constants::{AF_INET, SOCK_DGRAM},
|
|
+ constants::{AF_INET, SOCK_DGRAM, SOL_SOCKET, SO_RCVTIMEO},
|
|
sockaddr,
|
|
},
|
|
time,
|
|
+ sys_select::timeval,
|
|
};
|
|
|
|
use super::{
|
|
@@ -89,11 +90,34 @@ pub fn lookup_host(host: &str) -> Result<LookupHost, c_int> {
|
|
drop(Box::from_raw(packet_data_ptr));
|
|
}
|
|
|
|
- let i = 0 as socklen_t;
|
|
let mut buf = vec![0u8; 65536];
|
|
let buf_ptr = buf.as_mut_ptr().cast::<c_void>();
|
|
|
|
- let count = unsafe { sys_socket::recv(sock, buf_ptr, 65536, 0) };
|
|
+ // Set 5s recv timeout (best-effort; if this fails, recv may block longer).
|
|
+ let tv = timeval {
|
|
+ tv_sec: 5,
|
|
+ tv_usec: 0,
|
|
+ };
|
|
+ unsafe {
|
|
+ sys_socket::setsockopt(
|
|
+ sock,
|
|
+ SOL_SOCKET,
|
|
+ SO_RCVTIMEO,
|
|
+ &tv as *const timeval as *const c_void,
|
|
+ core::mem::size_of::<timeval>() as socklen_t,
|
|
+ );
|
|
+ }
|
|
+
|
|
+ let mut count: isize = -1;
|
|
+ for _attempt in 0..2 {
|
|
+ count = unsafe { sys_socket::recv(sock, buf_ptr, 65536, 0) };
|
|
+ if count >= 0 {
|
|
+ break;
|
|
+ }
|
|
+ if unsafe { sys_socket::send(sock, packet_data_ptr, packet_data_len, 0) } < 0 {
|
|
+ break;
|
|
+ }
|
|
+ }
|
|
if count < 0 {
|
|
return Err(EIO);
|
|
}
|
|
@@ -193,11 +217,34 @@ pub fn lookup_addr(addr: in_addr) -> Result<Vec<Vec<u8>>, c_int> {
|
|
drop(Box::from_raw(packet_data_ptr));
|
|
}
|
|
|
|
- let i = mem::size_of::<sockaddr_in>() as socklen_t;
|
|
let mut buf = [0u8; 65536];
|
|
let buf_ptr = buf.as_mut_ptr().cast::<c_void>();
|
|
|
|
- let count = unsafe { sys_socket::recv(sock, buf_ptr, 65536, 0) };
|
|
+ // Set 5s recv timeout (best-effort; if this fails, recv may block longer).
|
|
+ let tv = timeval {
|
|
+ tv_sec: 5,
|
|
+ tv_usec: 0,
|
|
+ };
|
|
+ unsafe {
|
|
+ sys_socket::setsockopt(
|
|
+ sock,
|
|
+ SOL_SOCKET,
|
|
+ SO_RCVTIMEO,
|
|
+ &tv as *const timeval as *const c_void,
|
|
+ core::mem::size_of::<timeval>() as socklen_t,
|
|
+ );
|
|
+ }
|
|
+
|
|
+ let mut count: isize = -1;
|
|
+ for _attempt in 0..2 {
|
|
+ count = unsafe { sys_socket::recv(sock, buf_ptr, 65536, 0) };
|
|
+ if count >= 0 {
|
|
+ break;
|
|
+ }
|
|
+ if unsafe { sys_socket::send(sock, packet_data_ptr, packet_data_len, 0) } < 0 {
|
|
+ break;
|
|
+ }
|
|
+ }
|
|
if count < 0 {
|
|
return Err(EIO);
|
|
}
|