From f6451deb74bc91b5c2dee38007e66d11ac802403 Mon Sep 17 00:00:00 2001
From: Zooko O'Whielacronx <zooko@zooko.com>
Date: Fri, 9 Nov 2007 18:06:25 -0700
Subject: [PATCH] mutable.py: fix padding/shape-of-input-data to zfec

---
 src/allmydata/mutable.py | 23 ++++++++++-------------
 1 file changed, 10 insertions(+), 13 deletions(-)

diff --git a/src/allmydata/mutable.py b/src/allmydata/mutable.py
index fe866d37..cb80557f 100644
--- a/src/allmydata/mutable.py
+++ b/src/allmydata/mutable.py
@@ -892,27 +892,24 @@ class Publish:
         # now apply FEC
         self.MAX_SEGMENT_SIZE = 1024*1024
         data_length = len(crypttext)
-        if len(crypttext) < 10:
-            # TODO: FEC doesn't handle short (or empty) strings very well, so
-            # give it something longer and we'll trim the results later. For
-            # some reason I suspect the lower limit is k**2
-            crypttext = crypttext + "\x00"*(10-len(crypttext))
 
         segment_size = min(self.MAX_SEGMENT_SIZE, len(crypttext))
         # this must be a multiple of self.required_shares
         segment_size = mathutil.next_multiple(segment_size, required_shares)
-        self.num_segments = mathutil.div_ceil(len(crypttext), segment_size)
-        assert self.num_segments == 1 # SDMF restrictions
+        if segment_size:
+            self.num_segments = mathutil.div_ceil(len(crypttext), segment_size)
+        else:
+            self.num_segments = 0
+        assert self.num_segments in [0, 1,] # SDMF restrictions
         fec = codec.CRSEncoder()
         fec.set_params(segment_size, required_shares, total_shares)
         piece_size = fec.get_block_size()
-        crypttext_pieces = []
-        for offset in range(0, len(crypttext), piece_size):
+        crypttext_pieces = [None] * required_shares
+        for i in range(len(crypttext_pieces)):
+            offset = i * piece_size
             piece = crypttext[offset:offset+piece_size]
-            if len(piece) < piece_size:
-                pad_size = piece_size - len(piece)
-                piece = piece + "\x00"*pad_size
-            crypttext_pieces.append(piece)
+            piece = piece + "\x00"*(piece_size - len(piece)) # padding
+            crypttext_pieces[i] = piece
             assert len(piece) == piece_size
 
         d = fec.encode(crypttext_pieces)
-- 
2.45.2