summaryrefslogtreecommitdiff
path: root/Modules/_csv.c
diff options
context:
space:
mode:
authorBenjamin Peterson <benjamin@python.org>2016-08-13 17:21:22 -0700
committerBenjamin Peterson <benjamin@python.org>2016-08-13 17:21:22 -0700
commit59b6abd38c04472a256b1b04e8709defb29e44ef (patch)
tree6eaeb71a2ec978e88d6adce61550d32b21528049 /Modules/_csv.c
parenta0b2568627e061f9dd8a31df665e97fdcf4b531d (diff)
parent6e01d90cc8bfac920bd4f7143b3968a8a21079d9 (diff)
downloadcpython-git-59b6abd38c04472a256b1b04e8709defb29e44ef.tar.gz
merge 3.3 (#27758)
Diffstat (limited to 'Modules/_csv.c')
-rw-r--r--Modules/_csv.c23
1 files changed, 19 insertions, 4 deletions
diff --git a/Modules/_csv.c b/Modules/_csv.c
index 1a363fa5d0..ed6055dd69 100644
--- a/Modules/_csv.c
+++ b/Modules/_csv.c
@@ -1016,11 +1016,19 @@ join_append_data(WriterObj *self, unsigned int field_kind, void *field_data,
int i;
Py_ssize_t rec_len;
-#define ADDCH(c) \
+#define INCLEN \
+ do {\
+ if (!copy_phase && rec_len == PY_SSIZE_T_MAX) { \
+ goto overflow; \
+ } \
+ rec_len++; \
+ } while(0)
+
+#define ADDCH(c) \
do {\
if (copy_phase) \
self->rec[rec_len] = c;\
- rec_len++;\
+ INCLEN;\
} while(0)
rec_len = self->rec_len;
@@ -1086,11 +1094,18 @@ join_append_data(WriterObj *self, unsigned int field_kind, void *field_data,
if (*quoted) {
if (copy_phase)
ADDCH(dialect->quotechar);
- else
- rec_len += 2;
+ else {
+ INCLEN; /* starting quote */
+ INCLEN; /* ending quote */
+ }
}
return rec_len;
+
+ overflow:
+ PyErr_NoMemory();
+ return -1;
#undef ADDCH
+#undef INCLEN
}
static int