You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@avro.apache.org by ha...@apache.org on 2010/06/10 01:17:54 UTC

svn commit: r953186 - in /avro/trunk: CHANGES.txt lang/py/src/avro/io.py

Author: hammer
Date: Wed Jun  9 23:17:54 2010
New Revision: 953186

URL: http://svn.apache.org/viewvc?rev=953186&view=rev
Log:
AVRO-571. Fix how we handle out-of-bounds indexes for union and
enum parsing in Python (hammer)


Modified:
    avro/trunk/CHANGES.txt
    avro/trunk/lang/py/src/avro/io.py

Modified: avro/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/avro/trunk/CHANGES.txt?rev=953186&r1=953185&r2=953186&view=diff
==============================================================================
--- avro/trunk/CHANGES.txt (original)
+++ avro/trunk/CHANGES.txt Wed Jun  9 23:17:54 2010
@@ -40,6 +40,9 @@ Avro 1.4.0 (unreleased)
     AVRO-566. Java: fix so that JAVA_HOME is bound by build.xml for
     test_tools.sh.  (cutting)
 
+    AVRO-571. Fix how we handle out-of-bounds indexes for union and 
+    enum parsing in Python (hammer)
+
 Avro 1.3.3 (7 June 2010)
 
   IMPROVEMENTS

Modified: avro/trunk/lang/py/src/avro/io.py
URL: http://svn.apache.org/viewvc/avro/trunk/lang/py/src/avro/io.py?rev=953186&r1=953185&r2=953186&view=diff
==============================================================================
--- avro/trunk/lang/py/src/avro/io.py (original)
+++ avro/trunk/lang/py/src/avro/io.py Wed Jun  9 23:17:54 2010
@@ -68,7 +68,7 @@ class AvroTypeException(schema.AvroExcep
 class SchemaResolutionException(schema.AvroException):
   def __init__(self, fail_msg, writers_schema=None, readers_schema=None):
     if writers_schema: fail_msg += "\nWriter's Schema: %s" % writers_schema
-    if readers_schema: fail_msg += "\nReader's Schema: %s" % writers_schema
+    if readers_schema: fail_msg += "\nReader's Schema: %s" % readers_schema
     schema.AvroException.__init__(self, fail_msg)
 
 #
@@ -508,6 +508,10 @@ class DatumReader(object):
     """
     # read data
     index_of_symbol = decoder.read_int()
+    if index_of_symbol >= len(writers_schema.symbols):
+      fail_msg = "Can't access enum index %d for enum with %d symbols"\
+                 % (index_of_symbol, len(writers_schema.symbols))
+      raise SchemaResolutionException(fail_msg, writers_schema, readers_schema)
     read_symbol = writers_schema.symbols[index_of_symbol]
 
     # schema resolution
@@ -608,7 +612,7 @@ class DatumReader(object):
     index_of_schema = int(decoder.read_long())
     if index_of_schema >= len(writers_schema.schemas):
       fail_msg = "Can't access branch index %d for union with %d branches"\
-                 % (index_of_schema, writers_schema.schemas)
+                 % (index_of_schema, len(writers_schema.schemas))
       raise SchemaResolutionException(fail_msg, writers_schema, readers_schema)
     selected_writers_schema = writers_schema.schemas[index_of_schema]
     
@@ -617,6 +621,10 @@ class DatumReader(object):
 
   def skip_union(self, writers_schema, decoder):
     index_of_schema = int(decoder.read_long())
+    if index_of_schema >= len(writers_schema.schemas):
+      fail_msg = "Can't access branch index %d for union with %d branches"\
+                 % (index_of_schema, len(writers_schema.schemas))
+      raise SchemaResolutionException(fail_msg, writers_schema)
     return self.skip_data(writers_schema.schemas[index_of_schema], decoder)
 
   def read_record(self, writers_schema, readers_schema, decoder):