Fix possible bad access bug

This commit is contained in:
achmizs 2015-12-24 23:31:30 -05:00
parent ba62ccdfc3
commit 2ad67cd856
5 changed files with 41 additions and 31 deletions

View File

@ -81,8 +81,8 @@
_name = name; _name = name;
_encoding = NSUTF8StringEncoding; _encoding = NSUTF8StringEncoding;
_topic = [NSData dataWithBytes:"\0" length:1]; _topic = [NSData dataWithBlankCString];
_modes = [NSData dataWithBytes:"\0" length:1]; _modes = [NSData dataWithBlankCString];
} }
return self; return self;

View File

@ -290,16 +290,16 @@
/** Returns the nick part of a nick!user@host string. /** 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 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 May be blank if the user component can't be found
is not, in fact, in nick!user@host format). (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 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 May be blank if the host component can't be found
is not, in fact, in nick!user@host format). (i.e. if the passed string is not, in fact, in nick!user@host format).
*/ */
NSData* getHostFromNickUserHost(NSData *nuh); NSData* getHostFromNickUserHost(NSData *nickUserHost);

View File

@ -552,48 +552,48 @@ static NSDictionary* ircNumericCodeList;
#pragma mark - Useful helper functions #pragma mark - Useful helper functions
/*************************************/ /*************************************/
NSData* getNickFromNickUserHost(NSData *nuh) NSData* getNickFromNickUserHost(NSData *nickUserHost)
{ {
char* nick_user_host_buf = malloc(nuh.length); char *nick_user_host_buf = malloc(nickUserHost.length);
[nuh getBytes:nick_user_host_buf]; [nickUserHost getBytes:nick_user_host_buf];
char *nick_buf; char *nick_buf;
nick_buf = strtok(nick_user_host_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); free(nick_user_host_buf);
return nick; return nick;
} }
NSData* getUserFromNickUserHost(NSData *nuh) NSData* getUserFromNickUserHost(NSData *nickUserHost)
{ {
char* nick_user_host_buf = malloc(nuh.length); char *nick_user_host_buf = malloc(nickUserHost.length);
[nuh getBytes:nick_user_host_buf]; [nickUserHost getBytes:nick_user_host_buf];
char *nick_buf, *user_buf; char *nick_buf, *user_buf;
nick_buf = strtok(nick_user_host_buf, "!"); nick_buf = strtok(nick_user_host_buf, "!");
user_buf = strtok(NULL, "@"); 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); free(nick_user_host_buf);
return user; return user;
} }
NSData* getHostFromNickUserHost(NSData *nuh) NSData* getHostFromNickUserHost(NSData *nickUserHost)
{ {
char* nick_user_host_buf = malloc(nuh.length); char *nick_user_host_buf = malloc(nickUserHost.length);
[nuh getBytes:nick_user_host_buf]; [nickUserHost getBytes:nick_user_host_buf];
char *nick_buf, *user_buf, *host_buf; char *nick_buf, *user_buf, *host_buf;
nick_buf = strtok(nick_user_host_buf, "!"); nick_buf = strtok(nick_user_host_buf, "!");
user_buf = strtok(NULL, "@"); user_buf = strtok(NULL, "@");
host_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); 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); IRCClientSession *clientSession = (__bridge IRCClientSession *) irc_get_ctx(session);
NSData *nick = [NSData dataWithBytes:origin length:strlen(origin) + 1]; 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]; [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 *nick = [NSData dataWithBytes:origin length:strlen(origin) + 1];
NSData *channelName = [NSData dataWithBytes:params[0] length:strlen(params[0]) + 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]; [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 *nick = [NSData dataWithBytes:origin length:strlen(origin) + 1];
NSData *channelName = [NSData dataWithBytes:params[0] length:strlen(params[0]) + 1]; NSData *channelName = [NSData dataWithBytes:params[0] length:strlen(params[0]) + 1];
NSData *mode = [NSData dataWithBytes:params[1] length:strlen(params[1]) + 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]; [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 *nick = [NSData dataWithBytes:origin length:strlen(origin) + 1];
NSData *channelName = [NSData dataWithBytes:params[0] length:strlen(params[0]) + 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]; [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 *byNick = [NSData dataWithBytes:origin length:strlen(origin) + 1];
NSData *channelName = [NSData dataWithBytes:params[0] length:strlen(params[0]) + 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 *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]; [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 *nick = [NSData dataWithBytes:origin length:strlen(origin) + 1];
NSData *channelName = [NSData dataWithBytes:params[0] length:strlen(params[0]) + 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]; [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); IRCClientSession *clientSession = (__bridge IRCClientSession *) irc_get_ctx(session);
NSData *nick = [NSData dataWithBytes:origin length:strlen(origin) + 1]; 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]; [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); IRCClientSession *clientSession = (__bridge IRCClientSession *) irc_get_ctx(session);
NSData *nick = [NSData dataWithBytes:origin length:strlen(origin) + 1]; 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]; [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 *nick = [NSData dataWithBytes:origin length:strlen(origin) + 1];
NSData *channelName = [NSData dataWithBytes:params[0] length:strlen(params[0]) + 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]; [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); IRCClientSession *clientSession = (__bridge IRCClientSession *) irc_get_ctx(session);
NSData *eventType = [NSData dataWithBytes:event length:strlen(event) + 1]; 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]; NSMutableArray *paramsArray = [NSMutableArray arrayWithCapacity:count];
for (unsigned int i = 0; i < count; i++) for (unsigned int i = 0; i < count; i++)
{ {

View File

@ -87,4 +87,9 @@
*/ */
@property (readonly) NSData *SA_dataWithUnterminatedByteString; @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 @end

View File

@ -75,4 +75,9 @@
} }
} }
+(NSData *)dataWithBlankCString
{
return [NSData dataWithBytes:"\0" length:1];
}
@end @end