You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@thrift.apache.org by ro...@apache.org on 2015/03/01 12:33:58 UTC

thrift git commit: THRIFT-2180 Integer types issues in Cocoa lib on ARM64

Repository: thrift
Updated Branches:
  refs/heads/master 00a4e3e80 -> 6b61601cc


THRIFT-2180 Integer types issues in Cocoa lib on ARM64

CLient: Cocoa
Patch: Jeremy W. Sherman
This closes #372


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

Branch: refs/heads/master
Commit: 6b61601cc1c3ef5142ac000fcfc98634970d5d12
Parents: 00a4e3e
Author: Roger Meier <ro...@apache.org>
Authored: Sun Mar 1 12:32:50 2015 +0100
Committer: Roger Meier <ro...@apache.org>
Committed: Sun Mar 1 12:32:50 2015 +0100

----------------------------------------------------------------------
 lib/cocoa/src/protocol/TBinaryProtocol.m        | 103 +++++++++++++++----
 lib/cocoa/src/server/TSocketServer.m            |   7 +-
 lib/cocoa/src/transport/TFramedTransport.m      |  69 ++++++++-----
 lib/cocoa/src/transport/THTTPClient.h           |   2 +-
 lib/cocoa/src/transport/THTTPClient.m           |  16 +--
 lib/cocoa/src/transport/TMemoryBuffer.m         |  18 ++--
 .../src/transport/TNSFileHandleTransport.m      |  22 ++--
 lib/cocoa/src/transport/TNSStreamTransport.m    |  38 ++++---
 lib/cocoa/src/transport/TSSLSocketClient.m      |   6 +-
 lib/cocoa/src/transport/TSocketClient.h         |   2 +-
 lib/cocoa/src/transport/TSocketClient.m         |   2 +-
 lib/cocoa/src/transport/TTransport.h            |   8 +-
 12 files changed, 189 insertions(+), 104 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/thrift/blob/6b61601c/lib/cocoa/src/protocol/TBinaryProtocol.m
----------------------------------------------------------------------
diff --git a/lib/cocoa/src/protocol/TBinaryProtocol.m b/lib/cocoa/src/protocol/TBinaryProtocol.m
index 1508acc..e79bd57 100644
--- a/lib/cocoa/src/protocol/TBinaryProtocol.m
+++ b/lib/cocoa/src/protocol/TBinaryProtocol.m
@@ -21,9 +21,60 @@
 #import "TProtocolException.h"
 #import "TObjective-C.h"
 
-int32_t VERSION_1 = 0x80010000;
-int32_t VERSION_MASK = 0xffff0000;
+static const uint16_t VERSION_1 = 0x8001;
 
+union versioned_size {
+  int32_t i32;
+  struct {
+    uint16_t version;
+    int16_t size;
+  } packed;
+};
+
+NS_INLINE size_t
+CheckedCastInt32ToSizeT(int32_t size)
+{
+  if (size < 0) {
+    NSString *reason = [NSString stringWithFormat:
+                        @"%s: refusing to read data with negative size: %"PRId32,
+                        __func__, size];
+    @throw [TProtocolException
+            exceptionWithName: @"TProtocolException"
+            reason: reason];
+  }
+  size_t checkedSize = (size_t)size;
+  return checkedSize;
+}
+
+NS_INLINE int32_t
+CheckedCastSizeTToInt32(size_t size)
+{
+  if (size > INT32_MAX) {
+    NSString *reason = [NSString stringWithFormat:
+                        @"%s: data size exceeds values representable by a 32-bit signed integer: %zu",
+                        __func__, size];
+    @throw [TProtocolException
+            exceptionWithName: @"TProtocolException"
+            reason: reason];
+  }
+  int32_t checkedSize = (int32_t)size;
+  return checkedSize;
+}
+
+NS_INLINE uint8_t
+CheckedCastIntToUInt8(int size)
+{
+  if (size > UINT8_MAX) {
+    NSString *reason = [NSString stringWithFormat:
+                        @"%s: data size exceeds values representable by a 8-bit unsigned integer: %d",
+                        __func__, size];
+    @throw [TProtocolException
+            exceptionWithName: @"TProtocolException"
+            reason: reason];
+  }
+  uint8_t checkedSize = (uint8_t)size;
+  return checkedSize;
+}
 
 static TBinaryProtocolFactory * gSharedFactory = nil;
 
@@ -89,12 +140,13 @@ static TBinaryProtocolFactory * gSharedFactory = nil;
 }
 
 
-- (NSString *) readStringBody: (int) size
+- (NSString *) readStringBody: (int) rawSize
 {
+  size_t size = CheckedCastInt32ToSizeT(rawSize);
   char * buffer = malloc(size+1);
   if (!buffer) {
     @throw [TProtocolException exceptionWithName: @"TProtocolException"
-                                          reason: [NSString stringWithFormat: @"Unable to allocate memory in %s, size: %i",
+                                          reason: [NSString stringWithFormat: @"Unable to allocate memory in %s, size: %zu",
                                                    __PRETTY_FUNCTION__,
                                                    size]];;
   }
@@ -112,10 +164,15 @@ static TBinaryProtocolFactory * gSharedFactory = nil;
 {
   int32_t size = [self readI32];
   if (size < 0) {
-    int version = size & VERSION_MASK;
+    union versioned_size vsize;
+    vsize.i32 = size;
+    uint16_t version = vsize.packed.version;
     if (version != VERSION_1) {
+      NSString *reason = [NSString stringWithFormat:
+                          @"%s: Expected version %"PRIu16", instead found: %"PRIu16,
+                          __func__, VERSION_1, version];
       @throw [TProtocolException exceptionWithName: @"TProtocolException"
-                                 reason: @"Bad version in readMessageBegin"];
+                                 reason: reason];
     }
     if (type != NULL) {
       *type = size & 0x00FF;
@@ -206,7 +263,7 @@ static TBinaryProtocolFactory * gSharedFactory = nil;
 
 - (NSString *) readString
 {
-  int size = [self readI32];
+  int32_t size = [self readI32];
   return [self readStringBody: size];
 }
 
@@ -230,10 +287,9 @@ static TBinaryProtocolFactory * gSharedFactory = nil;
   return (short)
     (((buff[0] & 0xff) << 8) |
      ((buff[1] & 0xff)));
-  return 0;
 }
 
-- (int64_t) readI64;
+- (int64_t) readI64
 {
   uint8_t i64rd[8];
   [mTransport readAll: i64rd offset: 0 length: 8];
@@ -248,7 +304,7 @@ static TBinaryProtocolFactory * gSharedFactory = nil;
     ((int64_t)(i64rd[7] & 0xff));
 }
 
-- (double) readDouble;
+- (double) readDouble
 {
   // FIXME - will this get us into trouble on PowerPC?
   int64_t ieee754 = [self readI64];
@@ -259,15 +315,16 @@ static TBinaryProtocolFactory * gSharedFactory = nil;
 - (NSData *) readBinary
 {
   int32_t size = [self readI32];
-  uint8_t * buff = malloc(size);
+  size_t binarySize = CheckedCastInt32ToSizeT(size);
+  uint8_t * buff = malloc(binarySize);
   if (buff == NULL) {
     @throw [TProtocolException
              exceptionWithName: @"TProtocolException"
              reason: [NSString stringWithFormat: @"Out of memory.  Unable to allocate %d bytes trying to read binary data.",
                                size]];
   }
-  [mTransport readAll: buff offset: 0 length: size];
-  return [NSData dataWithBytesNoCopy: buff length: size];
+  [mTransport readAll: buff offset: 0 length: binarySize];
+  return [NSData dataWithBytesNoCopy: buff length: binarySize];
 }
 
 
@@ -343,7 +400,7 @@ static TBinaryProtocolFactory * gSharedFactory = nil;
     [self writeI32: sequenceID];
   } else {
     [self writeString: name];
-    [self writeByte: messageType];
+    [self writeByte: CheckedCastIntToUInt8(messageType)];
     [self writeI32: sequenceID];
   }
 }
@@ -362,8 +419,8 @@ static TBinaryProtocolFactory * gSharedFactory = nil;
                             type: (int) fieldType
                          fieldID: (int) fieldID
 {
-  [self writeByte: fieldType];
-  [self writeI16: fieldID];
+  [self writeByte: CheckedCastIntToUInt8(fieldType)];
+  [self writeI16: CheckedCastIntToUInt8(fieldID)];
 }
 
 
@@ -413,7 +470,8 @@ static TBinaryProtocolFactory * gSharedFactory = nil;
   if (value != nil) {
     const char * utf8Bytes = [value UTF8String];
     size_t length = strlen(utf8Bytes);
-    [self writeI32: length];
+    int32_t size = CheckedCastSizeTToInt32(length);
+    [self writeI32: size];
     [mTransport write: (uint8_t *) utf8Bytes offset: 0 length: length];
   } else {
     // instead of crashing when we get null, let's write out a zero
@@ -425,7 +483,8 @@ static TBinaryProtocolFactory * gSharedFactory = nil;
 
 - (void) writeBinary: (NSData *) data
 {
-  [self writeI32: [data length]];
+  int32_t size = CheckedCastSizeTToInt32([data length]);
+  [self writeI32: size];
   [mTransport write: [data bytes] offset: 0 length: [data length]];
 }
 
@@ -442,8 +501,8 @@ static TBinaryProtocolFactory * gSharedFactory = nil;
                         valueType: (int) valueType
                              size: (int) size
 {
-  [self writeByte: keyType];
-  [self writeByte: valueType];
+  [self writeByte: CheckedCastIntToUInt8(keyType)];
+  [self writeByte: CheckedCastIntToUInt8(valueType)];
   [self writeI32: size];
 }
 
@@ -453,7 +512,7 @@ static TBinaryProtocolFactory * gSharedFactory = nil;
 - (void) writeSetBeginWithElementType: (int) elementType
                                  size: (int) size
 {
-  [self writeByte: elementType];
+  [self writeByte: CheckedCastIntToUInt8(elementType)];
   [self writeI32: size];
 }
 
@@ -463,7 +522,7 @@ static TBinaryProtocolFactory * gSharedFactory = nil;
 - (void) writeListBeginWithElementType: (int) elementType
                                   size: (int) size
 {
-  [self writeByte: elementType];
+  [self writeByte: CheckedCastIntToUInt8(elementType)];
   [self writeI32: size];
 }
 

http://git-wip-us.apache.org/repos/asf/thrift/blob/6b61601c/lib/cocoa/src/server/TSocketServer.m
----------------------------------------------------------------------
diff --git a/lib/cocoa/src/server/TSocketServer.m b/lib/cocoa/src/server/TSocketServer.m
index 4941445..07bc829 100644
--- a/lib/cocoa/src/server/TSocketServer.m
+++ b/lib/cocoa/src/server/TSocketServer.m
@@ -37,7 +37,7 @@ NSString * const kTSockerServer_TransportKey = @"TSockerServer_Transport";
 
 - (id) initWithPort: (int) port
     protocolFactory: (id <TProtocolFactory>) protocolFactory
-   processorFactory: (id <TProcessorFactory>) processorFactory;
+   processorFactory: (id <TProcessorFactory>) processorFactory
 {
   self = [super init];
 
@@ -49,7 +49,9 @@ NSString * const kTSockerServer_TransportKey = @"TSockerServer_Transport";
   int fd = -1;
   CFSocketRef socket = CFSocketCreate(kCFAllocatorDefault, PF_INET, SOCK_STREAM, IPPROTO_TCP, 0, NULL, NULL);
   if (socket) {
-    CFSocketSetSocketFlags(socket, CFSocketGetSocketFlags(socket) & ~kCFSocketCloseOnInvalidate);
+    CFOptionFlags flagsToClear = kCFSocketCloseOnInvalidate;
+    CFSocketSetSocketFlags(socket,  CFSocketGetSocketFlags(socket) & ~flagsToClear);
+
     fd = CFSocketGetNative(socket);
     int yes = 1;
     setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (void *)&yes, sizeof(yes));
@@ -137,6 +139,7 @@ NSString * const kTSockerServer_TransportKey = @"TSockerServer_Transport";
             } while (result);
         }
         @catch (TTransportException * te) {
+            (void)te;
             //NSLog(@"Caught transport exception, abandoning client connection: %@", te);
         }
         

http://git-wip-us.apache.org/repos/asf/thrift/blob/6b61601c/lib/cocoa/src/transport/TFramedTransport.m
----------------------------------------------------------------------
diff --git a/lib/cocoa/src/transport/TFramedTransport.m b/lib/cocoa/src/transport/TFramedTransport.m
index 085f9b6..2148806 100644
--- a/lib/cocoa/src/transport/TFramedTransport.m
+++ b/lib/cocoa/src/transport/TFramedTransport.m
@@ -52,20 +52,21 @@
 
 - (void)flush
 {
-    int len = [writeBuffer length];
-    int data_len = len - HEADER_SIZE;
-    if (data_len < 0)
+    size_t headerAndDataLength = [writeBuffer length];
+    if (headerAndDataLength < HEADER_SIZE) {
         @throw [TTransportException exceptionWithReason:@"Framed transport buffer has no header"];
+    }
 
+    size_t dataLength = headerAndDataLength - HEADER_SIZE;
     uint8_t i32rd[HEADER_SIZE];
-    i32rd[0] = (uint8_t)(0xff & (data_len >> 24));
-    i32rd[1] = (uint8_t)(0xff & (data_len >> 16));
-    i32rd[2] = (uint8_t)(0xff & (data_len >> 8));
-    i32rd[3] = (uint8_t)(0xff & (data_len));
+    i32rd[0] = (uint8_t)(0xff & (dataLength >> 24));
+    i32rd[1] = (uint8_t)(0xff & (dataLength >> 16));
+    i32rd[2] = (uint8_t)(0xff & (dataLength >> 8));
+    i32rd[3] = (uint8_t)(0xff & (dataLength));
 
     // should we make a copy of the writeBuffer instead? Better for threaded operations!
     [writeBuffer replaceBytesInRange:NSMakeRange(0, HEADER_SIZE) withBytes:i32rd length:HEADER_SIZE];
-    [mTransport write:[writeBuffer mutableBytes] offset:0 length:len];
+    [mTransport write:[writeBuffer mutableBytes] offset:0 length:headerAndDataLength];
     [mTransport flush];
 
     // reuse old memory buffer
@@ -73,54 +74,70 @@
     [writeBuffer appendBytes:dummy_header length:HEADER_SIZE];
 }
 
-- (void)write:(const uint8_t *)data offset:(unsigned int)offset length:(unsigned int)length
+- (void) write: (const uint8_t *) data offset: (size_t) offset length: (size_t) length
 {
     [writeBuffer appendBytes:data+offset length:length];
 }
 
-- (int)readAll:(uint8_t *)buf offset:(int)off length:(int)len {
+- (size_t) readAll: (uint8_t *) buf offset: (size_t) offset length: (size_t) length
+{
     if (readBuffer == nil) {
         [self readFrame];
     }
     
     if (readBuffer != nil) {
-        int buffer_len = [readBuffer length];
-        if (buffer_len-readOffset >= len) {
-            [readBuffer getBytes:buf range:NSMakeRange(readOffset,len)]; // copy data
-            readOffset += len;
+        size_t bufferLength = [readBuffer length];
+        if (bufferLength - readOffset >= length) {
+            [readBuffer getBytes:buf range:NSMakeRange(readOffset,length)]; // copy data
+            readOffset += length;
         } else {
             // void the previous readBuffer data and request a new frame
             [self readFrame];
-            [readBuffer getBytes:buf range:NSMakeRange(0,len)]; // copy data
-            readOffset = len;
+            [readBuffer getBytes:buf range:NSMakeRange(0,length)]; // copy data
+            readOffset = length;
         }
     }
-    return len;
+    return length;
 }
 
 - (void)readFrame
 {
     uint8_t i32rd[HEADER_SIZE];
     [mTransport readAll: i32rd offset: 0 length: HEADER_SIZE];
-    int size =
+    int32_t headerValue =
         ((i32rd[0] & 0xff) << 24) |
         ((i32rd[1] & 0xff) << 16) |
         ((i32rd[2] & 0xff) <<  8) |
         ((i32rd[3] & 0xff));
+    if (headerValue < 0) {
+        NSString *reason = [NSString stringWithFormat:
+                            @"Frame header reports negative frame size: %"PRId32,
+                            headerValue];
+        @throw [TTransportException exceptionWithReason:reason];
+    }
+
+    /* Cast should be safe:
+     * Have verified headerValue non-negative and of lesser or equal bitwidth to size_t. */
+    size_t frameSize = (size_t)headerValue;
+    [self ensureReadBufferHasLength:frameSize];
 
+    [mTransport readAll:[readBuffer mutableBytes] offset:0 length:frameSize];
+}
+
+- (void)ensureReadBufferHasLength:(size_t)length
+{
     if (readBuffer == nil) {
-        readBuffer = [[NSMutableData alloc] initWithLength:size];
+        readBuffer = [[NSMutableData alloc] initWithLength:length];
     } else {
-        int len = [readBuffer length];
-        if (len >= size) {
-            [readBuffer setLength:size];
+        size_t currentLength = [readBuffer length];
+        BOOL isTooLong = (currentLength >= length);
+        if (isTooLong) {
+            [readBuffer setLength:length];
         } else {
-            // increase length of data buffer
-            [readBuffer increaseLengthBy:size-len];
+            size_t lengthToAdd = length - currentLength;
+            [readBuffer increaseLengthBy:lengthToAdd];
         }
     }
-    // copy into internal memory buffer
-    [mTransport readAll:[readBuffer mutableBytes] offset:0 length:size];
 }
 
 @end

http://git-wip-us.apache.org/repos/asf/thrift/blob/6b61601c/lib/cocoa/src/transport/THTTPClient.h
----------------------------------------------------------------------
diff --git a/lib/cocoa/src/transport/THTTPClient.h b/lib/cocoa/src/transport/THTTPClient.h
index 4d57840..78935fb 100644
--- a/lib/cocoa/src/transport/THTTPClient.h
+++ b/lib/cocoa/src/transport/THTTPClient.h
@@ -25,7 +25,7 @@
   NSMutableURLRequest * mRequest;
   NSMutableData * mRequestData;
   NSData * mResponseData;
-  int mResponseDataOffset;
+  size_t mResponseDataOffset;
   NSString * mUserAgent;
   int mTimeout;
 }

http://git-wip-us.apache.org/repos/asf/thrift/blob/6b61601c/lib/cocoa/src/transport/THTTPClient.m
----------------------------------------------------------------------
diff --git a/lib/cocoa/src/transport/THTTPClient.m b/lib/cocoa/src/transport/THTTPClient.m
index 5617d45..169927c 100644
--- a/lib/cocoa/src/transport/THTTPClient.m
+++ b/lib/cocoa/src/transport/THTTPClient.m
@@ -102,20 +102,20 @@
 }
 
 
-- (int) readAll: (uint8_t *) buf offset: (int) off length: (int) len
+- (size_t) readAll: (uint8_t *) buf offset: (size_t) offset length: (size_t) length
 {
   NSRange r;
   r.location = mResponseDataOffset;
-  r.length = len;
+  r.length = length;
 
-  [mResponseData getBytes: buf+off range: r];
-  mResponseDataOffset += len;
+  [mResponseData getBytes: buf+offset range: r];
+  mResponseDataOffset += length;
 
-  return len;
+  return length;
 }
 
 
-- (void) write: (const uint8_t *) data offset: (unsigned int) offset length: (unsigned int) length
+- (void) write: (const uint8_t *) data offset: (size_t) offset length: (size_t) length
 {
   [mRequestData appendBytes: data+offset length: length];
 }
@@ -147,8 +147,8 @@
   NSHTTPURLResponse * httpResponse = (NSHTTPURLResponse *) response;
   if ([httpResponse statusCode] != 200) {
     @throw [TTransportException exceptionWithName: @"TTransportException"
-                                           reason: [NSString stringWithFormat: @"Bad response from HTTP server: %d",
-                                                    [httpResponse statusCode]]];
+                                           reason: [NSString stringWithFormat: @"Bad response from HTTP server: %ld",
+                                                    (long)[httpResponse statusCode]]];
   }
 
   // phew!

http://git-wip-us.apache.org/repos/asf/thrift/blob/6b61601c/lib/cocoa/src/transport/TMemoryBuffer.m
----------------------------------------------------------------------
diff --git a/lib/cocoa/src/transport/TMemoryBuffer.m b/lib/cocoa/src/transport/TMemoryBuffer.m
index c3801c7..4513ab8 100644
--- a/lib/cocoa/src/transport/TMemoryBuffer.m
+++ b/lib/cocoa/src/transport/TMemoryBuffer.m
@@ -25,7 +25,7 @@
 
 @implementation TMemoryBuffer
 - (id)init {
-	if (self = [super init]) {
+	if ((self = [super init])) {
 		mBuffer = [[NSMutableData alloc] init];
 		mOffset = 0;
 	}
@@ -33,27 +33,29 @@
 }
 
 - (id)initWithData:(NSData *)data {
-	if (self = [super init]) {
+	if ((self = [super init])) {
 		mBuffer = [data mutableCopy];
 		mOffset = 0;
 	}
 	return self;
 }
 
-- (int)readAll:(uint8_t *)buf offset:(int)off length:(int)len {
-	if ([mBuffer length] - mOffset < len) {
+- (size_t) readAll: (uint8_t *) buf offset: (size_t) offset length: (size_t) length
+{
+	if ([mBuffer length] - mOffset < length) {
 		@throw [TTransportException exceptionWithReason:@"Not enough bytes remain in buffer"];
 	}
-	[mBuffer getBytes:buf range:NSMakeRange(mOffset, len)];
-	mOffset += len;
+	[mBuffer getBytes:buf range:NSMakeRange(mOffset, length)];
+	mOffset += length;
 	if (mOffset >= GARBAGE_BUFFER_SIZE) {
 		[mBuffer replaceBytesInRange:NSMakeRange(0, mOffset) withBytes:NULL length:0];
 		mOffset = 0;
 	}
-	return len;
+	return length;
 }
 
-- (void)write:(const uint8_t *)data offset:(unsigned int)offset length:(unsigned int)length {
+- (void) write: (const uint8_t *) data offset: (size_t) offset length: (size_t) length
+{
 	[mBuffer appendBytes:data+offset length:length];
 }
 

http://git-wip-us.apache.org/repos/asf/thrift/blob/6b61601c/lib/cocoa/src/transport/TNSFileHandleTransport.m
----------------------------------------------------------------------
diff --git a/lib/cocoa/src/transport/TNSFileHandleTransport.m b/lib/cocoa/src/transport/TNSFileHandleTransport.m
index 0ff200b..c2b18ca 100644
--- a/lib/cocoa/src/transport/TNSFileHandleTransport.m
+++ b/lib/cocoa/src/transport/TNSFileHandleTransport.m
@@ -51,26 +51,26 @@
 }
 
 
-- (int) readAll: (uint8_t *) buf offset: (int) off length: (int) len
+- (size_t) readAll: (uint8_t *) buf offset: (size_t) offset length: (size_t) length
 {
-  int got = 0;
-  while (got < len) {
-    NSData * d = [mInputFileHandle readDataOfLength: len-got];
-    if ([d length] == 0) {
+  size_t totalBytesRead = 0;
+  while (totalBytesRead < length) {
+    NSData * data = [mInputFileHandle readDataOfLength: length-totalBytesRead];
+    if ([data length] == 0) {
       @throw [TTransportException exceptionWithName: @"TTransportException"
                                   reason: @"Cannot read. No more data."];
     }
-    [d getBytes: buf+got];
-    got += [d length];
+    [data getBytes: buf+totalBytesRead];
+    totalBytesRead += [data length];
   }
-  return got;
+  return totalBytesRead;
 }
 
 
-- (void) write: (const uint8_t *) data offset: (unsigned int) offset length: (unsigned int) length
+- (void) write: (const uint8_t *) data offset: (size_t) offset length: (size_t) length
 {
-  void *pos = (void *) data + offset;
-  NSData * dataObject = [[NSData alloc] initWithBytesNoCopy: pos // data+offset
+  const void *pos = data + offset;
+  NSData * dataObject = [[NSData alloc] initWithBytesNoCopy: (void *)pos
                                                      length: length
                                                freeWhenDone: NO];
 

http://git-wip-us.apache.org/repos/asf/thrift/blob/6b61601c/lib/cocoa/src/transport/TNSStreamTransport.m
----------------------------------------------------------------------
diff --git a/lib/cocoa/src/transport/TNSStreamTransport.m b/lib/cocoa/src/transport/TNSStreamTransport.m
index e2bc249..7ac1cdc 100644
--- a/lib/cocoa/src/transport/TNSStreamTransport.m
+++ b/lib/cocoa/src/transport/TNSStreamTransport.m
@@ -51,34 +51,40 @@
 }
 
 
-- (int) readAll: (uint8_t *) buf offset: (int) off length: (int) len
+- (size_t) readAll: (uint8_t *) buf offset: (size_t) offset length: (size_t) length
 {
-  int got = 0;
-  int ret = 0;
-  while (got < len) {
-    ret = [self.mInput read: buf+off+got maxLength: len-got];
-    if (ret <= 0) {
+  size_t totalBytesRead = 0;
+  ssize_t bytesRead = 0;
+  while (totalBytesRead < length) {
+    bytesRead = [self.mInput read: buf+offset+totalBytesRead maxLength: length-totalBytesRead];
+
+    BOOL encounteredErrorOrEOF = (bytesRead <= 0);
+    if (encounteredErrorOrEOF) {
       @throw [TTransportException exceptionWithReason: @"Cannot read. Remote side has closed."];
+    } else {
+        /* bytesRead is guaranteed to be positive and within the range representable by size_t. */
+        totalBytesRead += (size_t)bytesRead;
     }
-    got += ret;
   }
-  return got;
+  return totalBytesRead;
 }
 
 
-- (void) write: (const uint8_t *) data offset: (unsigned int) offset length: (unsigned int) length
+- (void) write: (const uint8_t *) data offset: (size_t) offset length: (size_t) length
 {
-  int got = 0;
-  int result = 0;
-  while (got < length) {
-    result = [self.mOutput write: data+offset+got maxLength: length-got];
-    if (result == -1) {
+  size_t totalBytesWritten = 0;
+  ssize_t bytesWritten = 0;
+  while (totalBytesWritten < length) {
+    bytesWritten = [self.mOutput write: data+offset+totalBytesWritten maxLength: length-totalBytesWritten];
+    if (bytesWritten < 0) {
       @throw [TTransportException exceptionWithReason: @"Error writing to transport output stream."
                                                 error: [self.mOutput streamError]];
-    } else if (result == 0) {
+    } else if (bytesWritten == 0) {
       @throw [TTransportException exceptionWithReason: @"End of output stream."];
+    } else {
+        /* bytesWritten is guaranteed to be positive and within the range representable by size_t. */
+        totalBytesWritten += (size_t)bytesWritten;
     }
-    got += result;
   }
 }
 

http://git-wip-us.apache.org/repos/asf/thrift/blob/6b61601c/lib/cocoa/src/transport/TSSLSocketClient.m
----------------------------------------------------------------------
diff --git a/lib/cocoa/src/transport/TSSLSocketClient.m b/lib/cocoa/src/transport/TSSLSocketClient.m
index 5be04ef..d8c55d6 100644
--- a/lib/cocoa/src/transport/TSSLSocketClient.m
+++ b/lib/cocoa/src/transport/TSSLSocketClient.m
@@ -59,10 +59,10 @@
             break;
         }
     }
-    
+
     memset (&pin, 0, sizeof(pin));
     pin.sin_family = AF_INET;
-    pin.sin_addr.s_addr = ((struct in_addr *) (hp->h_addr))->s_addr;
+    memcpy(&pin.sin_addr, hp->h_addr, sizeof(struct in_addr));
     pin.sin_port = htons (port);
     
     /* create the socket */
@@ -199,8 +199,6 @@
         }
         case NSStreamEventEndEncountered:
             break;
-        default:
-            break;
     }
 }
 

http://git-wip-us.apache.org/repos/asf/thrift/blob/6b61601c/lib/cocoa/src/transport/TSocketClient.h
----------------------------------------------------------------------
diff --git a/lib/cocoa/src/transport/TSocketClient.h b/lib/cocoa/src/transport/TSocketClient.h
index 372850f..81a0247 100644
--- a/lib/cocoa/src/transport/TSocketClient.h
+++ b/lib/cocoa/src/transport/TSocketClient.h
@@ -28,7 +28,7 @@
 }
 
 - (id) initWithHostname: (NSString *) hostname
-                   port: (int) port;
+                   port: (UInt32) port;
 
 @end
 

http://git-wip-us.apache.org/repos/asf/thrift/blob/6b61601c/lib/cocoa/src/transport/TSocketClient.m
----------------------------------------------------------------------
diff --git a/lib/cocoa/src/transport/TSocketClient.m b/lib/cocoa/src/transport/TSocketClient.m
index 1a7eea8..b0bac74 100644
--- a/lib/cocoa/src/transport/TSocketClient.m
+++ b/lib/cocoa/src/transport/TSocketClient.m
@@ -35,7 +35,7 @@
 @implementation TSocketClient
 
 - (id) initWithHostname: (NSString *) hostname
-                   port: (int) port
+                   port: (UInt32) port
 {
 	inputStream = NULL;
 	outputStream = NULL;

http://git-wip-us.apache.org/repos/asf/thrift/blob/6b61601c/lib/cocoa/src/transport/TTransport.h
----------------------------------------------------------------------
diff --git a/lib/cocoa/src/transport/TTransport.h b/lib/cocoa/src/transport/TTransport.h
index 61ebbd2..83aad9e 100644
--- a/lib/cocoa/src/transport/TTransport.h
+++ b/lib/cocoa/src/transport/TTransport.h
@@ -23,14 +23,14 @@
    * Guarantees that all of len bytes are read
    *
    * @param buf Buffer to read into
-   * @param off Index in buffer to start storing bytes at
-   * @param len Maximum number of bytes to read
+   * @param offset Index in buffer to start storing bytes at
+   * @param length Maximum number of bytes to read
    * @return The number of bytes actually read, which must be equal to len
    * @throws TTransportException if there was an error reading data
    */
-- (int) readAll: (uint8_t *) buf offset: (int) off length: (int) len;
+- (size_t) readAll: (uint8_t *) buf offset: (size_t) offset length: (size_t) length;
 
-- (void) write: (const uint8_t *) data offset: (unsigned int) offset length: (unsigned int) length;
+- (void) write: (const uint8_t *) data offset: (size_t) offset length: (size_t) length;
 
 - (void) flush;
 @end