On Tue, Jul 31, 2018 at 04:24:53AM -0700, Aaron Burrow wrote:
> This ii behavior is surprising.
> 
> user$ ruby -e "puts 'A'*512+'B'*20" > server/channel/in
> 
> user$ tail -f server/channel/out 
> 1533032971 -!- nick(~nick@1.2.3.4) has joined #channel
> 1533033745 <nick> 
> AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
> 1533033745 <nick> BBBBBBBBBBBBBBBBBBBB
> 
> 
> Consider this,
> user$ ruby -e "puts '/privmsg #myfriend789 That party was great...' + 
> 'A'*467+'/l ipstickgirl gave really great -- omg everyone is totally reading 
> this'" > server/channel/in 
> 
> Meanwhile...
> [07:07] == nick [~nick@1.2.3.4] has left #channel ["ipstickgirl gave really 
> great -- omg everyone is totally reading this"]
> 
> The relevant function is read_line
> 
> static int
> read_line(int fd, char *buf, size_t bufsiz)
> {
>       size_t i = 0;
>       char c = '\0';
> 
>       do {
>               if (read(fd, &c, sizeof(char)) != sizeof(char))
>                       return -1;
>               buf[i++] = c;
>       } while (c != '\n' && i < bufsiz);
>       buf[i - 1] = '\0'; /* eliminates '\n' */
>       return 0;
> }
> 
> One idea is to use a large buffer with size IRC_MSG_MAX*5 then terminate the 
> program if read_line fails to find a linefeed.  Later in proc_channels_input 
> we can decide not to send the message if it's larger than IRC_MSG_MAX.
> 
> The obvious but complex option is too add buffering.
> 
> --
> burrows
> 

Just split or truncate the messages and add a newline?

-- 
Kind regards,
Hiltjo

Reply via email to