ConfigParser chokes on conflict markers in stdin and throws AttributeError
Nobody has claimed this yet.
- Dominant language
- Python
- Stars
- 77.2k
- Forks
- 35.9k
- PR merge metrics
- PR metrics pending
Description
Bug report
Bug description:
This is probably a duplicate of bug 107625, but I do not have a recent enough version of Python to check the behaviour.
Whether it is worth specially detecting conflict markers is something the code owners can decide.
To reproduce:
/tmp/py:
#!/usr/bin/python3
import configparser
import sys
sl = configparser.ConfigParser(allow_no_value=True)
sl.read_file(sys.stdin)
/tmp/z:
[list]
<<<<<<<< HEAD (f12435 blah)
foo
|||||||| BASE
bar
========
baz
>>>>>>>> CHANGE (faa768 blah)
$ </tmp/z /tmp/py
Traceback (most recent call last):
File "/tmp/py", line 7, in <module>
sl.read_file(sys.stdin)
File "/usr/lib/python3.11/configparser.py", line 734, in read_file
self._read(f, source)
File "/usr/lib/python3.11/configparser.py", line 1077, in _read
cursect[optname].append(value)
^^^^^^^^^^^^^^^^^^^^^^^
AttributeError: 'NoneType' object has no attribute 'append'
Notes:
sys.stdinseems to be needed to trigger this - deserves further investigation because it may point to a bad assumption or similar in the parserallow_no_valueis needed to trigger this
Finger of blame:
if (cursect is not None and optname and
cur_indent_level > indent_level):
cursect[optname].append(value)
This does not check that cursect[optname] is present.
CPython versions tested on:
3.10, 3.11, 3.12
Operating systems tested on:
Linux
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start in configparser.py at ConfigParser._read, especially the continuation handling around the reported cursect[optname].append(value) line. Reproduce the case with allow_no_value=True and conflict-marker input through stdin, then add regression coverage showing the parser no longer raises AttributeError and verify the existing behavior remains appropriate.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- python
- Domain
- backend
- Issue type
- Bug
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 48/100