8000 error reporting may fail: str(CondaError) sometimes uses user data in string template · Issue #6759 · conda/conda · GitHub
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content
error reporting may fail: str(CondaError) sometimes uses user data in string template #6759
Closed
@mbargull

Description

@mbargull

I'm submitting a...

  • bug report
  • feature request

Current Behavior

The message argument to conda.CondaError sometimes contains user data.
This is problematic since in conda.CondaError.__str__ self.message is used as a string template.

Steps to Reproduce

|(base) $ conda config --show '%}'
--- Logging error ---
Traceback (most recent call last):
  File "/home/maba/code/conda/conda-4.4/lib/python3.6/site-packages/conda/exceptions.py", line 743, in __call__
    return func(*args, **kwargs)
  File "/home/maba/code/conda/conda-4.4/lib/python3.6/site-packages/conda/cli/main.py", line 78, in _main
    exit_code = do_call(args, p)
  File "/home/maba/code/conda/conda-4.4/lib/python3.6/site-packages/conda/cli/conda_argparse.py", line 76, in do_call
    exit_code = getattr(module, func_name)(args, parser)
  File "/home/maba/code/conda/conda-4.4/lib/python3.6/site-packages/conda/cli/main_config.py", line 29, in execute
    execute_config(args, parser)
  File "/home/maba/code/conda/conda-4.4/lib/python3.6/site-packages/conda/cli/main_config.py", line 111, in execute_config
    raise ArgumentError("Invalid configuration parameters: %s" % dashlist(not_params))
conda.exceptions.ArgumentError: <unprintable ArgumentError object>

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/maba/code/conda/conda-4.4/lib/python3.6/site-packages/conda/gateways/logging.py", line 64, in emit
    msg = self.format(record)
  File "/home/maba/code/conda/conda-4.4/lib/python3.6/logging/__init__.py", line 838, in format
    return fmt.format(record)
  File "/home/maba/code/conda/conda-4.4/lib/python3.6/logging/__init__.py", line 575, in format
    record.message = record.getMessage()
  File "/home/maba/code/conda/conda-4.4/lib/python3.6/logging/__init__.py", line 338, in getMessage
    msg = msg % self.args
  File "/home/maba/code/conda/conda-4.4/lib/python3.6/site-packages/conda/__init__.py", line 43, in __repr__
    return '%s: %s' % (self.__class__.__name__, text_type(self))
  File "/home/maba/code/conda/conda-4.4/lib/python3.6/site-packages/conda/__init__.py", line 47, in __str__
    return text_type(self.message % self._kwargs)
ValueError: unsupported format character '}' (0x7d) at index 40
Call stack:
  File "/home/maba/code/conda/conda-4.4/bin/conda", line 11, in <module>
    sys.exit(main())
  File "/home/maba/code/conda/conda-4.4/lib/python3.6/site-packages/conda/cli/main.py", line 126, in main
    return conda_exception_handler(_main, *args)
  File "/home/maba/code/conda/conda-4.4/lib/python3.6/site-packages/conda/exceptions.py", line 975, in conda_exception_handler
    return_value = exception_handler(func, *args, **kwargs)
  File "/home/maba/code/conda/conda-4.4/lib/python3.6/site-packages/conda/exceptions.py", line 746, in __call__
    return self.handle_exception(exc_val, exc_tb)
  File "/home/maba/code/conda/conda-4.4/lib/python3.6/site-packages/conda/exceptions.py", line 773, in handle_exception
    return self.handle_application_exception(exc_val, exc_tb)
  File "/home/maba/code/conda/conda-4.4/lib/python3.6/site-packages/conda/exceptions.py", line 785, in handle_application_exception
    self._print_conda_exception(exc_val, exc_tb)
  File "/home/maba/code/conda/conda-4.4/lib/python3.6/site-packages/conda/exceptions.py", line 790, in _print_conda_exception
    print_conda_exception(exc_val, exc_tb)
  File "/home/maba/code/conda/conda-4.4/lib/python3.6/site-packages/conda/exceptions.py", line 724, in print_conda_exception
    stderrlog.info("\n%r\n", exc_val)
  File "/home/maba/code/conda/conda-4.4/lib/python3.6/logging/__init__.py", line 1306, in info
    self._log(INFO, msg, args, **kwargs)
  File "/home/maba/code/conda/conda-4.4/lib/python3.6/logging/__init__.py", line 1442, in _log
    self.handle(record)
  File "/home/maba/code/conda/conda-4.4/lib/python3.6/logging/__init__.py", line 1452, in handle
    self.callHandlers(record)
  File "/home/maba/code/conda/conda-4.4/lib/python3.6/logging/__init__.py", line 1514, in callHandlers
    hdlr.handle(record)
  File "/home/maba/code/conda/conda-4.4/lib/python3.6/logging/__init__.py", line 863, in handle
    self.emit(record)
  File "/home/maba/code/conda/conda-4.4/lib/python3.6/site-packages/conda/gateways/logging.py", line 73, in emit
    self.handleError(record)
Unable to print the message and arguments - possible formatting error.
Use the traceback above to help find the error.

This is even more problematic with Python 2 due to the lost traceback:

|(base) $ conda config --show '%}'
Traceback (most recent call last):
  File "/home/maba/code/conda/conda-py2/lib/python2.7/site-packages/conda/gateways/logging.py", line 64, in emit
    msg = self.format(record)
  File "/home/maba/code/conda/conda-py2/lib/python2.7/logging/__init__.py", line 734, in format
    return fmt.format(record)
  File "/home/maba/code/conda/conda-py2/lib/python2.7/logging/__init__.py", line 465, in format
    record.message = record.getMessage()
  File "/home/maba/code/conda/conda-py2/lib/python2.7/logging/__init__.py", line 329, in getMessage
    msg = msg % self.args
  File "/home/maba/code/conda/conda-py2/lib/python2.7/site-packages/conda/__init__.py", line 43, in __repr__
    return '%s: %s' % (self.__class__.__name__, text_type(self))
  File "/home/maba/code/conda/conda-py2/lib/python2.7/site-packages/conda/__init__.py", line 47, in __str__
    return text_type(self.message % self._kwargs)
ValueError: unsupported format character '}' (0x7d) at index 40
Logged from file exceptions.py, line 724

Expected Behavior

Every single use of conda.CondaError and derived classes must be reviewed to make sure conda.CondaError.message only ever contains static strings without user data.
Also, it would be best to make sure conda.CondaError.__str__ never fails, i.e., do not only except TypeError but catch other exceptions too and prefer to rather output anything instead of nothing, e.g.

except:
    sys.stderr.write("\n".join(map(str, [self.message, self._kwargs, ""])))
    raise

(or something even simpler that is least likely to fail).

As for the lost tracebacks with Python 2, some possibilities are

  • maybe always use something like future.utils for raising exceptions,
  • tell users to use Miniconda3/Anaconda3 and use Python 2 only in a non-base environments,
  • ditch Python 2 support with conda 5.* (meaning only Python 3-only base/_conda_ environments) 😉.

Environment Information

`conda info`

     active environment : base
    active env location : /home/maba/code/conda/conda-4.4
            shell level : 1
       user config file : /home/maba/.condarc
 populated config files : /home/maba/code/conda/conda-4.4/.condarc
          conda version : 4.4.7
    conda-build version : not installed
         python version : 3.6.4.final.0
       base environment : /home/maba/code/conda/conda-4.4  (writable)
           channel URLs : https://repo.continuum.io/pkgs/main/linux-64
                          https://repo.continuum.io/pkgs/main/noarch
                          https://repo.continuum.io/pkgs/free/linux-64
                          https://repo.continuu
7288
m.io/pkgs/free/noarch
                          https://repo.continuum.io/pkgs/r/linux-64
                          https://repo.continuum.io/pkgs/r/noarch
                          https://repo.continuum.io/pkgs/pro/linux-64
                          https://repo.continuum.io/pkgs/pro/noarch
          package cache : /home/maba/code/conda/conda-4.4/pkgs
                          /home/maba/.conda/pkgs
       envs directories : /home/maba/code/conda/conda-4.4/envs
                          /home/maba/.conda/envs
               platform : linux-64
             user-agent : conda/4.4.7 requests/2.18.4 CPython/3.6.4 Linux/4.14.13-1-MANJARO manjaro/17.1-dev glibc/2.26
                UID:GID : 1000:1000
             netrc file : None
           offline mode : False

`conda config --show-sources`

==> /home/maba/code/conda/conda-4.4/.condarc <==
pinned_packages:
  - conda >=4.4,<4.5.0a0

`conda list --show-channel-urls`

# packages in environment at /home/maba/code/conda/conda-4.4:
#
asn1crypto                0.24.0                   py36_0    defaults
ca-certificates           2017.08.26           h1d4fec5_0    defaults
certifi                   2017.11.5        py36hf29ccca_0    defaults
cffi                      1.11.4           py36h9745a5d_0    defaults
chardet                   3.0.4            py36h0f667ec_1    defaults
conda                     4.4.7                    py36_0    defaults
conda-env                 2.6.0                h36134e3_1    defaults
cryptography              2.1.4            py36hd09be54_0    defaults
idna                      2.6              py36h82fb2a8_1    defaults
libedit                   3.1                  heed3624_0    defaults
libffi                    3.2.1                hd88cf55_4    defaults
libgcc-ng                 7.2.0                h7cc24e2_2    defaults
libstdcxx-ng              7.2.0                h7a57d05_2    defaults
ncurses                   6.0                  h9df7e31_2    defaults
openssl                   1.0.2n               hb7f436b_0    defaults
pip                       9.0.1            py36h6c6f9ce_4    defaults
pycosat                   0.6.3            py36h0a5515d_0    defaults
pycparser                 2.18             py36hf9f622e_1    defaults
pyopenssl                 17.5.0           py36h20ba746_0    defaults
pysocks                   1.6.7            py36hd97a5b1_1    defaults
python                    3.6.4                hc3d631a_1    defaults
readline                  7.0                  ha6073c6_4    defaults
requests                  2.18.4           py36he2e5f8d_1    defaults
ruamel_yaml               0.15.35          py36h14c3975_1    defaults
setuptools                38.4.0                   py36_0    defaults
six                       1.11.0           py36h372c433_1    defaults
sqlite                    3.20.1               hb898158_2    defaults
tk                        8.6.7                hc745277_3    defaults
urllib3                   1.22             py36hbe7ace6_0    defaults
wheel                     0.30.0           py36hfd4bba0_1    defaults
xz                        5.2.3                h55aa19d_2    defaults
yaml                      0.1.7                had09818_2    defaults
zlib                      1.2.11               ha838bed_2    defaults

Metadata

Metadata

Assignees

No one assigned

    Labels

    locked[bot] locked due to inactivitysource::contributorcreated by a frequent contributorstale[bot] marked as stale due to inactivitystale::closed[bot] closed after being marked as staletype::tech-debtidentifies or resolves some technical debt

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions

      0