[apparmor] [patch] Fix rttime default unit in RlimitRule
John Johansen
john.johansen at canonical.com
Sat Jun 27 01:01:46 UTC 2015
On 06/26/2015 03:15 PM, Christian Boltz wrote:
> 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 ;-)
>
>
looks right
Acked-by: John Johansen <john.johansen at canonical.com>
>
> [ 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
>
More information about the AppArmor
mailing list