瀏覽代碼

Fix possible bad access bug

master
achmizs 10 年之前
父節點
當前提交
2ad67cd856

+ 2
- 2
IRCClient/IRCClientChannel.m 查看文件



_name = name; _name = name;
_encoding = NSUTF8StringEncoding; _encoding = NSUTF8StringEncoding;
_topic = [NSData dataWithBytes:"\0" length:1];
_modes = [NSData dataWithBytes:"\0" length:1];
_topic = [NSData dataWithBlankCString];
_modes = [NSData dataWithBlankCString];
} }
return self; return self;

+ 7
- 7
IRCClient/IRCClientSession.h 查看文件



/** 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
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 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);

+ 22
- 22
IRCClient/IRCClientSession.m 查看文件

#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);
[nuh getBytes:nick_user_host_buf];
char *nick_user_host_buf = malloc(nickUserHost.length);
[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);
[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; 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);
[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; 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);
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];
} }
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];
} }
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];
} }
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];
} }
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];
} }
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];
} }
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];
} }
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];
} }
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];
} }
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++)
{ {

+ 5
- 0
NSData+SA_NSDataExtensions/NSData+SA_NSDataExtensions.h 查看文件

*/ */
@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

+ 5
- 0
NSData+SA_NSDataExtensions/NSData+SA_NSDataExtensions.m 查看文件

} }
} }


+(NSData *)dataWithBlankCString
{
return [NSData dataWithBytes:"\0" length:1];
}

@end @end

Loading…
取消
儲存