Skip to content

Commit 43d1a51

Browse files
committed
better handling of prefix injection
1 parent 311f023 commit 43d1a51

File tree

1 file changed

+15
-4
lines changed

1 file changed

+15
-4
lines changed

lib/foreman/engine.rb

+15-4
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ def initialize(options={})
3636
@env = {}
3737
@mutex = Mutex.new
3838
@names = {}
39+
@prefixed = {}
3940
@processes = []
4041
@running = {}
4142
@readers = {}
@@ -378,6 +379,7 @@ def spawn_processes
378379
writer.puts "unknown command: #{process.command}"
379380
end
380381
@buffers[reader] = Buffer.new
382+
@prefixed[reader] = false
381383
@running[pid] = [process, n]
382384
@readers[pid] = reader
383385
end
@@ -414,22 +416,26 @@ def handle_io(readers)
414416
def handle_io_interactive(reader)
415417
done = false
416418
name = name_for(@readers.invert[reader])
417-
418-
output_partial prefix(name)
419+
indent = prefix(name).gsub(ANSI_TOKEN, "").length
419420

420421
loop do
421422
@buffers[reader].write(reader.read_nonblock(10))
422423

423424
@buffers[reader].each_token do |token|
424425
case token
425426
when /^\e\[(\d+)G$/
426-
output_partial "\e[#{::Regexp.last_match(1).to_i + prefix(name).gsub(ANSI_TOKEN, "").length}G"
427+
output_partial "\e[#{Regexp.last_match(1).to_i + indent}G"
427428
when ANSI_TOKEN
428429
output_partial token
429430
when "\n"
430431
output_partial token
431-
output_partial prefix(name)
432+
@prefixed[reader] = false
432433
else
434+
unless @prefixed[reader]
435+
output_partial "\e[1G"
436+
output_partial prefix(name)
437+
@prefixed[reader] = true
438+
end
433439
output_partial token
434440
end
435441
done = (token == "\n")
@@ -450,6 +456,11 @@ def handle_io_noninteractive(reader)
450456
end
451457
end
452458

459+
def output_prefix(reader)
460+
output_partial prefix(name_for(@readers.invert[reader]))
461+
@prefixed[reader] = true
462+
end
463+
453464
def watch_for_output
454465
Thread.new do
455466
begin

0 commit comments

Comments
 (0)