cheetah 0.5.0 → 0.5.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 4af5244a54ce65d8ca375a0fd9b868db3cddbaa2
4
- data.tar.gz: fd2c672c6ee3a7b19802004b127e26e0f08747f3
2
+ SHA256:
3
+ metadata.gz: d3e79228df3ba4822704c7f3e81fe0fdbec93a7a36f7935d2b117380470be1ed
4
+ data.tar.gz: f398f8b357f85c2c7cf8f08a790bb77f586e1d251eba4eea0d97ea940e651517
5
5
  SHA512:
6
- metadata.gz: 843e3a2137117843ce28075d7278092fc682daa1b01860283aaa2504810b725e36b0a35e342b4f14ebcf4bac09757a0f54dcafe2c7f7057fb57f9310113b80bc
7
- data.tar.gz: c51c8b5c470afb34ee59e58ca715515f533aad699ab8dab0ad1e416a71b36a4ed53e01b642e67b4dc778254ceb4be9cdde62d5e82614ba63ffbdbd5c8a72fdcc
6
+ metadata.gz: 06fbed837fee79bbf04be03355c8c339df1ffdf9d3f005743f6bcc7896a2c4a604a53f723e8cc2f95e6d07db4cd0b6ca105272ab0ac870b6d37d21baa15d4a38
7
+ data.tar.gz: 1ef2088f550bf7d7bf4c3ea7369fdef6ea3e9a49b36d5f5666f6ddcf449663e484073eb85a47f47f9e5d14b89ba6da13ac7b0065852884fb7fcc7f848f631d11
data/CHANGELOG CHANGED
@@ -1,3 +1,11 @@
1
+ 0.5.1 (2019-10-16)
2
+ ------------------
3
+
4
+ * Implement closing open fds after call to fork (bsc#1151960). This will work
5
+ only in linux system with mounted /proc. For other Unixes it works as before.
6
+ * drop support for ruby that is EOL (2.3 and lower)
7
+ * Added support for ruby 2.4, 2.5, 2.6
8
+
1
9
  0.5.0 (2015-12-18)
2
10
  ------------------
3
11
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.5.0
1
+ 0.5.1
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "abstract_method"
2
4
  require "logger"
3
5
  require "shellwords"
@@ -142,16 +144,16 @@ module Cheetah
142
144
  class DefaultRecorder < Recorder
143
145
  # @private
144
146
  STREAM_INFO = {
145
- stdin: { name: "Standard input", method: :info },
147
+ stdin: { name: "Standard input", method: :info },
146
148
  stdout: { name: "Standard output", method: :info },
147
149
  stderr: { name: "Error output", method: :error }
148
- }
150
+ }.freeze
149
151
 
150
152
  def initialize(logger)
151
153
  @logger = logger
152
154
 
153
155
  @stream_used = { stdin: false, stdout: false, stderr: false }
154
- @stream_buffer = { stdin: "", stdout: "", stderr: "" }
156
+ @stream_buffer = { stdin: +"", stdout: +"", stderr: +"" }
155
157
  end
156
158
 
157
159
  def record_commands(commands)
@@ -212,13 +214,13 @@ module Cheetah
212
214
 
213
215
  # @private
214
216
  BUILTIN_DEFAULT_OPTIONS = {
215
- stdin: "",
217
+ stdin: "",
216
218
  stdout: nil,
217
219
  stderr: nil,
218
220
  logger: nil,
219
- env: {},
221
+ env: {},
220
222
  chroot: "/"
221
- }
223
+ }.freeze
222
224
 
223
225
  READ = 0 # @private
224
226
  WRITE = 1 # @private
@@ -426,7 +428,7 @@ module Cheetah
426
428
  # and nil is an IO-like object. We avoid detecting it directly to allow
427
429
  # passing StringIO, mocks, etc.
428
430
  {
429
- stdin: !options[:stdin].is_a?(String),
431
+ stdin: !options[:stdin].is_a?(String),
430
432
  stdout: ![nil, :capture].include?(options[:stdout]),
431
433
  stderr: ![nil, :capture].include?(options[:stderr])
432
434
  }
@@ -434,9 +436,9 @@ module Cheetah
434
436
 
435
437
  def build_streams(options, streamed)
436
438
  {
437
- stdin: streamed[:stdin] ? options[:stdin] : StringIO.new(options[:stdin]),
438
- stdout: streamed[:stdout] ? options[:stdout] : StringIO.new(""),
439
- stderr: streamed[:stderr] ? options[:stderr] : StringIO.new("")
439
+ stdin: streamed[:stdin] ? options[:stdin] : StringIO.new(options[:stdin]),
440
+ stdout: streamed[:stdout] ? options[:stdout] : StringIO.new(+""),
441
+ stderr: streamed[:stderr] ? options[:stderr] : StringIO.new(+"")
440
442
  }
441
443
  end
442
444
 
@@ -494,7 +496,7 @@ module Cheetah
494
496
  return options if [nil, "/"].include?(options[:chroot])
495
497
 
496
498
  options = options.dup
497
- # delete chroot option otherwise in pipe will chroot each fork recursivelly
499
+ # delete chroot option otherwise in pipe will chroot each fork recursively
498
500
  root = options.delete(:chroot)
499
501
  Dir.chroot(root)
500
502
  # curdir can be outside chroot which is considered as security problem
@@ -520,8 +522,7 @@ module Cheetah
520
522
  stdout: pipe_to_child,
521
523
  stderr: pipes[:stderr]
522
524
  },
523
- options
524
- )
525
+ options)
525
526
 
526
527
  pipes[:stdin][READ].close
527
528
  pipes[:stdin][WRITE].close
@@ -532,9 +533,7 @@ module Cheetah
532
533
  into_pipe(STDOUT, pipes[:stdout])
533
534
  into_pipe(STDERR, pipes[:stderr])
534
535
 
535
- # All file descriptors from 3 above should be closed here, but since I
536
- # don't know about any way how to detect the maximum file descriptor
537
- # number portably in Ruby, I didn't implement it. Patches welcome.
536
+ close_fds
538
537
 
539
538
  command, *args = commands.last
540
539
  with_env(options[:env]) do
@@ -550,6 +549,27 @@ module Cheetah
550
549
  end
551
550
  end
552
551
 
552
+ # closes all open fds starting with 3 and above
553
+ def close_fds
554
+ # note: this will work only if unix has /proc filesystem. If it does not
555
+ # have it, it won't close other fds.
556
+ Dir.glob("/proc/self/fd/*").each do |path|
557
+ fd = File.basename(path).to_i
558
+ next if (0..2).include?(fd)
559
+
560
+ # here we intentionally ignore some failures when fd close failed
561
+ # rubocop:disable Lint/HandleExceptions
562
+ begin
563
+ IO.new(fd).close
564
+ # Ruby reserves some fds for its VM and it result in this exception
565
+ rescue ArgumentError
566
+ # Ignore if close failed with invalid FD
567
+ rescue Errno::EBADF
568
+ end
569
+ # rubocop:enable Lint/HandleExceptions
570
+ end
571
+ end
572
+
553
573
  def fork_commands(commands, options)
554
574
  pipes = { stdin: IO.pipe, stdout: IO.pipe, stderr: IO.pipe }
555
575
 
@@ -595,9 +615,7 @@ module Cheetah
595
615
  ios_read, ios_write, ios_error = select(pipes_readable, pipes_writable,
596
616
  pipes_readable + pipes_writable)
597
617
 
598
- if !ios_error.empty?
599
- raise IOError, "Error when communicating with executed program."
600
- end
618
+ raise IOError, "Error when communicating with executed program." if !ios_error.empty?
601
619
 
602
620
  ios_read.each do |pipe|
603
621
  begin
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # Cheetah namespace
2
4
  module Cheetah
3
5
  # Cheetah version (uses [semantic versioning](http://semver.org/)).
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cheetah
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
4
+ version: 0.5.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Majda
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-12-18 00:00:00.000000000 Z
11
+ date: 2019-10-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: abstract_method
@@ -42,16 +42,16 @@ dependencies:
42
42
  name: yard
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - "~>"
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
- version: '0'
47
+ version: 0.9.11
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - "~>"
52
+ - - ">="
53
53
  - !ruby/object:Gem::Version
54
- version: '0'
54
+ version: 0.9.11
55
55
  description: Your swiss army knife for executing external commands in Ruby safely
56
56
  and conveniently.
57
57
  email: dmajda@suse.de
@@ -84,11 +84,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
84
84
  - !ruby/object:Gem::Version
85
85
  version: '0'
86
86
  requirements: []
87
- rubyforge_project:
88
- rubygems_version: 2.4.5.1
87
+ rubygems_version: 3.0.3
89
88
  signing_key:
90
89
  specification_version: 4
91
90
  summary: Your swiss army knife for executing external commands in Ruby safely and
92
91
  conveniently.
93
92
  test_files: []
94
- has_rdoc: