From 2ad67cd8562d0725b8b56b3dc4ad8e883812c08a Mon Sep 17 00:00:00 2001 From: achmizs Date: Thu, 24 Dec 2015 23:31:30 -0500 Subject: [PATCH] Fix possible bad access bug --- IRCClient/IRCClientChannel.m | 4 +- IRCClient/IRCClientSession.h | 14 +++--- IRCClient/IRCClientSession.m | 44 +++++++++---------- .../NSData+SA_NSDataExtensions.h | 5 +++ .../NSData+SA_NSDataExtensions.m | 5 +++ 5 files changed, 41 insertions(+), 31 deletions(-) diff --git a/IRCClient/IRCClientChannel.m b/IRCClient/IRCClientChannel.m index 9456c7f..e3f02ad 100644 --- a/IRCClient/IRCClientChannel.m +++ b/IRCClient/IRCClientChannel.m @@ -81,8 +81,8 @@ _name = name; _encoding = NSUTF8StringEncoding; - _topic = [NSData dataWithBytes:"\0" length:1]; - _modes = [NSData dataWithBytes:"\0" length:1]; + _topic = [NSData dataWithBlankCString]; + _modes = [NSData dataWithBlankCString]; } return self; diff --git a/IRCClient/IRCClientSession.h b/IRCClient/IRCClientSession.h index 1bfce79..61ceb8a 100644 --- a/IRCClient/IRCClientSession.h +++ b/IRCClient/IRCClientSession.h @@ -290,16 +290,16 @@ /** Returns the nick part of a nick!user@host string. */ -NSData* getNickFromNickUserHost(NSData *nuh); +NSData* getNickFromNickUserHost(NSData *nickUserHost); /** Returns the user part of a nick!user@host string. - Returns nil if the user component can't be found (i.e. if the passed string - is not, in fact, in nick!user@host format). + May be blank if the user component can't be found + (i.e. if the passed string is not, in fact, in nick!user@host format). */ -NSData* getUserFromNickUserHost(NSData *nuh); +NSData* getUserFromNickUserHost(NSData *nickUserHost); /** Returns the host part of a nick!user@host string. - Returns nil if the host component can't be found (i.e. if the passed string - is not, in fact, in nick!user@host format). + May be blank if the host component can't be found + (i.e. if the passed string is not, in fact, in nick!user@host format). */ -NSData* getHostFromNickUserHost(NSData *nuh); +NSData* getHostFromNickUserHost(NSData *nickUserHost); diff --git a/IRCClient/IRCClientSession.m b/IRCClient/IRCClientSession.m index 791aabd..bef38ae 100644 --- a/IRCClient/IRCClientSession.m +++ b/IRCClient/IRCClientSession.m @@ -552,48 +552,48 @@ static NSDictionary* ircNumericCodeList; #pragma mark - Useful helper functions /*************************************/ -NSData* getNickFromNickUserHost(NSData *nuh) +NSData* getNickFromNickUserHost(NSData *nickUserHost) { - char* nick_user_host_buf = malloc(nuh.length); - [nuh getBytes:nick_user_host_buf]; + char *nick_user_host_buf = malloc(nickUserHost.length); + [nickUserHost getBytes:nick_user_host_buf]; char *nick_buf; nick_buf = strtok(nick_user_host_buf, "!"); - NSData* nick = (nick_buf != NULL) ? [NSData dataWithBytes:nick_buf length:strlen(nick_buf) + 1] : nil; + NSData *nick = (nick_buf != NULL) ? [NSData dataWithBytes:nick_buf length:strlen(nick_buf) + 1] : [NSData dataWithBlankCString]; free(nick_user_host_buf); return nick; } -NSData* getUserFromNickUserHost(NSData *nuh) +NSData* getUserFromNickUserHost(NSData *nickUserHost) { - char* nick_user_host_buf = malloc(nuh.length); - [nuh getBytes:nick_user_host_buf]; + char *nick_user_host_buf = malloc(nickUserHost.length); + [nickUserHost getBytes:nick_user_host_buf]; char *nick_buf, *user_buf; nick_buf = strtok(nick_user_host_buf, "!"); user_buf = strtok(NULL, "@"); - NSData* user = (user_buf != NULL) ? [NSData dataWithBytes:user_buf length:strlen(user_buf) + 1] : nil; + NSData *user = (user_buf != NULL) ? [NSData dataWithBytes:user_buf length:strlen(user_buf) + 1] : [NSData dataWithBlankCString]; free(nick_user_host_buf); return user; } -NSData* getHostFromNickUserHost(NSData *nuh) +NSData* getHostFromNickUserHost(NSData *nickUserHost) { - char* nick_user_host_buf = malloc(nuh.length); - [nuh getBytes:nick_user_host_buf]; + char *nick_user_host_buf = malloc(nickUserHost.length); + [nickUserHost getBytes:nick_user_host_buf]; char *nick_buf, *user_buf, *host_buf; nick_buf = strtok(nick_user_host_buf, "!"); user_buf = strtok(NULL, "@"); host_buf = strtok(NULL, ""); - NSData* host = (host_buf != NULL) ? [NSData dataWithBytes:host_buf length:strlen(host_buf) + 1] : nil; + NSData *host = (host_buf != NULL) ? [NSData dataWithBytes:host_buf length:strlen(host_buf) + 1] : [NSData dataWithBlankCString]; free(nick_user_host_buf); @@ -646,7 +646,7 @@ static void onQuit(irc_session_t *session, const char *event, const char *origin IRCClientSession *clientSession = (__bridge IRCClientSession *) irc_get_ctx(session); NSData *nick = [NSData dataWithBytes:origin length:strlen(origin) + 1]; - NSData *reason = (count > 0) ? [NSData dataWithBytes:params[0] length:strlen(params[0]) + 1] : [NSData dataWithBytes:"\0" length:1]; + NSData *reason = (count > 0) ? [NSData dataWithBytes:params[0] length:strlen(params[0]) + 1] : [NSData dataWithBlankCString]; [clientSession userQuit:nick withReason:reason]; } @@ -686,7 +686,7 @@ static void onPartChannel(irc_session_t *session, const char *event, const char NSData *nick = [NSData dataWithBytes:origin length:strlen(origin) + 1]; NSData *channelName = [NSData dataWithBytes:params[0] length:strlen(params[0]) + 1]; - NSData *reason = (count > 1) ? [NSData dataWithBytes:params[1] length:strlen(params[1]) + 1] : [NSData dataWithBytes:"\0" length:1]; + NSData *reason = (count > 1) ? [NSData dataWithBytes:params[1] length:strlen(params[1]) + 1] : [NSData dataWithBlankCString]; [clientSession userParted:nick channel:channelName withReason:reason]; } @@ -711,7 +711,7 @@ static void onMode(irc_session_t *session, const char *event, const char *origin NSData *nick = [NSData dataWithBytes:origin length:strlen(origin) + 1]; NSData *channelName = [NSData dataWithBytes:params[0] length:strlen(params[0]) + 1]; NSData *mode = [NSData dataWithBytes:params[1] length:strlen(params[1]) + 1]; - NSData *modeParams = (count > 2) ? [NSData dataWithBytes:params[2] length:strlen(params[2]) + 1] : [NSData dataWithBytes:"\0" length:1]; + NSData *modeParams = (count > 2) ? [NSData dataWithBytes:params[2] length:strlen(params[2]) + 1] : [NSData dataWithBlankCString]; [clientSession modeSet:mode withParams:modeParams forChannel:channelName by:nick]; } @@ -749,7 +749,7 @@ static void onTopic(irc_session_t *session, const char *event, const char *origi NSData *nick = [NSData dataWithBytes:origin length:strlen(origin) + 1]; NSData *channelName = [NSData dataWithBytes:params[0] length:strlen(params[0]) + 1]; - NSData *topic = (count > 1) ? [NSData dataWithBytes:params[1] length:strlen(params[1]) + 1] : [NSData dataWithBytes:"\0" length:1]; + NSData *topic = (count > 1) ? [NSData dataWithBytes:params[1] length:strlen(params[1]) + 1] : [NSData dataWithBlankCString]; [clientSession topicSet:topic forChannel:channelName by:nick]; } @@ -771,7 +771,7 @@ static void onKick(irc_session_t *session, const char *event, const char *origin NSData *byNick = [NSData dataWithBytes:origin length:strlen(origin) + 1]; NSData *channelName = [NSData dataWithBytes:params[0] length:strlen(params[0]) + 1]; NSData *nick = (count > 1) ? [NSData dataWithBytes:params[1] length:strlen(params[1]) + 1] : nil; - NSData *reason = (count > 2) ? [NSData dataWithBytes:params[2] length:strlen(params[2]) + 1] : [NSData dataWithBytes:"\0" length:1]; + NSData *reason = (count > 2) ? [NSData dataWithBytes:params[2] length:strlen(params[2]) + 1] : [NSData dataWithBlankCString]; [clientSession userKicked:nick fromChannel:channelName by:byNick withReason:reason]; } @@ -792,7 +792,7 @@ static void onChannelPrvmsg(irc_session_t *session, const char *event, const cha NSData *nick = [NSData dataWithBytes:origin length:strlen(origin) + 1]; NSData *channelName = [NSData dataWithBytes:params[0] length:strlen(params[0]) + 1]; - NSData *message = (count > 1) ? [NSData dataWithBytes:params[1] length:strlen(params[1]) + 1] : [NSData dataWithBytes:"\0" length:1]; + NSData *message = (count > 1) ? [NSData dataWithBytes:params[1] length:strlen(params[1]) + 1] : [NSData dataWithBlankCString]; [clientSession messageSent:message toChannel:channelName byUser:nick]; } @@ -811,7 +811,7 @@ static void onPrivmsg(irc_session_t *session, const char *event, const char *ori IRCClientSession *clientSession = (__bridge IRCClientSession *) irc_get_ctx(session); NSData *nick = [NSData dataWithBytes:origin length:strlen(origin) + 1]; - NSData *message = (count > 1) ? [NSData dataWithBytes:params[1] length:strlen(params[1]) + 1] : [NSData dataWithBytes:"\0" length:1]; + NSData *message = (count > 1) ? [NSData dataWithBytes:params[1] length:strlen(params[1]) + 1] : [NSData dataWithBlankCString]; [clientSession privateMessageReceived:message fromUser:nick]; } @@ -856,7 +856,7 @@ static void onNotice(irc_session_t *session, const char *event, const char *orig IRCClientSession *clientSession = (__bridge IRCClientSession *) irc_get_ctx(session); NSData *nick = [NSData dataWithBytes:origin length:strlen(origin) + 1]; - NSData *notice = (count > 1) ? [NSData dataWithBytes:params[1] length:strlen(params[1]) + 1] : [NSData dataWithBytes:"\0" length:1]; + NSData *notice = (count > 1) ? [NSData dataWithBytes:params[1] length:strlen(params[1]) + 1] : [NSData dataWithBlankCString]; [clientSession privateNoticeReceived:notice fromUser:nick]; } @@ -880,7 +880,7 @@ static void onChannelNotice(irc_session_t *session, const char *event, const cha NSData *nick = [NSData dataWithBytes:origin length:strlen(origin) + 1]; NSData *channelName = [NSData dataWithBytes:params[0] length:strlen(params[0]) + 1]; - NSData *notice = (count > 1) ? [NSData dataWithBytes:params[1] length:strlen(params[1]) + 1] : [NSData dataWithBytes:"\0" length:1]; + NSData *notice = (count > 1) ? [NSData dataWithBytes:params[1] length:strlen(params[1]) + 1] : [NSData dataWithBlankCString]; [clientSession noticeSent:notice toChannel:channelName byUser:nick]; } @@ -1007,7 +1007,7 @@ static void onUnknownEvent(irc_session_t *session, const char *event, const char IRCClientSession *clientSession = (__bridge IRCClientSession *) irc_get_ctx(session); NSData *eventType = [NSData dataWithBytes:event length:strlen(event) + 1]; - NSData *sender = (origin != NULL) ? [NSData dataWithBytes:origin length:strlen(origin) + 1] : [NSData dataWithBytes:"\0" length:1]; + NSData *sender = (origin != NULL) ? [NSData dataWithBytes:origin length:strlen(origin) + 1] : [NSData dataWithBlankCString]; NSMutableArray *paramsArray = [NSMutableArray arrayWithCapacity:count]; for (unsigned int i = 0; i < count; i++) { diff --git a/NSData+SA_NSDataExtensions/NSData+SA_NSDataExtensions.h b/NSData+SA_NSDataExtensions/NSData+SA_NSDataExtensions.h index 3515dc4..162cc76 100644 --- a/NSData+SA_NSDataExtensions/NSData+SA_NSDataExtensions.h +++ b/NSData+SA_NSDataExtensions/NSData+SA_NSDataExtensions.h @@ -87,4 +87,9 @@ */ @property (readonly) NSData *SA_dataWithUnterminatedByteString; +/** Returns an NSData object containing a blank C string (i.e. a byte sequence + of length 1, containing the null character '\0'). + */ ++(NSData *)dataWithBlankCString; + @end diff --git a/NSData+SA_NSDataExtensions/NSData+SA_NSDataExtensions.m b/NSData+SA_NSDataExtensions/NSData+SA_NSDataExtensions.m index dadd0ab..5b40f90 100644 --- a/NSData+SA_NSDataExtensions/NSData+SA_NSDataExtensions.m +++ b/NSData+SA_NSDataExtensions/NSData+SA_NSDataExtensions.m @@ -75,4 +75,9 @@ } } ++(NSData *)dataWithBlankCString +{ + return [NSData dataWithBytes:"\0" length:1]; +} + @end