Skip to content

Commit 1f90bdf

Browse files
authored
Merge pull request #234 from Freax13/enhancement/misc-2026-02-17
a few small fixes
2 parents 51d078f + b4efa95 commit 1f90bdf

9 files changed

Lines changed: 198 additions & 21 deletions

File tree

tee/kernel/src/fs/fd/stream_buffer.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -675,6 +675,10 @@ impl WriteHalf {
675675
guard.write_shutdown = true;
676676
self.notify().notify();
677677
}
678+
679+
pub fn is_either_reset(&self) -> bool {
680+
self.data.buffer.lock().ty.is_either_reset()
681+
}
678682
}
679683

680684
impl Drop for WriteHalf {

tee/kernel/src/fs/fd/unix_socket/dgram.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -469,7 +469,7 @@ impl OpenFileDescription for DgramUnixSocket {
469469
}
470470
drop(cmsg_builder);
471471

472-
Ok(len)
472+
Ok(written)
473473
}
474474

475475
fn write(&self, buf: &dyn WriteBuf, ctx: &FileAccessContext) -> Result<usize> {

tee/kernel/src/net/tcp.rs

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -487,14 +487,16 @@ impl OpenFileDescription for TcpSocket {
487487
let Mode::Passive(passive) = mode else {
488488
bail!(Inval);
489489
};
490-
let active = passive
491-
.internal
492-
.lock()
493-
.queue
494-
.pop_front()
495-
.ok_or(err!(Again))?;
490+
let mut guard = passive.internal.lock();
491+
let active = guard.queue.pop_front().ok_or(err!(Again))?;
492+
let now_empty = guard.queue.is_empty();
493+
drop(guard);
496494
let remote_addr = active.remote_addr;
497495

496+
if now_empty {
497+
passive.notify.notify();
498+
}
499+
498500
let mut internal = self.internal.lock().clone();
499501
internal
500502
.flags
@@ -862,6 +864,7 @@ impl OpenFileDescription for TcpSocket {
862864
active.read_half.write_shutdown();
863865
}
864866
}
867+
ensure!(!active.write_half.is_either_reset(), NotConn);
865868
Ok(())
866869
}
867870

tee/kernel/src/user/exec.rs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use alloc::{borrow::ToOwned, ffi::CString, vec};
2-
use core::{ffi::CStr, iter::from_fn};
2+
use core::{cmp, ffi::CStr, iter::from_fn};
33

44
use bytemuck::{Zeroable, bytes_of_mut};
55
use usize_conversions::FromUsize;
@@ -133,15 +133,17 @@ impl VirtualMemory {
133133
self.modify().init_brk(brk_start);
134134

135135
// Create stack.
136+
const MIN_SIZE: u64 = 64 * 1024 * 1024;
136137
let len = stack_limit.get();
138+
let allocation_size = cmp::max(MIN_SIZE, len);
137139
let bias = Bias::Dynamic {
138140
abi: E::ABI,
139141
map_32bit: false,
140142
};
141-
let stack = self
142-
.modify()
143-
.allocate_stack(bias, len, CurrentAsLimit::INFINITE)?
144-
+ len;
143+
let stack =
144+
self.modify()
145+
.allocate_stack(bias, allocation_size, CurrentAsLimit::INFINITE)?
146+
+ allocation_size;
145147

146148
// Sum up the number of pointer-sized values that need to be placed in
147149
// a contigous chunk of memory.

tee/kernel/src/user/process/limits.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ impl Limits {
3131
rlim_max: RLimit::INFINITY,
3232
}),
3333
stack: AtomicRLimit::new(RLimit {
34-
rlim_cur: 64 * 1024 * 1024,
34+
rlim_cur: 8 * 1024 * 1024,
3535
rlim_max: RLimit::INFINITY,
3636
}),
3737
core: AtomicRLimit::new(RLimit {

tee/kernel/src/user/syscall.rs

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -340,6 +340,7 @@ const SYSCALL_HANDLERS: SyscallHandlers = {
340340
handlers.register(SysOldGetrlimit);
341341
handlers.register(SysGetrusage);
342342
handlers.register(SysSysinfo);
343+
handlers.register(SysTimes);
343344
handlers.register(SysPtrace);
344345
handlers.register(SysGetuid);
345346
handlers.register(SysGetgid);
@@ -3435,6 +3436,39 @@ fn sysinfo(
34353436
Ok(0)
34363437
}
34373438

3439+
#[syscall(i386 = 43, amd64 = 100)]
3440+
fn times(
3441+
abi: Abi,
3442+
thread: &Arc<Thread>,
3443+
#[state] virtual_memory: Arc<VirtualMemory>,
3444+
buf: Pointer<Tms>,
3445+
) -> SyscallResult {
3446+
let process = thread.process();
3447+
3448+
let guard = process.self_usage.lock();
3449+
let utime = guard.utime;
3450+
let stime = guard.stime;
3451+
drop(guard);
3452+
3453+
let guard = process.children_usage.lock();
3454+
let cutime = guard.utime;
3455+
let cstime = guard.stime;
3456+
drop(guard);
3457+
3458+
let times = Tms {
3459+
utime: Clock::from(utime),
3460+
stime: Clock::from(stime),
3461+
cutime: Clock::from(cutime),
3462+
cstime: Clock::from(cstime),
3463+
};
3464+
virtual_memory.write_with_abi(buf, times, abi)?;
3465+
3466+
let monotonic = now(ClockId::Monotonic);
3467+
let monotonic = Timeval::from(monotonic);
3468+
let clock = Clock::from(monotonic);
3469+
Ok(clock.0)
3470+
}
3471+
34383472
#[syscall(i386 = 26, amd64 = 101)]
34393473
fn ptrace(
34403474
abi: Abi,

tee/kernel/src/user/syscall/args.rs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2853,3 +2853,24 @@ enum_arg! {
28532853
Invalid = 0xffff_ffff,
28542854
}
28552855
}
2856+
2857+
#[derive(Debug, Clone, Copy)]
2858+
pub struct Clock(pub u64);
2859+
2860+
impl From<Timeval> for Clock {
2861+
fn from(value: Timeval) -> Self {
2862+
Self(value.tv_sec as u64 * 1_000_000 + u64::from(value.tv_usec))
2863+
}
2864+
}
2865+
2866+
#[derive(Debug, Clone, Copy)]
2867+
pub struct Tms {
2868+
/// user time
2869+
pub utime: Clock,
2870+
/// system time
2871+
pub stime: Clock,
2872+
/// user time of children
2873+
pub cutime: Clock,
2874+
/// system time of children
2875+
pub cstime: Clock,
2876+
}

tee/kernel/src/user/syscall/args/pointee.rs

Lines changed: 84 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,14 +28,14 @@ use crate::{
2828
memory::VirtualMemory,
2929
syscall::{
3030
args::{
31-
CmsgHdr, ControlMode, Domain, FdNum, FileMode, Flock, FlockType, FlockWhence,
32-
ITimerspec, ITimerval, InputMode, Iovec, IpMreq, IpMreqn, Ipv6Mreq, Linger,
33-
LinuxDirent64, LocalMode, LongOffset, MMsgHdr, MsgHdr, MsgHdrFlags, Offset,
31+
Clock, CmsgHdr, ControlMode, Domain, FdNum, FileMode, Flock, FlockType,
32+
FlockWhence, ITimerspec, ITimerval, InputMode, Iovec, IpMreq, IpMreqn, Ipv6Mreq,
33+
Linger, LinuxDirent64, LocalMode, LongOffset, MMsgHdr, MsgHdr, MsgHdrFlags, Offset,
3434
OpenFlags, OpenHow, OutputMode, PSelectSigsetArg, PktInfo, PktInfo6, Pointer,
3535
PtraceSyscallInfo, PtraceSyscallInfoValue, RLimit, ResolveFlags, Rusage,
3636
SchedParam, SemInfo, SigEvent, SigEventData, SocketAddr, SocketAddrNetlink,
3737
SocketAddrUnix, Stat, SysInfo, Termios, Time, TimerId, Timespec, Timeval, Timezone,
38-
Ucred, UserCapData, UserCapHeader, UserRegs32, UserRegs64, WStatus, WinSize,
38+
Tms, Ucred, UserCapData, UserCapHeader, UserRegs32, UserRegs64, WStatus, WinSize,
3939
},
4040
traits::Abi,
4141
},
@@ -3262,3 +3262,83 @@ impl From<PtraceSyscallInfo> for RawPtraceSyscallInfo {
32623262

32633263
impl Pointee for SemInfo {}
32643264
impl PrimitivePointee for SemInfo {}
3265+
3266+
impl Pointee for Clock {}
3267+
impl AbiDependentPointee for Clock {
3268+
type I386 = Clock32;
3269+
type Amd64 = Clock64;
3270+
}
3271+
3272+
#[derive(Debug, Clone, Copy, Pod, Zeroable)]
3273+
#[repr(transparent)]
3274+
pub struct Clock32(u32);
3275+
3276+
#[derive(Debug, Clone, Copy, Pod, Zeroable)]
3277+
#[repr(transparent)]
3278+
pub struct Clock64(u64);
3279+
3280+
impl From<Clock> for Clock32 {
3281+
fn from(value: Clock) -> Self {
3282+
Self(value.0 as u32)
3283+
}
3284+
}
3285+
3286+
impl From<Clock> for Clock64 {
3287+
fn from(value: Clock) -> Self {
3288+
Self(value.0)
3289+
}
3290+
}
3291+
3292+
impl Pointee for Tms {}
3293+
impl AbiDependentPointee for Tms {
3294+
type I386 = Tms32;
3295+
type Amd64 = Tms64;
3296+
}
3297+
3298+
#[derive(Debug, Clone, Copy, Pod, Zeroable)]
3299+
#[repr(C)]
3300+
pub struct Tms32 {
3301+
/// user time
3302+
pub utime: Clock32,
3303+
/// system time
3304+
pub stime: Clock32,
3305+
/// user time of children
3306+
pub cutime: Clock32,
3307+
/// system time of children
3308+
pub cstime: Clock32,
3309+
}
3310+
3311+
#[derive(Debug, Clone, Copy, Pod, Zeroable)]
3312+
#[repr(C)]
3313+
pub struct Tms64 {
3314+
/// user time
3315+
pub utime: Clock64,
3316+
/// system time
3317+
pub stime: Clock64,
3318+
/// user time of children
3319+
pub cutime: Clock64,
3320+
/// system time of children
3321+
pub cstime: Clock64,
3322+
}
3323+
3324+
impl From<Tms> for Tms32 {
3325+
fn from(value: Tms) -> Self {
3326+
Self {
3327+
utime: value.utime.into(),
3328+
stime: value.stime.into(),
3329+
cutime: value.cutime.into(),
3330+
cstime: value.cstime.into(),
3331+
}
3332+
}
3333+
}
3334+
3335+
impl From<Tms> for Tms64 {
3336+
fn from(value: Tms) -> Self {
3337+
Self {
3338+
utime: value.utime.into(),
3339+
stime: value.stime.into(),
3340+
cutime: value.cutime.into(),
3341+
cstime: value.cstime.into(),
3342+
}
3343+
}
3344+
}

tee/tests/src/net.rs

Lines changed: 37 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,10 @@ use nix::{
1313
poll::{PollFd, PollFlags, PollTimeout, poll},
1414
sys::{
1515
socket::{
16-
self, AddressFamily, Backlog, ControlMessage, ControlMessageOwned, MsgFlags, SockFlag,
17-
SockProtocol, SockType, SockaddrIn, SockaddrIn6, SockaddrLike, SockaddrStorage, accept,
18-
connect, getpeername, getsockname, listen, recv, recvfrom, recvmsg, send, sendmsg,
19-
sendto, setsockopt, shutdown, socket, socketpair,
16+
self, AddressFamily, Backlog, ControlMessage, ControlMessageOwned, MsgFlags, Shutdown,
17+
SockFlag, SockProtocol, SockType, SockaddrIn, SockaddrIn6, SockaddrLike,
18+
SockaddrStorage, accept, connect, getpeername, getsockname, listen, recv, recvfrom,
19+
recvmsg, send, sendmsg, sendto, setsockopt, shutdown, socket, socketpair,
2020
sockopt::{
2121
Ipv4PacketInfo, Ipv4RecvTtl, Ipv6RecvHopLimit, Ipv6RecvPacketInfo, Ipv6RecvTClass,
2222
Ipv6V6Only, Linger, ReceiveTimeout, ReuseAddr, ReusePort, TcpNoDelay,
@@ -2621,3 +2621,36 @@ fn tcp_close_write() {
26212621
}
26222622
}
26232623
}
2624+
2625+
#[test]
2626+
fn tcp_close_write_shutdown_read() {
2627+
let (sock1, sock2) = tcp_socket_pair();
2628+
close(sock2).unwrap();
2629+
assert_eq!(nix::unistd::write(&sock1, b"A"), Ok(1));
2630+
assert_eq!(
2631+
shutdown(sock1.as_raw_fd(), Shutdown::Read),
2632+
Err(Errno::ENOTCONN)
2633+
);
2634+
}
2635+
2636+
#[test]
2637+
fn tcp_close_write_shutdown_write() {
2638+
let (sock1, sock2) = tcp_socket_pair();
2639+
close(sock2).unwrap();
2640+
assert_eq!(nix::unistd::write(&sock1, b"A"), Ok(1));
2641+
assert_eq!(
2642+
shutdown(sock1.as_raw_fd(), Shutdown::Read),
2643+
Err(Errno::ENOTCONN)
2644+
);
2645+
}
2646+
2647+
#[test]
2648+
fn tcp_close_write_shutdown_both() {
2649+
let (sock1, sock2) = tcp_socket_pair();
2650+
close(sock2).unwrap();
2651+
assert_eq!(nix::unistd::write(&sock1, b"A"), Ok(1));
2652+
assert_eq!(
2653+
shutdown(sock1.as_raw_fd(), Shutdown::Both),
2654+
Err(Errno::ENOTCONN)
2655+
);
2656+
}

0 commit comments

Comments
 (0)