summaryrefslogtreecommitdiffstats
path: root/Parser/tokenizer.c
diff options
context:
space:
mode:
authorBrett Cannon <bcannon@gmail.com>2007-10-20 02:54:14 (GMT)
committerBrett Cannon <bcannon@gmail.com>2007-10-20 02:54:14 (GMT)
commitd5ec98c7fbe1244aa9622e2ecabfb150ce128a62 (patch)
tree2715402bae194d2bd7c3a63c37a1413d39ec7b42 /Parser/tokenizer.c
parent6643cb2a7ab0b54748cc54303d0d79c4489b6933 (diff)
downloadcpython-d5ec98c7fbe1244aa9622e2ecabfb150ce128a62.zip
cpython-d5ec98c7fbe1244aa9622e2ecabfb150ce128a62.tar.gz
cpython-d5ec98c7fbe1244aa9622e2ecabfb150ce128a62.tar.bz2
Plug a memory leak where a struct tok_state was not being freed.
Also tweak a comparison that was going farther than needed.
Diffstat (limited to 'Parser/tokenizer.c')
-rw-r--r--Parser/tokenizer.c14
1 files changed, 11 insertions, 3 deletions
diff --git a/Parser/tokenizer.c b/Parser/tokenizer.c
index 0ccd02b..85f7508 100644
--- a/Parser/tokenizer.c
+++ b/Parser/tokenizer.c
@@ -52,6 +52,7 @@ static struct tok_state *tok_new(void);
static int tok_nextc(struct tok_state *tok);
static void tok_backup(struct tok_state *tok, int c);
+
/* Token names */
char *_PyParser_TokenNames[] = {
@@ -1610,18 +1611,25 @@ PyTokenizer_RestoreEncoding(struct tok_state* tok, int len, int *offset)
char *
PyTokenizer_FindEncoding(FILE *fp) {
struct tok_state *tok;
- char *p_start=NULL, *p_end=NULL;
+ char *p_start=NULL, *p_end=NULL, *encoding=NULL;
if ((tok = PyTokenizer_FromFile(fp, NULL, NULL, NULL)) == NULL) {
rewind(fp);
return NULL;
}
- while(((tok->lineno <= 2) && (tok->done == E_OK))) {
+ while(((tok->lineno < 2) && (tok->done == E_OK))) {
PyTokenizer_Get(tok, &p_start, &p_end);
}
rewind(fp);
- return tok->encoding;
+
+ if (tok->encoding) {
+ encoding = (char *)PyMem_MALLOC(strlen(tok->encoding));
+ strcpy(encoding, tok->encoding);
+ }
+ PyTokenizer_Free(tok);
+
+ return encoding;
}
#ifdef Py_DEBUG