Implements the readline workaround, tested with regular and meterpreter sessions

git-svn-id: file:///home/svn/framework3/trunk@5544 4d416f70-5f16-0410-b530-b9f4589650da
unstable
HD Moore 2008-06-27 20:51:36 +00:00
parent f056b9437f
commit 380aba15b0
2 changed files with 15 additions and 15 deletions

View File

@ -736,7 +736,7 @@ class Core
self.active_session = session
session.interact(driver.input.dup, driver.output)
self.active_session = nil
if (driver.input.supports_readline)
@ -756,7 +756,9 @@ class Core
rescue IOError, EOFError, Rex::StreamClosedError
print_status("Session stream closed.")
rescue
rescue ::Interrupt
raise $!
rescue ::Exception
log_error("Session manipulation failed: #{$!} #{$!.backtrace.inspect}")
end

View File

@ -37,12 +37,16 @@ begin
def child_readline(wtr, prompt, history)
$0 = "<readline>"
line = ::Readline.readline(prompt, history)
line = "\n" if (line and line.strip.length == 0)
wtr.write(line || "exit\n")
wtr.flush
wtr.close
exit(0)
# Self-destruct mechanism activated
Process.kill(9, $$)
end
#
@ -57,7 +61,6 @@ begin
#
def sysread(len = 1)
$stdin.sysread(len)
end
#
@ -75,19 +78,15 @@ begin
#
def pgets
# if(Rex::Compat.is_windows())
if(true)
if(Rex::Compat.is_windows())
output.prompting
line = ::Readline.readline(prompt, true)
HISTORY.pop if (line and line.empty?)
return line
end
# Wrap readline in a child process and secure with a mutex
# This prevents threading hangs in the calling process.
require "thread"
@@child_mutex ||= Mutex.new
@@child_mutex.synchronize do
line = ""
output.prompting
@ -111,16 +110,15 @@ begin
::Process.waitpid(pid, 0)
# Parse the results
if line
HISTORY.push(line) if (not line.empty?)
return line + "\n"
else
eof = true
return line
end
# Release the readline mutex
end
end
end
#