Bug #73660 option_files + !include/!includedir fails with trailing newline
Submitted: 20 Aug 2014 19:32 Modified: 27 Aug 2014 18:15
Reporter: Andrew Garner Email Updates:
Status: Closed Impact on me:
None 
Category:Connector / Python Severity:S3 (Non-critical)
Version:2.0.0 OS:Any
Assigned to: CPU Architecture:Any

[20 Aug 2014 19:32] Andrew Garner
Description:
If a !include option has a trailing newline, connect() fails with a value error:

>>> open("foo.cnf", "wb").write("!include anything.cnf\n")
>>> mysql.connector.connect(option_files=["foo.cnf"])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "mysql/connector/__init__.py", line 154, in connect
    return MySQLConnection(*args, **kwargs)
  File "mysql/connector/connection.py", line 129, in __init__
    self.connect(**kwargs)
  File "mysql/connector/connection.py", line 504, in connect
    self.config(**kwargs)
  File "mysql/connector/connection.py", line 307, in config
    self._read_option_files(config)
  File "mysql/connector/connection.py", line 261, in _read_option_files
    keep_dashes=False)
  File "mysql/connector/optionfiles.py", line 81, in __init__
    self._parse_options(list(self.files))
  File "mysql/connector/optionfiles.py", line 132, in _parse_options
    file_, str(exc)))
ValueError: Failed reading file 'anything.cnf
': [Errno 2] No such file or directory: 'anything.cnf\n'

How to repeat:
Read an options file with a !include or !includedir option with a trailing newline

Suggested fix:
Trim trailing whitespace from the !include/!includedir directives before processing the path names.
[21 Aug 2014 12:41] MySQL Verification Team
Hello Andrew,

Thank you for the bug report.
Verified as described.

Thanks,
Umesh
[21 Aug 2014 12:41] MySQL Verification Team
//

[root@cluster-repo myexp]# python
Python 2.6.6 (r266:84292, Jan 22 2014, 01:49:05)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-4)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import mysql.connector
>>> open("foo.cnf", "wb").write("!include anything.cnf\n")
>>> mysql.connector.connect(option_files=["foo.cnf"])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.6/site-packages/mysql/connector/__init__.py", line 154, in connect
    return MySQLConnection(*args, **kwargs)
  File "/usr/lib/python2.6/site-packages/mysql/connector/connection.py", line 129, in __init__
    self.connect(**kwargs)
  File "/usr/lib/python2.6/site-packages/mysql/connector/connection.py", line 504, in connect
    self.config(**kwargs)
  File "/usr/lib/python2.6/site-packages/mysql/connector/connection.py", line 307, in config
    self._read_option_files(config)
  File "/usr/lib/python2.6/site-packages/mysql/connector/connection.py", line 261, in _read_option_files
    keep_dashes=False)
  File "/usr/lib/python2.6/site-packages/mysql/connector/optionfiles.py", line 81, in __init__
    self._parse_options(list(self.files))
  File "/usr/lib/python2.6/site-packages/mysql/connector/optionfiles.py", line 132, in _parse_options
    file_, str(exc)))
ValueError: Failed reading file 'anything.cnf
': [Errno 2] No such file or directory: 'anything.cnf\n'
[27 Aug 2014 18:15] Paul DuBois
Noted in 2.0.1 changelog.

!include and !includedir directives in option files were not handled
properly.