181 lines
6.6 KiB
Diff
181 lines
6.6 KiB
Diff
From 3b59a1cc7b3d9ea38ae3501c7a4e09597f7acdaa Mon Sep 17 00:00:00 2001
|
|
From: binlingyu <binlingyu@uniontech.com>
|
|
Date: Sun, 28 Apr 2024 13:41:35 +0800
|
|
Subject: [PATCH] fix use_pty function error
|
|
|
|
---
|
|
lib/util/src/term.rs | 5 +++--
|
|
src/exec_monitor.rs | 12 ++++++------
|
|
src/exec_pty.rs | 38 +++++++++++++++++++++++---------------
|
|
3 files changed, 32 insertions(+), 23 deletions(-)
|
|
|
|
diff --git a/lib/util/src/term.rs b/lib/util/src/term.rs
|
|
index 15bff23..c87c882 100644
|
|
--- a/lib/util/src/term.rs
|
|
+++ b/lib/util/src/term.rs
|
|
@@ -648,7 +648,7 @@ unsafe extern "C" fn sudo_term_raw_v1(fd: libc::c_int, isig: libc::c_int) -> boo
|
|
};
|
|
debug_decl!(stdext::function_name!().as_ptr(), SUDO_DEBUG_UTIL);
|
|
|
|
- if changed != 0 && tcgetattr(fd, &mut oterm) != 0 {
|
|
+ if changed == 0 && tcgetattr(fd, &mut oterm) != 0 {
|
|
debug_return_bool!(false);
|
|
}
|
|
memcpy(
|
|
@@ -684,7 +684,7 @@ unsafe extern "C" fn sudo_term_raw_v1(fd: libc::c_int, isig: libc::c_int) -> boo
|
|
unsafe extern "C" fn sudo_term_cbreak_v1(fd: libc::c_int) -> bool {
|
|
debug_decl!(stdext::function_name!().as_ptr(), SUDO_DEBUG_UTIL);
|
|
|
|
- if changed != 0 && tcgetattr(fd, &mut oterm) != 0 {
|
|
+ if changed == 0 && tcgetattr(fd, &mut oterm) != 0 {
|
|
debug_return_bool!(false);
|
|
}
|
|
|
|
@@ -789,3 +789,4 @@ unsafe extern "C" fn sudo_term_copy_v1(src: libc::c_int, dst: libc::c_int) -> bo
|
|
}
|
|
debug_return_bool!(true)
|
|
}
|
|
+
|
|
diff --git a/src/exec_monitor.rs b/src/exec_monitor.rs
|
|
index 890e30d..0ba0658 100644
|
|
--- a/src/exec_monitor.rs
|
|
+++ b/src/exec_monitor.rs
|
|
@@ -357,7 +357,6 @@ unsafe extern "C" fn mon_handle_sigchld(mut mc: *mut monitor_closure) {
|
|
if !(pid == -(1 as libc::c_int) && errno!() == EINTR) {
|
|
break;
|
|
}
|
|
- break;
|
|
}
|
|
match pid {
|
|
0 => {
|
|
@@ -420,7 +419,7 @@ unsafe extern "C" fn mon_handle_sigchld(mut mc: *mut monitor_closure) {
|
|
(*mc).cmnd_pid,
|
|
signame.as_mut_ptr()
|
|
);
|
|
- (*mc).cmnd_pid == -(1 as libc::c_int);
|
|
+ (*mc).cmnd_pid = -(1 as libc::c_int);
|
|
} else if WIFEXITED!(status) {
|
|
sudo_debug_printf!(
|
|
SUDO_DEBUG_INFO,
|
|
@@ -429,7 +428,7 @@ unsafe extern "C" fn mon_handle_sigchld(mut mc: *mut monitor_closure) {
|
|
(*mc).cmnd_pid,
|
|
WEXITSTATUS!(status)
|
|
);
|
|
- (*mc).cmnd_pid == -(1 as libc::c_int);
|
|
+ (*mc).cmnd_pid = -(1 as libc::c_int);
|
|
} else {
|
|
sudo_debug_printf!(
|
|
SUDO_DEBUG_WARN,
|
|
@@ -772,7 +771,7 @@ unsafe extern "C" fn fill_exec_closure_monitor(
|
|
}
|
|
|
|
/* Event for forwarded signals via backchannel. */
|
|
- let ref mut backchannel_event0 = (*mc).errpipe_event;
|
|
+ let ref mut backchannel_event0 = (*mc).backchannel_event;
|
|
*backchannel_event0 = sudo_ev_alloc_v1(
|
|
backchannel,
|
|
(SUDO_EV_READ | SUDO_EV_PERSIST) as libc::c_short,
|
|
@@ -800,7 +799,7 @@ unsafe extern "C" fn fill_exec_closure_monitor(
|
|
}
|
|
|
|
/* Events for local signals. */
|
|
- let ref mut sigint_event0 = (*mc).errpipe_event;
|
|
+ let ref mut sigint_event0 = (*mc).sigint_event;
|
|
*sigint_event0 = sudo_ev_alloc_v1(
|
|
SIGINT,
|
|
SUDO_EV_SIGINFO as libc::c_short,
|
|
@@ -823,7 +822,7 @@ unsafe extern "C" fn fill_exec_closure_monitor(
|
|
sudo_fatal!(b"unable to add event to queue\0" as *const u8 as *const libc::c_char,);
|
|
}
|
|
|
|
- let ref mut sigquit_event0 = (*mc).errpipe_event;
|
|
+ let ref mut sigquit_event0 = (*mc).sigquit_event;
|
|
*sigquit_event0 = sudo_ev_alloc_v1(
|
|
SIGQUIT,
|
|
SUDO_EV_SIGINFO as libc::c_short,
|
|
@@ -1249,3 +1248,4 @@ pub unsafe extern "C" fn exec_monitor(
|
|
}
|
|
debug_return_int!(-(1 as libc::c_int));
|
|
}
|
|
+
|
|
diff --git a/src/exec_pty.rs b/src/exec_pty.rs
|
|
index 7e14e72..a5cc675 100644
|
|
--- a/src/exec_pty.rs
|
|
+++ b/src/exec_pty.rs
|
|
@@ -2603,11 +2603,11 @@ pub unsafe extern "C" fn exec_pty(
|
|
if io_pipe[STDIN_FILENO as usize][0 as usize] != -(1 as libc::c_int) {
|
|
close(io_pipe[STDIN_FILENO as usize][0 as usize]);
|
|
}
|
|
- if io_pipe[STDOUT_FILENO as usize][0 as usize] != -(1 as libc::c_int) {
|
|
- close(io_pipe[STDOUT_FILENO as usize][0 as usize]);
|
|
+ if io_pipe[STDOUT_FILENO as usize][1 as usize] != -(1 as libc::c_int) {
|
|
+ close(io_pipe[STDOUT_FILENO as usize][1 as usize]);
|
|
}
|
|
- if io_pipe[STDERR_FILENO as usize][0 as usize] != -(1 as libc::c_int) {
|
|
- close(io_pipe[STDERR_FILENO as usize][0 as usize]);
|
|
+ if io_pipe[STDERR_FILENO as usize][1 as usize] != -(1 as libc::c_int) {
|
|
+ close(io_pipe[STDERR_FILENO as usize][1 as usize]);
|
|
}
|
|
close(sv[1 as usize]);
|
|
|
|
@@ -2701,19 +2701,24 @@ unsafe extern "C" fn add_io_events(mut evbase: *mut sudo_event_base) {
|
|
}
|
|
if !((*iob).wevent).is_null() {
|
|
/* Enable writer if buffer is not empty. */
|
|
- sudo_debug_printf!(
|
|
- SUDO_DEBUG_INFO,
|
|
- b"added I/O wevent %p, fd %d, events %d\0" as *const u8 as *const libc::c_char,
|
|
- (*iob).wevent,
|
|
- (*(*iob).wevent).fd,
|
|
- (*(*iob).wevent).events as libc::c_int
|
|
- );
|
|
- if sudo_ev_add_v2(evbase, (*iob).wevent, 0 as *mut timespec, false)
|
|
- == -(1 as libc::c_int)
|
|
- {
|
|
- sudo_fatal!(b"unable to add event to queue\0" as *const u8 as *const libc::c_char,);
|
|
+ if (*iob).len > (*iob).off {
|
|
+ sudo_debug_printf!(
|
|
+ SUDO_DEBUG_INFO,
|
|
+ b"added I/O wevent %p, fd %d, events %d\0" as *const u8 as *const libc::c_char,
|
|
+ (*iob).wevent,
|
|
+ (*(*iob).wevent).fd,
|
|
+ (*(*iob).wevent).events as libc::c_int
|
|
+ );
|
|
+ if sudo_ev_add_v2(evbase, (*iob).wevent, 0 as *mut timespec, false)
|
|
+ == -(1 as libc::c_int)
|
|
+ {
|
|
+ sudo_fatal!(
|
|
+ b"unable to add event to queue\0" as *const u8 as *const libc::c_char,
|
|
+ );
|
|
+ }
|
|
}
|
|
}
|
|
+ iob = (*iob).entries.sle_next;
|
|
}
|
|
debug_return!();
|
|
}
|
|
@@ -2833,6 +2838,7 @@ unsafe extern "C" fn del_io_events(mut nonblocking: bool) {
|
|
}
|
|
}
|
|
}
|
|
+ iob = (*iob).entries.sle_next;
|
|
}
|
|
sudo_debug_printf!(
|
|
SUDO_DEBUG_INFO,
|
|
@@ -2857,6 +2863,7 @@ unsafe extern "C" fn del_io_events(mut nonblocking: bool) {
|
|
);
|
|
}
|
|
}
|
|
+ iob = (*iob).entries.sle_next;
|
|
}
|
|
}
|
|
|
|
@@ -2977,3 +2984,4 @@ unsafe extern "C" fn safe_close(mut fd: libc::c_int) -> libc::c_int {
|
|
);
|
|
debug_return_int!(close(fd));
|
|
}
|
|
+
|
|
--
|
|
2.43.0
|
|
|