[pypy-commit] pypy default: Remove 'field_builder.append', which can crash the flow space

arigo noreply at buildbot.pypy.org
Mon Sep 24 18:10:31 CEST 2012


Author: Armin Rigo <arigo at tunes.org>
Branch: 
Changeset: r57506:6ba378006e61
Date: 2012-09-24 17:23 +0200
http://bitbucket.org/pypy/pypy/changeset/6ba378006e61/

Log:	Remove 'field_builder.append', which can crash the flow space
	depending on order issues with a 'None.append'.

diff --git a/pypy/module/_csv/interp_reader.py b/pypy/module/_csv/interp_reader.py
--- a/pypy/module/_csv/interp_reader.py
+++ b/pypy/module/_csv/interp_reader.py
@@ -32,9 +32,11 @@
         raise OperationError(w_error, space.wrap(msg))
     error._dont_inline_ = True
 
-    def check_limit(self, field_builder):
+    def add_char(self, field_builder, c):
+        assert field_builder is not None
         if field_builder.getlength() >= field_limit.limit:
             raise self.error("field larger than field limit")
+        field_builder.append(c)
 
     def save_field(self, field_builder):
         field = field_builder.build()
@@ -106,12 +108,11 @@
                         # begin new unquoted field
                         if dialect.quoting == QUOTE_NONNUMERIC:
                             self.numeric_field = True
-                        field_builder.append(c)
+                        self.add_char(field_builder, c)
                         state = IN_FIELD
 
                 elif state == ESCAPED_CHAR:
-                    self.check_limit(field_builder)
-                    field_builder.append(c)
+                    self.add_char(field_builder, c)
                     state = IN_FIELD
 
                 elif state == IN_FIELD:
@@ -129,8 +130,7 @@
                         state = START_FIELD
                     else:
                         # normal character - save in field
-                        self.check_limit(field_builder)
-                        field_builder.append(c)
+                        self.add_char(field_builder, c)
 
                 elif state == IN_QUOTED_FIELD:
                     # in quoted field
@@ -147,12 +147,10 @@
                             state = IN_FIELD
                     else:
                         # normal character - save in field
-                        self.check_limit(field_builder)
-                        field_builder.append(c)
+                        self.add_char(field_builder, c)
 
                 elif state == ESCAPE_IN_QUOTED_FIELD:
-                    self.check_limit(field_builder)
-                    field_builder.append(c)
+                    self.add_char(field_builder, c)
                     state = IN_QUOTED_FIELD
 
                 elif state == QUOTE_IN_QUOTED_FIELD:
@@ -160,8 +158,7 @@
                     if (dialect.quoting != QUOTE_NONE and
                             c == dialect.quotechar):
                         # save "" as "
-                        self.check_limit(field_builder)
-                        field_builder.append(c)
+                        self.add_char(field_builder, c)
                         state = IN_QUOTED_FIELD
                     elif c == dialect.delimiter:
                         # save field - wait for new field
@@ -172,8 +169,7 @@
                         self.save_field(field_builder)
                         state = EAT_CRNL
                     elif not dialect.strict:
-                        self.check_limit(field_builder)
-                        field_builder.append(c)
+                        self.add_char(field_builder, c)
                         state = IN_FIELD
                     else:
                         # illegal
@@ -192,14 +188,12 @@
                 self.save_field(field_builder)
                 break
             elif state == ESCAPED_CHAR:
-                self.check_limit(field_builder)
-                field_builder.append('\n')
+                self.add_char(field_builder, '\n')
                 state = IN_FIELD
             elif state == IN_QUOTED_FIELD:
                 pass
             elif state == ESCAPE_IN_QUOTED_FIELD:
-                self.check_limit(field_builder)
-                field_builder.append('\n')
+                self.add_char(field_builder, '\n')
                 state = IN_QUOTED_FIELD
             else:
                 break


More information about the pypy-commit mailing list