exec_sandbox 0.2.3 → 0.2.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/Gemfile +8 -10
- data/Gemfile.lock +63 -30
- data/VERSION +1 -1
- data/exec_sandbox.gemspec +20 -22
- data/lib/exec_sandbox/sandbox.rb +1 -1
- data/lib/exec_sandbox/spawn.rb +35 -21
- data/lib/exec_sandbox/wait4.rb +6 -6
- data/spec/exec_sandbox/sandbox_spec.rb +43 -44
- data/spec/exec_sandbox/spawn_spec.rb +22 -22
- metadata +66 -58
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: a5ba917057f393e64b4b5543f35e9373beeb5bc0
|
4
|
+
data.tar.gz: ac8bd31a735584032a8801cb015a27affd5c0bdb
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 701e43695402f05185797c24998571bebd1ee687d707521a5071cea29f07e7a2fcb555e8fea2948121f2a8582d236443845d8839f1c0a09df823b7b21bdf0ac4
|
7
|
+
data.tar.gz: c8d0d3211d76cd99fcd7165ec984aee35eb5946b42e1030b0faa10eb3663fa07c78b4de88343f710f167264839e4980abedb6dda8c4a8cdc7dade2d88d8b8f78
|
data/Gemfile
CHANGED
@@ -1,18 +1,16 @@
|
|
1
|
-
source
|
1
|
+
source 'https://rubygems.org'
|
2
|
+
|
2
3
|
# Add dependencies required to use your gem here.
|
3
|
-
|
4
|
-
# gem 'activesupport', '>= 2.3.5'
|
5
|
-
gem 'ffi', '>= 1.0.11'
|
4
|
+
gem 'ffi', '>= 1.9.3'
|
6
5
|
|
7
6
|
# Add dependencies to develop your gem here.
|
8
7
|
# Include everything needed to run rake, tests, features, etc.
|
9
8
|
group :development do
|
10
9
|
gem 'rdoc', '>= 3.10'
|
11
|
-
gem 'rspec', '>= 2.
|
12
|
-
gem 'yard', '>= 0.7.
|
10
|
+
gem 'rspec', '>= 2.14.1'
|
11
|
+
gem 'yard', '>= 0.8.7.3'
|
13
12
|
gem 'yard-rspec', '>= 0.1'
|
14
|
-
gem 'bundler', '>= 1.
|
15
|
-
gem 'jeweler', '>=
|
16
|
-
gem '
|
17
|
-
gem 'simplecov', '>= 0', :platform => [:mri_19]
|
13
|
+
gem 'bundler', '>= 1.3.5'
|
14
|
+
gem 'jeweler', '>= 2.0.1'
|
15
|
+
gem 'simplecov', '>= 0', :platform => :mri
|
18
16
|
end
|
data/Gemfile.lock
CHANGED
@@ -1,33 +1,67 @@
|
|
1
1
|
GEM
|
2
|
-
remote:
|
2
|
+
remote: https://rubygems.org/
|
3
3
|
specs:
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
4
|
+
addressable (2.3.5)
|
5
|
+
builder (3.2.2)
|
6
|
+
descendants_tracker (0.0.3)
|
7
|
+
diff-lcs (1.2.5)
|
8
|
+
docile (1.1.3)
|
9
|
+
faraday (0.9.0)
|
10
|
+
multipart-post (>= 1.2, < 3)
|
11
|
+
ffi (1.9.3)
|
12
|
+
git (1.2.6)
|
13
|
+
github_api (0.11.2)
|
14
|
+
addressable (~> 2.3)
|
15
|
+
descendants_tracker (~> 0.0.1)
|
16
|
+
faraday (~> 0.8, < 0.10)
|
17
|
+
hashie (>= 1.2)
|
18
|
+
multi_json (>= 1.7.5, < 2.0)
|
19
|
+
nokogiri (~> 1.6.0)
|
20
|
+
oauth2
|
21
|
+
hashie (2.0.5)
|
22
|
+
highline (1.6.20)
|
23
|
+
jeweler (2.0.1)
|
24
|
+
builder
|
25
|
+
bundler (>= 1.0)
|
9
26
|
git (>= 1.2.5)
|
27
|
+
github_api
|
28
|
+
highline (>= 1.6.15)
|
29
|
+
nokogiri (>= 1.5.10)
|
10
30
|
rake
|
11
31
|
rdoc
|
12
|
-
json (1.
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
32
|
+
json (1.8.1)
|
33
|
+
jwt (0.1.11)
|
34
|
+
multi_json (>= 1.5)
|
35
|
+
mini_portile (0.5.2)
|
36
|
+
multi_json (1.8.4)
|
37
|
+
multi_xml (0.5.5)
|
38
|
+
multipart-post (2.0.0)
|
39
|
+
nokogiri (1.6.1)
|
40
|
+
mini_portile (~> 0.5.0)
|
41
|
+
oauth2 (0.9.3)
|
42
|
+
faraday (>= 0.8, < 0.10)
|
43
|
+
jwt (~> 0.1.8)
|
44
|
+
multi_json (~> 1.3)
|
45
|
+
multi_xml (~> 0.5)
|
46
|
+
rack (~> 1.2)
|
47
|
+
rack (1.5.2)
|
48
|
+
rake (10.1.1)
|
49
|
+
rdoc (4.1.1)
|
17
50
|
json (~> 1.4)
|
18
|
-
rspec (2.
|
19
|
-
rspec-core (~> 2.
|
20
|
-
rspec-expectations (~> 2.
|
21
|
-
rspec-mocks (~> 2.
|
22
|
-
rspec-core (2.
|
23
|
-
rspec-expectations (2.
|
24
|
-
diff-lcs (
|
25
|
-
rspec-mocks (2.
|
26
|
-
simplecov (0.
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
51
|
+
rspec (2.14.1)
|
52
|
+
rspec-core (~> 2.14.0)
|
53
|
+
rspec-expectations (~> 2.14.0)
|
54
|
+
rspec-mocks (~> 2.14.0)
|
55
|
+
rspec-core (2.14.7)
|
56
|
+
rspec-expectations (2.14.5)
|
57
|
+
diff-lcs (>= 1.1.3, < 2.0)
|
58
|
+
rspec-mocks (2.14.5)
|
59
|
+
simplecov (0.8.2)
|
60
|
+
docile (~> 1.1.0)
|
61
|
+
multi_json
|
62
|
+
simplecov-html (~> 0.8.0)
|
63
|
+
simplecov-html (0.8.0)
|
64
|
+
yard (0.8.7.3)
|
31
65
|
yard-rspec (0.1)
|
32
66
|
yard
|
33
67
|
|
@@ -35,12 +69,11 @@ PLATFORMS
|
|
35
69
|
ruby
|
36
70
|
|
37
71
|
DEPENDENCIES
|
38
|
-
bundler (>= 1.
|
39
|
-
ffi (>= 1.
|
40
|
-
jeweler (>=
|
41
|
-
rcov
|
72
|
+
bundler (>= 1.3.5)
|
73
|
+
ffi (>= 1.9.3)
|
74
|
+
jeweler (>= 2.0.1)
|
42
75
|
rdoc (>= 3.10)
|
43
|
-
rspec (>= 2.
|
76
|
+
rspec (>= 2.14.1)
|
44
77
|
simplecov
|
45
|
-
yard (>= 0.7.
|
78
|
+
yard (>= 0.8.7.3)
|
46
79
|
yard-rspec (>= 0.1)
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.2.
|
1
|
+
0.2.4
|
data/exec_sandbox.gemspec
CHANGED
@@ -2,14 +2,15 @@
|
|
2
2
|
# DO NOT EDIT THIS FILE DIRECTLY
|
3
3
|
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
|
+
# stub: exec_sandbox 0.2.4 ruby lib
|
5
6
|
|
6
7
|
Gem::Specification.new do |s|
|
7
8
|
s.name = "exec_sandbox"
|
8
|
-
s.version = "0.2.
|
9
|
+
s.version = "0.2.4"
|
9
10
|
|
10
11
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
12
|
s.authors = ["Victor Costan"]
|
12
|
-
s.date = "
|
13
|
+
s.date = "2014-02-05"
|
13
14
|
s.description = "Temporary users and groups, rlimits"
|
14
15
|
s.email = "costan@gmail.com"
|
15
16
|
s.extra_rdoc_files = [
|
@@ -50,42 +51,39 @@ Gem::Specification.new do |s|
|
|
50
51
|
s.homepage = "http://github.com/pwnall/exec_sandbox"
|
51
52
|
s.licenses = ["MIT"]
|
52
53
|
s.require_paths = ["lib"]
|
53
|
-
s.rubygems_version = "1.
|
54
|
+
s.rubygems_version = "2.1.11"
|
54
55
|
s.summary = "Run foreign binaries using POSIX sandboxing features"
|
55
56
|
|
56
57
|
if s.respond_to? :specification_version then
|
57
|
-
s.specification_version =
|
58
|
+
s.specification_version = 4
|
58
59
|
|
59
60
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
60
|
-
s.add_runtime_dependency(%q<ffi>, [">= 1.
|
61
|
+
s.add_runtime_dependency(%q<ffi>, [">= 1.9.3"])
|
61
62
|
s.add_development_dependency(%q<rdoc>, [">= 3.10"])
|
62
|
-
s.add_development_dependency(%q<rspec>, [">= 2.
|
63
|
-
s.add_development_dependency(%q<yard>, [">= 0.7.
|
63
|
+
s.add_development_dependency(%q<rspec>, [">= 2.14.1"])
|
64
|
+
s.add_development_dependency(%q<yard>, [">= 0.8.7.3"])
|
64
65
|
s.add_development_dependency(%q<yard-rspec>, [">= 0.1"])
|
65
|
-
s.add_development_dependency(%q<bundler>, [">= 1.
|
66
|
-
s.add_development_dependency(%q<jeweler>, [">=
|
67
|
-
s.add_development_dependency(%q<rcov>, [">= 0"])
|
66
|
+
s.add_development_dependency(%q<bundler>, [">= 1.3.5"])
|
67
|
+
s.add_development_dependency(%q<jeweler>, [">= 2.0.1"])
|
68
68
|
s.add_development_dependency(%q<simplecov>, [">= 0"])
|
69
69
|
else
|
70
|
-
s.add_dependency(%q<ffi>, [">= 1.
|
70
|
+
s.add_dependency(%q<ffi>, [">= 1.9.3"])
|
71
71
|
s.add_dependency(%q<rdoc>, [">= 3.10"])
|
72
|
-
s.add_dependency(%q<rspec>, [">= 2.
|
73
|
-
s.add_dependency(%q<yard>, [">= 0.7.
|
72
|
+
s.add_dependency(%q<rspec>, [">= 2.14.1"])
|
73
|
+
s.add_dependency(%q<yard>, [">= 0.8.7.3"])
|
74
74
|
s.add_dependency(%q<yard-rspec>, [">= 0.1"])
|
75
|
-
s.add_dependency(%q<bundler>, [">= 1.
|
76
|
-
s.add_dependency(%q<jeweler>, [">=
|
77
|
-
s.add_dependency(%q<rcov>, [">= 0"])
|
75
|
+
s.add_dependency(%q<bundler>, [">= 1.3.5"])
|
76
|
+
s.add_dependency(%q<jeweler>, [">= 2.0.1"])
|
78
77
|
s.add_dependency(%q<simplecov>, [">= 0"])
|
79
78
|
end
|
80
79
|
else
|
81
|
-
s.add_dependency(%q<ffi>, [">= 1.
|
80
|
+
s.add_dependency(%q<ffi>, [">= 1.9.3"])
|
82
81
|
s.add_dependency(%q<rdoc>, [">= 3.10"])
|
83
|
-
s.add_dependency(%q<rspec>, [">= 2.
|
84
|
-
s.add_dependency(%q<yard>, [">= 0.7.
|
82
|
+
s.add_dependency(%q<rspec>, [">= 2.14.1"])
|
83
|
+
s.add_dependency(%q<yard>, [">= 0.8.7.3"])
|
85
84
|
s.add_dependency(%q<yard-rspec>, [">= 0.1"])
|
86
|
-
s.add_dependency(%q<bundler>, [">= 1.
|
87
|
-
s.add_dependency(%q<jeweler>, [">=
|
88
|
-
s.add_dependency(%q<rcov>, [">= 0"])
|
85
|
+
s.add_dependency(%q<bundler>, [">= 1.3.5"])
|
86
|
+
s.add_dependency(%q<jeweler>, [">= 2.0.1"])
|
89
87
|
s.add_dependency(%q<simplecov>, [">= 0"])
|
90
88
|
end
|
91
89
|
end
|
data/lib/exec_sandbox/sandbox.rb
CHANGED
@@ -26,7 +26,7 @@ class Sandbox
|
|
26
26
|
@destroyed = false
|
27
27
|
|
28
28
|
# principal argument for Spawn.spawn()
|
29
|
-
@principal = { :
|
29
|
+
@principal = { uid: @user_uid, gid: @user_gid, dir: @path }
|
30
30
|
end
|
31
31
|
|
32
32
|
# Copies a file or directory to the sandbox.
|
data/lib/exec_sandbox/spawn.rb
CHANGED
@@ -7,7 +7,7 @@ module Spawn
|
|
7
7
|
#
|
8
8
|
# @param [String, Array] command the command to be executed via exec
|
9
9
|
# @param [Hash] io see limit_io
|
10
|
-
# @param [Hash] principal the principal for the
|
10
|
+
# @param [Hash] principal the principal for the new process
|
11
11
|
# @param [Hash] resources see limit_resources
|
12
12
|
# @return [Fixnum] the child's PID
|
13
13
|
def self.spawn(command, io = {}, principal = {}, resources = {})
|
@@ -40,10 +40,10 @@ module Spawn
|
|
40
40
|
redirects << [k, redirects.length, v]
|
41
41
|
end
|
42
42
|
end
|
43
|
-
|
43
|
+
|
44
44
|
# Perform the redirections.
|
45
45
|
redirects.sort!
|
46
|
-
redirects.each do |fd_num, _, target|
|
46
|
+
redirects.each do |fd_num, _, target|
|
47
47
|
if target.respond_to?(:fileno)
|
48
48
|
# IO stream.
|
49
49
|
if target.fileno != fd_num
|
@@ -60,26 +60,18 @@ module Spawn
|
|
60
60
|
end
|
61
61
|
end
|
62
62
|
end
|
63
|
-
|
63
|
+
|
64
64
|
# Close all file descriptors not in the redirection table.
|
65
65
|
redirected_fds = Set.new redirects.map(&:first)
|
66
66
|
max_fd = LibC.getdtablesize
|
67
67
|
0.upto(max_fd) do |fd|
|
68
68
|
next if redirected_fds.include?(fd)
|
69
|
-
|
70
|
-
|
71
|
-
# only running it on buggy MRIs
|
72
|
-
begin
|
73
|
-
# This fails if rb_reserved_fd_p returns 0.
|
74
|
-
# In that case, we shouldn't close the FD, otherwise the VM will crash.
|
75
|
-
IO.new(fd)
|
76
|
-
rescue ArgumentError, Errno::EBADF
|
77
|
-
next
|
78
|
-
end
|
69
|
+
|
70
|
+
next if RubyVM.rb_reserved_fd_p(fd) != 0
|
79
71
|
LibC.close fd
|
80
72
|
end
|
81
73
|
end
|
82
|
-
|
74
|
+
|
83
75
|
# Sets the process' principal for access control.
|
84
76
|
#
|
85
77
|
# @param [Hash] principal information about the process' principal
|
@@ -88,7 +80,7 @@ module Spawn
|
|
88
80
|
# @option principal [Fixnum] :gid the new group ID
|
89
81
|
def self.set_principal(principal)
|
90
82
|
Dir.chdir principal[:dir] if principal[:dir]
|
91
|
-
|
83
|
+
|
92
84
|
if principal[:gid]
|
93
85
|
begin
|
94
86
|
Process::Sys.setresgid principal[:gid], principal[:gid], principal[:gid]
|
@@ -102,7 +94,7 @@ module Spawn
|
|
102
94
|
principal[:gid] || Process.gid
|
103
95
|
rescue NotImplementedError
|
104
96
|
end
|
105
|
-
|
97
|
+
|
106
98
|
begin
|
107
99
|
Process::Sys.setresuid principal[:uid], principal[:uid], principal[:uid]
|
108
100
|
rescue NotImplementedError
|
@@ -110,7 +102,7 @@ module Spawn
|
|
110
102
|
end
|
111
103
|
end
|
112
104
|
end
|
113
|
-
|
105
|
+
|
114
106
|
# Constrains the resource usage of the current process.
|
115
107
|
#
|
116
108
|
# @param [Hash{Symbol => Number}] limits the constraints to be applied
|
@@ -150,7 +142,7 @@ module Spawn
|
|
150
142
|
_setrlimit Process::RLIMIT_RSS, limits[:data]
|
151
143
|
end
|
152
144
|
end
|
153
|
-
|
145
|
+
|
154
146
|
# Wrapper for Process.setrlimit that eats exceptions.
|
155
147
|
def self._setrlimit(limit, value)
|
156
148
|
begin
|
@@ -159,7 +151,7 @@ module Spawn
|
|
159
151
|
# The call failed, probably because the limit is already lower than this.
|
160
152
|
end
|
161
153
|
end
|
162
|
-
|
154
|
+
|
163
155
|
# Maps raw I/O functions.
|
164
156
|
module LibC
|
165
157
|
extend FFI::Library
|
@@ -168,6 +160,28 @@ module Spawn
|
|
168
160
|
attach_function :getdtablesize, [], :int
|
169
161
|
attach_function :dup2, [:int, :int], :int
|
170
162
|
end # module ExecSandbox::Spawn::Libc
|
163
|
+
|
164
|
+
# Maps an internal MRI function that we need.
|
165
|
+
module RubyVM
|
166
|
+
extend FFI::Library
|
167
|
+
ffi_lib RbConfig::CONFIG['LIBRUBY']
|
168
|
+
begin
|
169
|
+
attach_function :rb_reserved_fd_p, [:int], :int
|
170
|
+
rescue FFI::NotFoundError
|
171
|
+
# Emulation of internal MRI function.
|
172
|
+
#
|
173
|
+
# This is a fallback, used in case FFI can't find the MRI function.
|
174
|
+
def self.rb_reserved_fd_p(fd)
|
175
|
+
begin
|
176
|
+
# This fails if rb_reserved_fd_p returns a non-zero value.
|
177
|
+
IO.new fd
|
178
|
+
return 0
|
179
|
+
rescue ArgumentError, Errno::EBADF
|
180
|
+
return 1
|
181
|
+
end
|
182
|
+
end
|
183
|
+
end
|
184
|
+
end
|
171
185
|
end # module ExecSandbox::Spawn
|
172
|
-
|
186
|
+
|
173
187
|
end # namespace ExecSandbox
|
data/lib/exec_sandbox/wait4.rb
CHANGED
@@ -13,15 +13,15 @@ module Wait4
|
|
13
13
|
rusage = ExecSandbox::Wait4::Rusage.new
|
14
14
|
returned_pid = LibC.wait4(pid, status_ptr, 0, rusage.pointer)
|
15
15
|
raise SystemCallError, FFI.errno if returned_pid < 0
|
16
|
-
status = { :
|
16
|
+
status = { bits: status_ptr.read_int }
|
17
17
|
status_ptr.free
|
18
|
-
|
18
|
+
|
19
19
|
signal_code = status[:bits] & 0x7f
|
20
20
|
status[:exit_code] = (signal_code != 0) ? -signal_code : status[:bits] >> 8
|
21
21
|
status[:user_time] = rusage[:ru_utime_sec] +
|
22
22
|
rusage[:ru_utime_usec] * 0.000_001
|
23
23
|
status[:system_time] = rusage[:ru_stime_sec] +
|
24
|
-
rusage[:ru_stime_usec] * 0.000_001
|
24
|
+
rusage[:ru_stime_usec] * 0.000_001
|
25
25
|
status[:rss] = rusage[:ru_maxrss] / 1024.0
|
26
26
|
return status
|
27
27
|
end
|
@@ -31,9 +31,9 @@ module Wait4
|
|
31
31
|
extend FFI::Library
|
32
32
|
ffi_lib FFI::Library::LIBC
|
33
33
|
attach_function :wait4, [:int, :pointer, :int, :pointer], :int,
|
34
|
-
:
|
34
|
+
blocking: true
|
35
35
|
end # module ExecSandbox::Wait4::Libc
|
36
|
-
|
36
|
+
|
37
37
|
# Maps struct rusage in sys/resource.h, used by wait4.
|
38
38
|
class Rusage < FFI::Struct
|
39
39
|
# Total amount of user time used.
|
@@ -81,5 +81,5 @@ module Wait4
|
|
81
81
|
end # struct ExecSandbox::Wait4::Rusage
|
82
82
|
|
83
83
|
end # module ExecSandbox::Wait4
|
84
|
-
|
84
|
+
|
85
85
|
end # namespace ExecSandbox
|
@@ -1,6 +1,6 @@
|
|
1
1
|
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
2
|
|
3
|
-
describe ExecSandbox::Sandbox do
|
3
|
+
describe ExecSandbox::Sandbox do
|
4
4
|
describe 'IO redirection' do
|
5
5
|
before do
|
6
6
|
@temp_in = Tempfile.new 'exec_sandbox_rspec'
|
@@ -17,55 +17,55 @@ describe ExecSandbox::Sandbox do
|
|
17
17
|
describe 'duplicate.rb' do
|
18
18
|
before do
|
19
19
|
ExecSandbox.use do |s|
|
20
|
-
@result = s.run bin_fixture(:duplicate), :
|
21
|
-
:
|
20
|
+
@result = s.run bin_fixture(:duplicate), in: @temp_in.path,
|
21
|
+
out: @temp_out.path
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
25
25
|
it 'should not crash' do
|
26
26
|
@result[:exit_code].should == 0
|
27
27
|
end
|
28
|
-
|
28
|
+
|
29
29
|
it 'should produce the correct result' do
|
30
|
-
File.read(@temp_out.path).should == "I/O test\nI/O test\n"
|
30
|
+
File.read(@temp_out.path).should == "I/O test\nI/O test\n"
|
31
31
|
end
|
32
32
|
end
|
33
33
|
|
34
34
|
describe 'count.rb' do
|
35
35
|
before do
|
36
36
|
ExecSandbox.use do |s|
|
37
|
-
@result = s.run [bin_fixture(:count), '9'], :
|
38
|
-
:
|
37
|
+
@result = s.run [bin_fixture(:count), '9'], in: @temp_in.path,
|
38
|
+
out: @temp_out.path, err: :out
|
39
39
|
end
|
40
40
|
end
|
41
|
-
|
41
|
+
|
42
42
|
it 'should not crash' do
|
43
43
|
@result[:exit_code].should == 0
|
44
44
|
end
|
45
|
-
|
45
|
+
|
46
46
|
it 'should produce the correct result' do
|
47
47
|
File.read(@temp_out.path).should == (1..9).map { |i| "#{i}\n" }.join('')
|
48
48
|
end
|
49
49
|
end
|
50
50
|
end
|
51
|
-
|
51
|
+
|
52
52
|
describe 'pipe redirection' do
|
53
53
|
describe 'duplicate.rb' do
|
54
54
|
before do
|
55
55
|
ExecSandbox.use do |s|
|
56
|
-
@result = s.run bin_fixture(:duplicate), :
|
56
|
+
@result = s.run bin_fixture(:duplicate), in_data: "Pipe test\n"
|
57
57
|
end
|
58
58
|
end
|
59
|
-
|
59
|
+
|
60
60
|
it 'should not crash' do
|
61
61
|
@result[:exit_code].should == 0
|
62
62
|
end
|
63
|
-
|
63
|
+
|
64
64
|
it 'should produce the correct result' do
|
65
65
|
@result[:out_data].should == "Pipe test\nPipe test\n"
|
66
66
|
end
|
67
67
|
end
|
68
|
-
|
68
|
+
|
69
69
|
describe 'buffer.rb' do
|
70
70
|
let(:buffer_size) { 1024 * 1024 }
|
71
71
|
before do
|
@@ -73,34 +73,34 @@ describe ExecSandbox::Sandbox do
|
|
73
73
|
@result = s.run [bin_fixture(:buffer), '', buffer_size.to_s]
|
74
74
|
end
|
75
75
|
end
|
76
|
-
|
76
|
+
|
77
77
|
it 'should not crash' do
|
78
78
|
@result[:exit_code].should == 0
|
79
79
|
end
|
80
|
-
|
80
|
+
|
81
81
|
it 'should produce the correct result' do
|
82
82
|
@result[:out_data].should == "S" * buffer_size
|
83
83
|
end
|
84
84
|
end
|
85
|
-
|
85
|
+
|
86
86
|
describe 'count.rb' do
|
87
87
|
before do
|
88
88
|
ExecSandbox.use do |s|
|
89
|
-
@result = s.run [bin_fixture(:count), '9'], :
|
89
|
+
@result = s.run [bin_fixture(:count), '9'], err: :out
|
90
90
|
end
|
91
91
|
end
|
92
|
-
|
92
|
+
|
93
93
|
it 'should not crash' do
|
94
94
|
@result[:exit_code].should == 0
|
95
95
|
end
|
96
|
-
|
96
|
+
|
97
97
|
it 'should produce the correct result' do
|
98
98
|
@result[:out_data].should == (1..9).map { |i| "#{i}\n" }.join('')
|
99
99
|
end
|
100
100
|
end
|
101
101
|
end
|
102
|
-
|
103
|
-
|
102
|
+
|
103
|
+
|
104
104
|
describe 'resource limitations' do
|
105
105
|
describe 'churn.rb' do
|
106
106
|
before do
|
@@ -110,7 +110,7 @@ describe ExecSandbox::Sandbox do
|
|
110
110
|
after do
|
111
111
|
@temp_out.unlink
|
112
112
|
end
|
113
|
-
|
113
|
+
|
114
114
|
describe 'without limitations' do
|
115
115
|
before do
|
116
116
|
ExecSandbox.use do |s|
|
@@ -118,44 +118,44 @@ describe ExecSandbox::Sandbox do
|
|
118
118
|
s.pull 'stdout', @temp_out.path
|
119
119
|
end
|
120
120
|
end
|
121
|
-
|
121
|
+
|
122
122
|
it 'should not crash' do
|
123
123
|
@result[:exit_code].should == 0
|
124
124
|
end
|
125
|
-
|
125
|
+
|
126
126
|
it 'should run for at least 2 seconds' do
|
127
127
|
(@result[:user_time] + @result[:system_time]).should > 2
|
128
128
|
end
|
129
|
-
|
129
|
+
|
130
130
|
it 'should output something' do
|
131
131
|
File.stat(@temp_out.path).size.should > 0
|
132
132
|
end
|
133
133
|
end
|
134
|
-
|
134
|
+
|
135
135
|
describe 'with CPU time limitation' do
|
136
136
|
before do
|
137
137
|
ExecSandbox.use do |s|
|
138
138
|
@result = s.run [bin_fixture(:churn), 'stdout', 3.to_s],
|
139
|
-
:
|
139
|
+
limits: {cpu: 1}
|
140
140
|
s.pull 'stdout', @temp_out.path
|
141
141
|
end
|
142
142
|
end
|
143
|
-
|
143
|
+
|
144
144
|
it 'should run for at least 0.5 seconds' do
|
145
145
|
(@result[:user_time] + @result[:system_time]).should >= 0.5
|
146
146
|
end
|
147
|
-
|
147
|
+
|
148
148
|
it 'should run for less than 2 seconds' do
|
149
149
|
(@result[:user_time] + @result[:system_time]).should < 2
|
150
150
|
end
|
151
|
-
|
151
|
+
|
152
152
|
it 'should not have a chance to output' do
|
153
153
|
File.stat(@temp_out.path).size.should == 0
|
154
154
|
end
|
155
155
|
end
|
156
156
|
end
|
157
157
|
end
|
158
|
-
|
158
|
+
|
159
159
|
describe '#push' do
|
160
160
|
let(:test_user) { Etc.getlogin }
|
161
161
|
let(:test_uid) { Etc.getpwnam(test_user).uid }
|
@@ -166,49 +166,48 @@ describe ExecSandbox::Sandbox do
|
|
166
166
|
@sandbox = ExecSandbox.open test_user
|
167
167
|
end
|
168
168
|
after do
|
169
|
-
@sandbox.close
|
169
|
+
@sandbox.close if @sandbox
|
170
170
|
end
|
171
|
-
|
171
|
+
|
172
172
|
describe 'a file' do
|
173
173
|
before do
|
174
174
|
@to = @sandbox.push __FILE__
|
175
175
|
end
|
176
|
-
|
176
|
+
|
177
177
|
it 'should copy straight to the sandbox directory' do
|
178
178
|
File.dirname(@to).should == @sandbox.path
|
179
179
|
end
|
180
|
-
|
180
|
+
|
181
181
|
it 'should use the same file name' do
|
182
|
-
File.basename(@to).should == 'sandbox_spec.rb'
|
182
|
+
File.basename(@to).should == 'sandbox_spec.rb'
|
183
183
|
end
|
184
|
-
|
184
|
+
|
185
185
|
it "should set the file's owner to the admin" do
|
186
186
|
File.stat(@to).uid.should == test_uid
|
187
187
|
end
|
188
|
-
|
188
|
+
|
189
189
|
it "should not set the file's group to the admin" do
|
190
190
|
File.stat(@to).gid.should_not == test_gid
|
191
191
|
end
|
192
192
|
end
|
193
193
|
end
|
194
|
-
|
194
|
+
|
195
195
|
describe '#cleanup' do
|
196
196
|
describe 'in a system with an open sandbox' do
|
197
197
|
before do
|
198
198
|
@all_users = ExecSandbox::Users.named(/.*/).sort
|
199
|
-
|
199
|
+
|
200
200
|
@sandbox = ExecSandbox.open
|
201
201
|
@removed = ExecSandbox::Sandbox.cleanup
|
202
202
|
end
|
203
|
-
|
203
|
+
|
204
204
|
it 'should not remove the sandbox user' do
|
205
205
|
ExecSandbox::Users.named(/.*/).sort.should == @all_users
|
206
206
|
end
|
207
|
-
|
207
|
+
|
208
208
|
it 'should return an array with the sandbox user' do
|
209
209
|
@removed.should == [@sandbox.user_name]
|
210
210
|
end
|
211
211
|
end
|
212
|
-
|
213
212
|
end
|
214
213
|
end
|
@@ -49,8 +49,8 @@ describe ExecSandbox::Spawn do
|
|
49
49
|
describe 'with paths' do
|
50
50
|
before do
|
51
51
|
pid = ExecSandbox::Spawn.spawn bin_fixture(:duplicate),
|
52
|
-
{:
|
53
|
-
:
|
52
|
+
{in: @temp_in.path, out: @temp_out.path,
|
53
|
+
err: @temp_out.path}
|
54
54
|
@status = ExecSandbox::Wait4.wait4 pid
|
55
55
|
end
|
56
56
|
|
@@ -62,7 +62,7 @@ describe ExecSandbox::Spawn do
|
|
62
62
|
File.open(@temp_in.path, 'r') do |in_io|
|
63
63
|
File.open(@temp_out.path, 'w') do |out_io|
|
64
64
|
pid = ExecSandbox::Spawn.spawn bin_fixture(:duplicate),
|
65
|
-
{:
|
65
|
+
{in: in_io, out: out_io, err: STDERR}
|
66
66
|
@status = ExecSandbox::Wait4.wait4 pid
|
67
67
|
end
|
68
68
|
end
|
@@ -74,7 +74,7 @@ describe ExecSandbox::Spawn do
|
|
74
74
|
describe 'without stdout' do
|
75
75
|
before do
|
76
76
|
pid = ExecSandbox::Spawn.spawn bin_fixture(:duplicate),
|
77
|
-
{:
|
77
|
+
{in: @temp_in.path}
|
78
78
|
@status = ExecSandbox::Wait4.wait4 pid
|
79
79
|
end
|
80
80
|
|
@@ -103,7 +103,7 @@ describe ExecSandbox::Spawn do
|
|
103
103
|
File.open(@temp_in.path, 'r') do |in_io|
|
104
104
|
File.open(@temp_out.path, 'w') do |out_io|
|
105
105
|
pid = ExecSandbox::Spawn.spawn [bin_fixture(:count), '9'],
|
106
|
-
{:
|
106
|
+
{in: in_io, out: out_io, err: STDOUT}
|
107
107
|
@status = ExecSandbox::Wait4.wait4 pid
|
108
108
|
end
|
109
109
|
end
|
@@ -126,8 +126,8 @@ describe ExecSandbox::Spawn do
|
|
126
126
|
describe 'with root credentials' do
|
127
127
|
before do
|
128
128
|
pid = ExecSandbox::Spawn.spawn [bin_fixture(:write_arg),
|
129
|
-
@temp_path, "Spawn uid test\n"], {:
|
130
|
-
{:
|
129
|
+
@temp_path, "Spawn uid test\n"], {err: STDERR},
|
130
|
+
{uid: 0, gid: 0}
|
131
131
|
@status = ExecSandbox::Wait4.wait4 pid
|
132
132
|
@fstat = File.stat(@temp_path)
|
133
133
|
end
|
@@ -152,8 +152,8 @@ describe ExecSandbox::Spawn do
|
|
152
152
|
before do
|
153
153
|
@temp.unlink
|
154
154
|
pid = ExecSandbox::Spawn.spawn [bin_fixture(:write_arg),
|
155
|
-
@temp_path, "Spawn uid test\n"], {:
|
156
|
-
{:
|
155
|
+
@temp_path, "Spawn uid test\n"], {err: STDERR},
|
156
|
+
{uid: test_uid, gid: test_gid}
|
157
157
|
@status = ExecSandbox::Wait4.wait4 pid
|
158
158
|
end
|
159
159
|
|
@@ -178,7 +178,7 @@ describe ExecSandbox::Spawn do
|
|
178
178
|
File.chmod 0700, @temp_path
|
179
179
|
pid = ExecSandbox::Spawn.spawn [bin_fixture(:write_arg),
|
180
180
|
@temp_path, "Spawn uid test\n"], {},
|
181
|
-
{:
|
181
|
+
{uid: test_uid, gid: test_gid}
|
182
182
|
@status = ExecSandbox::Wait4.wait4 pid
|
183
183
|
end
|
184
184
|
|
@@ -196,7 +196,7 @@ describe ExecSandbox::Spawn do
|
|
196
196
|
File.chmod 070, @temp_path
|
197
197
|
pid = ExecSandbox::Spawn.spawn [bin_fixture(:write_arg), @temp_path,
|
198
198
|
"Spawn uid test\n"], {},
|
199
|
-
{:
|
199
|
+
{uid: test_uid, gid: test_gid}
|
200
200
|
@status = ExecSandbox::Wait4.wait4 pid
|
201
201
|
end
|
202
202
|
|
@@ -213,7 +213,7 @@ describe ExecSandbox::Spawn do
|
|
213
213
|
before do
|
214
214
|
@temp_dir = Dir.mktmpdir 'exec_sandbox_rspec'
|
215
215
|
pid = ExecSandbox::Spawn.spawn [bin_fixture(:pwd), @temp_path],
|
216
|
-
{}, {:
|
216
|
+
{}, {dir: @temp_dir}
|
217
217
|
@status = ExecSandbox::Wait4.wait4 pid
|
218
218
|
end
|
219
219
|
after do
|
@@ -244,7 +244,7 @@ describe ExecSandbox::Spawn do
|
|
244
244
|
describe 'without limitations' do
|
245
245
|
before do
|
246
246
|
pid = ExecSandbox::Spawn.spawn [bin_fixture(:buffer), @temp_path,
|
247
|
-
(512 * 1024 * 1024).to_s], {:
|
247
|
+
(512 * 1024 * 1024).to_s], {err: STDERR}, {}, {}
|
248
248
|
@status = ExecSandbox::Wait4.wait4 pid
|
249
249
|
end
|
250
250
|
|
@@ -260,7 +260,7 @@ describe ExecSandbox::Spawn do
|
|
260
260
|
describe 'with 256mb memory limitation' do
|
261
261
|
before do
|
262
262
|
pid = ExecSandbox::Spawn.spawn [bin_fixture(:buffer), @temp_path,
|
263
|
-
(512 * 1024 * 1024).to_s], {}, {}, {:
|
263
|
+
(512 * 1024 * 1024).to_s], {}, {}, {data: 256 * 1024 * 1024}
|
264
264
|
@status = ExecSandbox::Wait4.wait4 pid
|
265
265
|
end
|
266
266
|
|
@@ -277,7 +277,7 @@ describe ExecSandbox::Spawn do
|
|
277
277
|
before do
|
278
278
|
pid = ExecSandbox::Spawn.spawn [bin_fixture(:buffer), @temp_path,
|
279
279
|
(512 * 1024 * 1024).to_s], {}, {},
|
280
|
-
{:
|
280
|
+
{file_size: 64 * 1024 * 1024}
|
281
281
|
@status = ExecSandbox::Wait4.wait4 pid
|
282
282
|
end
|
283
283
|
|
@@ -305,7 +305,7 @@ describe ExecSandbox::Spawn do
|
|
305
305
|
describe 'without limitations' do
|
306
306
|
before do
|
307
307
|
pid = ExecSandbox::Spawn.spawn [bin_fixture(:buffer), @temp_path,
|
308
|
-
(128 * 1024 * 1024).to_s], {:
|
308
|
+
(128 * 1024 * 1024).to_s], {err: STDERR}, {}, {}
|
309
309
|
@status = ExecSandbox::Wait4.wait4 pid
|
310
310
|
end
|
311
311
|
|
@@ -315,7 +315,7 @@ describe ExecSandbox::Spawn do
|
|
315
315
|
describe 'with 256mb memory limitation' do
|
316
316
|
before do
|
317
317
|
pid = ExecSandbox::Spawn.spawn [bin_fixture(:buffer), @temp_path,
|
318
|
-
(128 * 1024 * 1024).to_s], {}, {}, {:
|
318
|
+
(128 * 1024 * 1024).to_s], {}, {}, {data: 256 * 1024 * 1024}
|
319
319
|
@status = ExecSandbox::Wait4.wait4 pid
|
320
320
|
end
|
321
321
|
|
@@ -326,7 +326,7 @@ describe ExecSandbox::Spawn do
|
|
326
326
|
before do
|
327
327
|
pid = ExecSandbox::Spawn.spawn [bin_fixture(:buffer), @temp_path,
|
328
328
|
(128 * 1024 * 1024).to_s], {}, {},
|
329
|
-
{:
|
329
|
+
{file_size: 256 * 1024 * 1024}
|
330
330
|
@status = ExecSandbox::Wait4.wait4 pid
|
331
331
|
end
|
332
332
|
|
@@ -339,7 +339,7 @@ describe ExecSandbox::Spawn do
|
|
339
339
|
describe 'without limitations' do
|
340
340
|
before do
|
341
341
|
pid = ExecSandbox::Spawn.spawn [bin_fixture(:fork), @temp_path,
|
342
|
-
10.to_s], {:
|
342
|
+
10.to_s], {err: STDERR}, {}, {}
|
343
343
|
@status = ExecSandbox::Wait4.wait4 pid
|
344
344
|
end
|
345
345
|
|
@@ -355,7 +355,7 @@ describe ExecSandbox::Spawn do
|
|
355
355
|
describe 'with sub-process limitation' do
|
356
356
|
before do
|
357
357
|
pid = ExecSandbox::Spawn.spawn [bin_fixture(:fork), @temp_path,
|
358
|
-
10.to_s], {}, {}, {:
|
358
|
+
10.to_s], {}, {}, {processes: 4}
|
359
359
|
@status = ExecSandbox::Wait4.wait4 pid
|
360
360
|
end
|
361
361
|
|
@@ -373,7 +373,7 @@ describe ExecSandbox::Spawn do
|
|
373
373
|
describe 'without limitations' do
|
374
374
|
before do
|
375
375
|
pid = ExecSandbox::Spawn.spawn [bin_fixture(:churn), @temp_path,
|
376
|
-
3.to_s], {:
|
376
|
+
3.to_s], {err: STDERR}, {}, {}
|
377
377
|
@status = ExecSandbox::Wait4.wait4 pid
|
378
378
|
end
|
379
379
|
|
@@ -393,7 +393,7 @@ describe ExecSandbox::Spawn do
|
|
393
393
|
describe 'with CPU time limitation' do
|
394
394
|
before do
|
395
395
|
pid = ExecSandbox::Spawn.spawn [bin_fixture(:churn), @temp_path,
|
396
|
-
10.to_s], {}, {}, {:
|
396
|
+
10.to_s], {}, {}, {cpu: 1}
|
397
397
|
@status = ExecSandbox::Wait4.wait4 pid
|
398
398
|
end
|
399
399
|
|
metadata
CHANGED
@@ -1,115 +1,127 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: exec_sandbox
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
5
|
-
prerelease:
|
4
|
+
version: 0.2.4
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Victor Costan
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
11
|
+
date: 2014-02-05 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: ffi
|
16
|
-
requirement:
|
17
|
-
none: false
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
18
16
|
requirements:
|
19
|
-
- -
|
17
|
+
- - '>='
|
20
18
|
- !ruby/object:Gem::Version
|
21
|
-
version: 1.
|
19
|
+
version: 1.9.3
|
22
20
|
type: :runtime
|
23
21
|
prerelease: false
|
24
|
-
version_requirements:
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - '>='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 1.9.3
|
25
27
|
- !ruby/object:Gem::Dependency
|
26
28
|
name: rdoc
|
27
|
-
requirement:
|
28
|
-
none: false
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
29
30
|
requirements:
|
30
|
-
- -
|
31
|
+
- - '>='
|
31
32
|
- !ruby/object:Gem::Version
|
32
33
|
version: '3.10'
|
33
34
|
type: :development
|
34
35
|
prerelease: false
|
35
|
-
version_requirements:
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - '>='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '3.10'
|
36
41
|
- !ruby/object:Gem::Dependency
|
37
42
|
name: rspec
|
38
|
-
requirement:
|
39
|
-
none: false
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
40
44
|
requirements:
|
41
|
-
- -
|
45
|
+
- - '>='
|
42
46
|
- !ruby/object:Gem::Version
|
43
|
-
version: 2.
|
47
|
+
version: 2.14.1
|
44
48
|
type: :development
|
45
49
|
prerelease: false
|
46
|
-
version_requirements:
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 2.14.1
|
47
55
|
- !ruby/object:Gem::Dependency
|
48
56
|
name: yard
|
49
|
-
requirement:
|
50
|
-
none: false
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
51
58
|
requirements:
|
52
|
-
- -
|
59
|
+
- - '>='
|
53
60
|
- !ruby/object:Gem::Version
|
54
|
-
version: 0.7.
|
61
|
+
version: 0.8.7.3
|
55
62
|
type: :development
|
56
63
|
prerelease: false
|
57
|
-
version_requirements:
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - '>='
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 0.8.7.3
|
58
69
|
- !ruby/object:Gem::Dependency
|
59
70
|
name: yard-rspec
|
60
|
-
requirement:
|
61
|
-
none: false
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
62
72
|
requirements:
|
63
|
-
- -
|
73
|
+
- - '>='
|
64
74
|
- !ruby/object:Gem::Version
|
65
75
|
version: '0.1'
|
66
76
|
type: :development
|
67
77
|
prerelease: false
|
68
|
-
version_requirements:
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - '>='
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0.1'
|
69
83
|
- !ruby/object:Gem::Dependency
|
70
84
|
name: bundler
|
71
|
-
requirement:
|
72
|
-
none: false
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
73
86
|
requirements:
|
74
|
-
- -
|
87
|
+
- - '>='
|
75
88
|
- !ruby/object:Gem::Version
|
76
|
-
version: 1.
|
89
|
+
version: 1.3.5
|
77
90
|
type: :development
|
78
91
|
prerelease: false
|
79
|
-
version_requirements:
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - '>='
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: 1.3.5
|
80
97
|
- !ruby/object:Gem::Dependency
|
81
98
|
name: jeweler
|
82
|
-
requirement:
|
83
|
-
none: false
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
84
100
|
requirements:
|
85
|
-
- -
|
101
|
+
- - '>='
|
86
102
|
- !ruby/object:Gem::Version
|
87
|
-
version:
|
103
|
+
version: 2.0.1
|
88
104
|
type: :development
|
89
105
|
prerelease: false
|
90
|
-
version_requirements:
|
91
|
-
- !ruby/object:Gem::Dependency
|
92
|
-
name: rcov
|
93
|
-
requirement: &25119080 !ruby/object:Gem::Requirement
|
94
|
-
none: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
95
107
|
requirements:
|
96
|
-
- -
|
108
|
+
- - '>='
|
97
109
|
- !ruby/object:Gem::Version
|
98
|
-
version:
|
99
|
-
type: :development
|
100
|
-
prerelease: false
|
101
|
-
version_requirements: *25119080
|
110
|
+
version: 2.0.1
|
102
111
|
- !ruby/object:Gem::Dependency
|
103
112
|
name: simplecov
|
104
|
-
requirement:
|
105
|
-
none: false
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
106
114
|
requirements:
|
107
|
-
- -
|
115
|
+
- - '>='
|
108
116
|
- !ruby/object:Gem::Version
|
109
117
|
version: '0'
|
110
118
|
type: :development
|
111
119
|
prerelease: false
|
112
|
-
version_requirements:
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - '>='
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
113
125
|
description: Temporary users and groups, rlimits
|
114
126
|
email: costan@gmail.com
|
115
127
|
executables: []
|
@@ -150,29 +162,25 @@ files:
|
|
150
162
|
homepage: http://github.com/pwnall/exec_sandbox
|
151
163
|
licenses:
|
152
164
|
- MIT
|
165
|
+
metadata: {}
|
153
166
|
post_install_message:
|
154
167
|
rdoc_options: []
|
155
168
|
require_paths:
|
156
169
|
- lib
|
157
170
|
required_ruby_version: !ruby/object:Gem::Requirement
|
158
|
-
none: false
|
159
171
|
requirements:
|
160
|
-
- -
|
172
|
+
- - '>='
|
161
173
|
- !ruby/object:Gem::Version
|
162
174
|
version: '0'
|
163
|
-
segments:
|
164
|
-
- 0
|
165
|
-
hash: -1493873678505410753
|
166
175
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
167
|
-
none: false
|
168
176
|
requirements:
|
169
|
-
- -
|
177
|
+
- - '>='
|
170
178
|
- !ruby/object:Gem::Version
|
171
179
|
version: '0'
|
172
180
|
requirements: []
|
173
181
|
rubyforge_project:
|
174
|
-
rubygems_version: 1.
|
182
|
+
rubygems_version: 2.1.11
|
175
183
|
signing_key:
|
176
|
-
specification_version:
|
184
|
+
specification_version: 4
|
177
185
|
summary: Run foreign binaries using POSIX sandboxing features
|
178
186
|
test_files: []
|