summaryrefslogtreecommitdiffstats
path: root/Python/traceback.c
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>1999-09-18 20:49:39 (GMT)
committerGuido van Rossum <guido@python.org>1999-09-18 20:49:39 (GMT)
commit3aca65312a9b6c5fe741167764d56de073259f73 (patch)
treeca14266eda0e167f0c9427bbdaa3b1b314f83a4b /Python/traceback.c
parent458e7fab9bd8092876bc8fe4a2520d1edc694626 (diff)
downloadcpython-3aca65312a9b6c5fe741167764d56de073259f73.zip
cpython-3aca65312a9b6c5fe741167764d56de073259f73.tar.gz
cpython-3aca65312a9b6c5fe741167764d56de073259f73.tar.bz2
Tim Peters fixed PR#75: very long lines cause incorrect tracebacks.
Diffstat (limited to 'Python/traceback.c')
-rw-r--r--Python/traceback.c13
1 files changed, 11 insertions, 2 deletions
diff --git a/Python/traceback.c b/Python/traceback.c
index 53b84f3..ca77eaa 100644
--- a/Python/traceback.c
+++ b/Python/traceback.c
@@ -197,8 +197,17 @@ tb_displayline(f, filename, lineno, name)
if (xfp == NULL || err != 0)
return err;
for (i = 0; i < lineno; i++) {
- if (fgets(linebuf, sizeof linebuf, xfp) == NULL)
- break;
+ char* pLastChar = &linebuf[sizeof(linebuf)-2];
+ do {
+ *pLastChar = '\0';
+ if (fgets(linebuf, sizeof linebuf, xfp) == NULL)
+ break;
+ /* fgets read *something*; if it didn't get as
+ far as pLastChar, it must have found a newline
+ or hit the end of the file; if pLastChar is \n,
+ it obviously found a newline; else we haven't
+ yet seen a newline, so must continue */
+ } while (*pLastChar != '\0' && *pLastChar != '\n');
}
if (i == lineno) {
char *p = linebuf;