[Freeipa-devel] [PATCH] 275 Do not crash in Decimal parameter conversion

Rob Crittenden rcritten at redhat.com
Wed Jun 13 22:05:59 UTC 2012


Martin Kosek wrote:
> On Thu, 2012-06-07 at 22:38 -0400, Rob Crittenden wrote:
>> Martin Kosek wrote:
>>> When invalid data is passed, an unhandled decimal exception could
>>> be raised in Decimal number conversion. Handle the exception
>>> more gracefully and report proper ipalib.errors.ConversionError.
>>>
>>> https://fedorahosted.org/freeipa/ticket/2705
>>
>> I'm being pedantic but I think the Decimal special values need to be
>> handled better. Using Infinity returns a rather odd message:
>>
>> $ ipa dnsrecord-add example.com
>> Record name: foo
>> Please choose a type of DNS resource record to be added
>> The most common types for this type of zone are: A, AAAA
>>
>> DNS resource record type: LOC
>> LOC Degrees Latitude: 90
>> [LOC Minutes Latitude]: 59
>> [LOC Seconds Latitude]:
>> 999999999999999999999999999999999999999999999999999999999999999999999
>>   >>>  LOC Seconds Latitude: quantize result has too many digits for
>> current context
>> [LOC Seconds Latitude]: Infinity
>>   >>>  LOC Seconds Latitude: quantize with one INF
>>
>> And using NaN raises an unhandled exception:
>>
>> [LOC Seconds Latitude]: NaN
>> ipa: ERROR: InvalidOperation: comparison involving NaN
>> Traceback (most recent call last):
>>     File "/home/rcrit/redhat/freeipa/ipalib/cli.py", line 1263, in run
>>       sys.exit(api.Backend.cli.run(argv))
>>     File "/home/rcrit/redhat/freeipa/ipalib/cli.py", line 1049, in run
>>       kw = self.argv_to_keyword_arguments(cmd, argv[1:])
>>     File "/home/rcrit/redhat/freeipa/ipalib/cli.py", line 1035, in
>> argv_to_keyword_arguments
>>       self.prompt_interactively(cmd, kw)
>>     File "/home/rcrit/redhat/freeipa/ipalib/cli.py", line 1199, in
>> prompt_interactively
>>       callback(kw)
>>     File "/home/rcrit/redhat/freeipa/ipalib/plugins/dns.py", line 2147,
>> in interactive_prompt_callback
>>       user_options = param.prompt_parts(self.Backend)
>>     File "/home/rcrit/redhat/freeipa/ipalib/plugins/dns.py", line 768, in
>> prompt_parts
>>       self.__get_part_param(backend, part, user_options, default)
>>     File "/home/rcrit/redhat/freeipa/ipalib/plugins/dns.py", line 747, in
>> __get_part_param
>>       output_kw[name] = part(raw)
>>     File "/home/rcrit/redhat/freeipa/ipalib/parameters.py", line 556, in
>> __call__
>>       self.validate(value, supplied=self.name in kw)
>>     File "/home/rcrit/redhat/freeipa/ipalib/parameters.py", line 879, in
>> validate
>>       self._validate_scalar(value)
>>     File "/home/rcrit/redhat/freeipa/ipalib/parameters.py", line 893, in
>> _validate_scalar
>>       error = rule(ugettext, value)
>>     File "/home/rcrit/redhat/freeipa/ipalib/parameters.py", line 1244, in
>> _rule_minvalue
>>       if value<  self.minvalue:
>>     File "/usr/lib64/python2.7/decimal.py", line 884, in __lt__
>>       ans = self._compare_check_nans(other, context)
>>     File "/usr/lib64/python2.7/decimal.py", line 786, in _compare_check_nans
>>       self)
>>     File "/usr/lib64/python2.7/decimal.py", line 3866, in _raise_error
>>       raise error(explanation)
>> InvalidOperation: comparison involving NaN
>> ipa: ERROR: an internal error has occurred
>>
>> Otherwise it does what it should.
>>
>> rob
>
> Thanks for being pedantic, I found out that Decimal number validation
> and normalization needs more care, dnsrecord-add would also fail with
> values such as "1E4" or "-0".
>
> Attached patch improves Decimal number validation a lot and adds
> optional exponent normalization. I also added missing tests for all
> Decimal Parameter attributes.
>
> Martin

Getting some lint errors. Ran out of time to investigate but its strange 
because AFAICT these are members.

ipalib/parameters.py:1266: [E1101, Decimal._enforce_numberclass] 
Instance of 'Decimal' has no 'numberclass' member
ipalib/parameters.py:1271: [E1101, Decimal._enforce_numberclass] 
Instance of 'Decimal' has no 'numberclass' member
ipalib/parameters.py:1288: [E1101, Decimal._remove_exponent] Instance of 
'Decimal' has no 'exponential' member




More information about the Freeipa-devel mailing list