Skip to content

Commit

Permalink
pybind/ceph_argparse: handle non ascii unicode args
Browse files Browse the repository at this point in the history
we raise UnicodeDecodeError at seeing non-ascii args if we fail to match
it with any command signatures. instead, we should use a unicode string
for representing the error in that case. please note, the exception is
not printed at all in real-world. =)

Fixes: http://tracker.ceph.com/issues/12287
Signed-off-by: Kefu Chai <kchai@redhat.com>
  • Loading branch information
tchaikov committed Jul 22, 2016
1 parent 01b10c3 commit 5864626
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 8 deletions.
12 changes: 7 additions & 5 deletions src/pybind/ceph_argparse.py
Expand Up @@ -540,14 +540,16 @@ def __init__(self, prefix=''):
self.prefix = prefix

def valid(self, s, partial=False):
s = str(s)
if isinstance(s, bytes):
try:
try:
s = str(s)
if isinstance(s, bytes):
# `prefix` can always be converted into unicode when being compared,
# but `s` could be anything passed by user.
s = s.decode('ascii')
except UnicodeDecodeError:
raise ArgumentPrefix("no match for {0}".format(s))
except UnicodeEncodeError:
raise ArgumentPrefix(u"no match for {0}".format(s))
except UnicodeDecodeError:
raise ArgumentPrefix("no match for {0}".format(s))

if partial:
if self.prefix.startswith(s):
Expand Down
12 changes: 9 additions & 3 deletions src/test/pybind/test_ceph_argparse.py
Expand Up @@ -92,10 +92,16 @@ def check_no_arg(self, prefix, command):
class TestBasic:

def test_non_ascii_in_non_options(self):
# unicode() is not able to convert this str parameter into unicode
# using the default encoding 'ascii'. and validate_command() should
# not choke on it.
# ArgumentPrefix("no match for {0}".format(s)) is not able to convert
# unicode str parameter into str. and validate_command() should not
# choke on it.
assert_is_none(validate_command(sigdict, [u'章鱼和鱿鱼']))
assert_is_none(validate_command(sigdict, [u'–w']))
# actually we always pass unicode strings to validate_command() in "ceph"
# CLI, but we also use bytestrings in our tests, so make sure it does not
# break.
assert_is_none(validate_command(sigdict, ['章鱼和鱿鱼']))
assert_is_none(validate_command(sigdict, ['–w']))


class TestPG(TestArgparse):
Expand Down

0 comments on commit 5864626

Please sign in to comment.