Change internal size_t to int64_t in OutStream.

Project: http://git-wip-us.apache.org/repos/asf/lucy/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucy/commit/e9afedbf
Tree: http://git-wip-us.apache.org/repos/asf/lucy/tree/e9afedbf
Diff: http://git-wip-us.apache.org/repos/asf/lucy/diff/e9afedbf

Branch: refs/heads/master
Commit: e9afedbfdec345099cc47922ea4cabc34273dee7
Parents: e629483
Author: Marvin Humphrey <[email protected]>
Authored: Thu Apr 28 15:08:36 2016 -0700
Committer: Marvin Humphrey <[email protected]>
Committed: Thu Apr 28 15:38:13 2016 -0700

----------------------------------------------------------------------
 core/Lucy/Store/OutStream.c | 42 ++++++++++++++++++++++++----------------
 1 file changed, 25 insertions(+), 17 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucy/blob/e9afedbf/core/Lucy/Store/OutStream.c
----------------------------------------------------------------------
diff --git a/core/Lucy/Store/OutStream.c b/core/Lucy/Store/OutStream.c
index 7e619a4..507cb47 100644
--- a/core/Lucy/Store/OutStream.c
+++ b/core/Lucy/Store/OutStream.c
@@ -28,10 +28,10 @@
 #include "Lucy/Store/RAMFileHandle.h"
 #include "Lucy/Util/NumberUtils.h"
 
-// Inlined version of OutStream_Write_Bytes.
+// Inlined version of OutStream_Write_Bytes.  `len` must be between 0 and 2 GB.
 static CFISH_INLINE void
 SI_write_bytes(OutStream *self, OutStreamIVARS *ivars,
-               const void *bytes, size_t len);
+               const void *bytes, int64_t len);
 
 // Inlined version of OutStream_Write_CU32.
 static CFISH_INLINE void
@@ -123,10 +123,10 @@ OutStream_Absorb_IMP(OutStream *self, InStream *instream) 
{
     // not flushing too frequently and keeping code complexity under control.
     OutStream_Grow(self, OutStream_Tell(self) + bytes_left);
     while (bytes_left) {
-        const size_t bytes_this_iter = bytes_left < IO_STREAM_BUF_SIZE
-                                       ? (size_t)bytes_left
-                                       : IO_STREAM_BUF_SIZE;
-        InStream_Read_Bytes(instream, buf, bytes_this_iter);
+        const int64_t bytes_this_iter = bytes_left < IO_STREAM_BUF_SIZE
+                                        ? bytes_left
+                                        : IO_STREAM_BUF_SIZE;
+        InStream_Read_Bytes(instream, buf, (size_t)bytes_this_iter);
         SI_write_bytes(self, ivars, buf, bytes_this_iter);
         bytes_left -= bytes_this_iter;
     }
@@ -180,30 +180,34 @@ OutStream_Length_IMP(OutStream *self) {
 
 void
 OutStream_Write_Bytes_IMP(OutStream *self, const void *bytes, size_t len) {
-    SI_write_bytes(self, OutStream_IVARS(self), bytes, len);
+    if (len >= INT32_MAX) {
+        THROW(ERR, "Can't write buffer longer than INT32_MAX: %u64",
+              (uint64_t)len);
+    }
+    SI_write_bytes(self, OutStream_IVARS(self), bytes, (int64_t)len);
 }
 
 static CFISH_INLINE void
 SI_write_bytes(OutStream *self, OutStreamIVARS *ivars,
-               const void *bytes, size_t len) {
+               const void *bytes, int64_t len) {
     // If this data is larger than the buffer size, flush and write.
     if (len >= IO_STREAM_BUF_SIZE) {
         S_flush(self, ivars);
-        if (!FH_Write(ivars->file_handle, bytes, len)) {
+        if (!FH_Write(ivars->file_handle, bytes, (size_t)len)) {
             RETHROW(INCREF(Err_get_error()));
         }
         ivars->buf_start += len;
     }
     // If there's not enough room in the buffer, flush then add.
-    else if (ivars->buf_pos + len >= IO_STREAM_BUF_SIZE) {
+    else if ((uint64_t)ivars->buf_pos + (uint64_t)len >= IO_STREAM_BUF_SIZE) {
         S_flush(self, ivars);
-        memcpy((ivars->buf + ivars->buf_pos), bytes, len);
-        ivars->buf_pos += len;
+        memcpy((ivars->buf + ivars->buf_pos), bytes, (size_t)len);
+        ivars->buf_pos += (size_t)len;
     }
     // If there's room, just add these bytes to the buffer.
     else {
-        memcpy((ivars->buf + ivars->buf_pos), bytes, len);
-        ivars->buf_pos += len;
+        memcpy((ivars->buf + ivars->buf_pos), bytes, (size_t)len);
+        ivars->buf_pos += (size_t)len;
     }
 }
 
@@ -314,7 +318,7 @@ SI_write_cu32(OutStream *self, OutStreamIVARS *ivars, 
uint32_t value) {
         value >>= 7;
     }
 
-    SI_write_bytes(self, ivars, ptr, (buf + sizeof(buf)) - ptr);
+    SI_write_bytes(self, ivars, ptr, (int64_t)((buf + sizeof(buf)) - ptr));
 }
 
 void
@@ -342,14 +346,18 @@ SI_write_cu64(OutStream *self, OutStreamIVARS *ivars, 
uint64_t value) {
         value >>= 7;
     }
 
-    SI_write_bytes(self, ivars, ptr, (buf + sizeof(buf)) - ptr);
+    SI_write_bytes(self, ivars, ptr, (int64_t)((buf + sizeof(buf)) - ptr));
 }
 
 void
 OutStream_Write_String_IMP(OutStream *self, const char *string, size_t len) {
     OutStreamIVARS *const ivars = OutStream_IVARS(self);
+    if (len >= INT32_MAX) {
+        THROW(ERR, "Can't write string longer than INT32_MAX: %u64",
+              (uint64_t)len);
+    }
     SI_write_cu32(self, ivars, (uint32_t)len);
-    SI_write_bytes(self, ivars, string, len);
+    SI_write_bytes(self, ivars, string, (int64_t)len);
 }
 
 void

Reply via email to