Hello,
RlimitRule accidently used 'ms' (milliseconds) as default unit for
rttime rules, but rttime without unit means 'us' (microseconds). This
patch fixes this.
Also add some tests with 'us' as unit, and two more to cover terribly
invalid corner cases (and to improve test coverage by 2 lines ;-)
[ 58-RlimitRule-fix-rttime-default-unit.diff ]
=== modified file utils/apparmor/rule/rlimit.py
--- utils/apparmor/rule/rlimit.py 2015-06-06 14:53:16.868029000 +0200
+++ utils/apparmor/rule/rlimit.py 2015-06-26 22:50:44.728769405 +0200
@@ -26,7 +26,7 @@
rlimit_size = ['fsize', 'data', 'stack', 'core', 'rss', 'as', 'memlock',
'msgqueue'] # NUMBER ( 'K' | 'M' | 'G' )
rlimit_number = ['ofile', 'nofile', 'locks', 'sigpending', 'nproc', 'rtprio']
-rlimit_time = ['cpu', 'rttime'] # number + time unit (cpu in seconds+,
rttime in ms+)
+rlimit_time = ['cpu', 'rttime'] # number + time unit (cpu in seconds+,
rttime in us+)
rlimit_nice = ['nice'] # a number between -20 and 19.
rlimit_all = rlimit_size + rlimit_number + rlimit_time + rlimit_nice
@@ -92,11 +92,11 @@
if unit == 'm' and rlimit == 'rttime':
raise AppArmorException('Ambiguous value %s in rlimit %s
rule - use "ms" or "minutes"' % (value, rlimit))
if unit != '' and not ('seconds'.startswith(unit) or
'minutes'.startswith(unit) or 'hours'.startswith(unit) or
- (unit == 'ms' and rlimit == 'rttime') ):
+ (rlimit == 'rttime' and unit in ['ms', 'us']) ):
raise AppArmorException('Invalid unit in rlimit %s %s
rule' % (rlimit, value))
if rlimit == 'rttime':
- self.value_as_int = self.time_to_int(value, 'ms')
+ self.value_as_int = self.time_to_int(value, 'us')
else:
self.value_as_int = self.time_to_int(value, 'seconds')
@@ -181,7 +181,9 @@
if unit == '':
unit = default_unit
- if unit == 'ms':
+ if unit == 'us':
+ number = number / 1000000.0
+ elif unit == 'ms':
number = number / 1000.0
elif 'seconds'.startswith(unit):
pass
=== modified file utils/test/test-rlimit.py
--- utils/test/test-rlimit.py 2015-06-06 14:53:16.868029000 +0200
+++ utils/test/test-rlimit.py 2015-06-26 23:01:08.322573480 +0200
@@ -74,8 +74,11 @@
('set rlimit,' , AppArmorException), # missing
parts
('set rlimit <= 5,' , AppArmorException),
('set rlimit cpu <= ,' , AppArmorException),
+ ('set rlimit cpu <= "",' , AppArmorBug), # evil
quoting trick
('set rlimit foo <= 5,' , AppArmorException), # unknown
rlimit
('set rlimit rttime <= 60m,' , AppArmorException), # 'm' could
mean 'ms' or 'minutes'
+ ('set rlimit cpu <= 20ms,' , AppArmorException), # cpu
doesn't support 'ms'...
+ ('set rlimit cpu <= 20us,' , AppArmorException), # ... or 'us'
('set rlimit nice <= 20MB,' , AppArmorException), # invalid
unit for this rlimit type
('set rlimit cpu <= 20MB,' , AppArmorException),
('set rlimit data <= 20seconds,' , AppArmorException),
@@ -136,6 +139,7 @@
([None , '1024' ] , AppArmorBug), # wrong type for rlimit
(['as' , dict() ] , AppArmorBug), # wrong type for value
(['as' , None ] , AppArmorBug), # wrong type for value
+ (['cpu' , '100xy2' ] , AppArmorException), # invalid unit
]
def _run_test(self, params, expected):
@@ -447,6 +451,7 @@
self.obj = RlimitRule('cpu', '1')
tests = [
+ ('30us' , 0.00003),
('40ms' , 0.04),
('40' , 40),
('40seconds', 40),
@@ -460,6 +465,9 @@
def test_with_ms_as_default(self):
self.assertEqual(self.obj.time_to_int('40', 'ms'), 0.04)
+ def test_with_us_as_default(self):
+ self.assertEqual(self.obj.time_to_int('30', 'us'), 0.00003)
+
def test_invalid_time_to_int(self):
with self.assertRaises(AppArmorException):
self.obj.time_to_int('20mice', 'seconds')
Regards,
Christian Boltz
--
Please, if you use any of my code in your giant list of bad coding
practices, feel free to not attribute me. :) [Seth Arnold in apparmor]
--
AppArmor mailing list
[email protected]
Modify settings or unsubscribe at:
https://lists.ubuntu.com/mailman/listinfo/apparmor