libpurple/protocols/irc/cmds.c

branch
irc-len-fix
changeset 37914
cebd73cb4a33
parent 36098
4951752ad038
child 38240
0552f69f1996
equal deleted inserted replaced
37910:5ca05cfcbd3a 37914:cebd73cb4a33
420 return 0; 420 return 0;
421 } 421 }
422 422
423 int irc_cmd_privmsg(struct irc_conn *irc, const char *cmd, const char *target, const char **args) 423 int irc_cmd_privmsg(struct irc_conn *irc, const char *cmd, const char *target, const char **args)
424 { 424 {
425 int max_privmsg_arg_len;
425 const char *cur, *end; 426 const char *cur, *end;
427 gchar *salvaged;
426 char *msg, *buf; 428 char *msg, *buf;
427 429
428 if (!args || !args[0] || !args[1]) 430 if (!args || !args[0] || !args[1])
429 return 0; 431 return 0;
430 432
431 cur = args[1]; 433 max_privmsg_arg_len = IRC_MAX_MSG_SIZE - strlen(args[0]) - 64;
432 end = args[1]; 434 salvaged = purple_utf8_salvage(args[1]);
435 cur = salvaged;
436 end = salvaged;
433 while (*end && *cur) { 437 while (*end && *cur) {
434 end = strchr(cur, '\n'); 438 end = strchr(cur, '\n');
435 if (!end) 439 if (!end)
436 end = cur + strlen(cur); 440 end = cur + strlen(cur);
441 if (end - cur > max_privmsg_arg_len) {
442 /* this call is used to find the last valid character position in the first
443 * max_privmsg_arg_len bytes of the utf-8 message
444 */
445 g_utf8_validate(cur, max_privmsg_arg_len, &end);
446 }
447
437 msg = g_strndup(cur, end - cur); 448 msg = g_strndup(cur, end - cur);
438 449
439 if(!strcmp(cmd, "notice")) 450 if(!strcmp(cmd, "notice"))
440 buf = irc_format(irc, "vt:", "NOTICE", args[0], msg); 451 buf = irc_format(irc, "vt:", "NOTICE", args[0], msg);
441 else 452 else
442 buf = irc_format(irc, "vt:", "PRIVMSG", args[0], msg); 453 buf = irc_format(irc, "vt:", "PRIVMSG", args[0], msg);
443 454
444 irc_send(irc, buf); 455 irc_send(irc, buf);
445 g_free(msg); 456 g_free(msg);
446 g_free(buf); 457 g_free(buf);
447 cur = end + 1; 458 cur = end;
448 } 459 if(*cur == '\n') {
460 cur++;
461 }
462 }
463
464 g_free(salvaged);
449 465
450 return 0; 466 return 0;
451 } 467 }
452 468
453 int irc_cmd_quit(struct irc_conn *irc, const char *cmd, const char *target, const char **args) 469 int irc_cmd_quit(struct irc_conn *irc, const char *cmd, const char *target, const char **args)

mercurial