OpenPKG CVS Repository http://cvs.openpkg.org/ ____________________________________________________________________________
Server: cvs.openpkg.org Name: Thomas Lotterer Root: /e/openpkg/cvs Email: [EMAIL PROTECTED] Module: openpkg-src Date: 19-Mar-2003 14:59:49 Branch: OPENPKG_1_1_SOLID Handle: 2003031913594900 Added files: (Branch: OPENPKG_1_1_SOLID) openpkg-src/ircii ircii.patch Modified files: (Branch: OPENPKG_1_1_SOLID) openpkg-src/ircii ircii.spec Log: OpenPKG-SA-2003.024-ircii Summary: Revision Changes Path 1.1.4.1 +786 -0 openpkg-src/ircii/ircii.patch 1.25.2.2 +3 -1 openpkg-src/ircii/ircii.spec ____________________________________________________________________________ patch -p0 <<'@@ .' Index: openpkg-src/ircii/ircii.patch ============================================================================ $ cvs diff -u -r0 -r1.1.4.1 ircii.patch --- /dev/null 2003-03-19 14:59:49.000000000 +0100 +++ ircii.patch 2003-03-19 14:59:49.000000000 +0100 @@ -0,0 +1,786 @@ +From: Timo Sirainen <[EMAIL PROTECTED]> +Subject: Buffer overflows in ircII-based clients +Date: 14 Mar 2003 00:17:55 +0200 +Message-ID: <[EMAIL PROTECTED]> + + ircii 20020912 + + 1) [sample IRC commands] overflows ctcp_buffer [...] + 2) cannot_join_channel() allows writing [...] past buffer in stack [...] + 3) Statusbar drawing has several buffer overflows. [...] + 4) Some of the other my_strcat() calls may overflow buffer [...] + + ircii-20030313 fixes these. + +This patch was created by extracting differences from vendor sources by +the [EMAIL PROTECTED] team. It can be applied to +ircii-20020403 and ircii-20021103. + +--- ircii-20021103/source/alias.c Wed Sep 4 18:56:40 2002 ++++ ircii-20030315/source/alias.c Thu Mar 13 12:34:27 2003 +@@ -2923,10 +2923,10 @@ + if ((Client->flags & (DCC_CHAT|DCC_ACTIVE)) == (DCC_CHAT|DCC_ACTIVE)) + { + if (notfirst) +- my_strcat(result, ","); ++ my_strmcat(result, ",", len); + else + notfirst = 1; +- my_strcat(result, Client->user); ++ my_strmcat(result, Client->user, len); + } + + return (result); +@@ -3419,10 +3419,10 @@ + for (nicks = chan->nicks; nicks; nicks = nicks->next) + { + if (notfirst) +- my_strcat(result, " "); ++ my_strmcat(result, " ", len); + else + notfirst = 1; +- my_strcat(result, nicks->nick); ++ my_strmcat(result, nicks->nick, len); + } + + return (result); +--- ircii-20021103/source/ctcp.c Tue Sep 3 04:39:30 2002 ++++ ircii-20030315/source/ctcp.c Thu Mar 13 12:34:27 2003 +@@ -606,7 +606,7 @@ + if (messages > 3) + break; + *(cmd++) = '\0'; +- my_strcat(ctcp_buffer, str); ++ my_strmcat(ctcp_buffer, str, BIG_BUFFER_SIZE); + if ((end = my_index(cmd, CTCP_DELIM_CHAR)) != NULL) + { + messages++; +@@ -631,7 +631,7 @@ + ptr = ctcp_cmd[i].func(&ctcp_cmd[i], from, to, arg_copy); + if (ptr) + { +- my_strcat(ctcp_buffer, ptr); ++ my_strmcat(ctcp_buffer, ptr, BIG_BUFFER_SIZE); + new_free(&ptr); + } + } +@@ -678,7 +678,7 @@ + } + else + { +- my_strcat(ctcp_buffer, CTCP_DELIM_STR); ++ my_strmcat(ctcp_buffer, CTCP_DELIM_STR, BIG_BUFFER_SIZE); + str = cmd; + } + } +@@ -759,7 +759,7 @@ + *CTCP_Reply_Buffer = '\0'; + } + if (*str) +- my_strcat(ctcp_buffer, str); ++ my_strmcat(ctcp_buffer, str, BIG_BUFFER_SIZE); + return (ctcp_buffer); + } + +@@ -791,7 +791,7 @@ + while ((cmd = my_index(str, CTCP_DELIM_CHAR)) != NULL) + do_new_notice_ctcp(from, to, &str, cmd); + in_ctcp_flag = 0; +- my_strcat(ctcp_buffer, str); ++ my_strmcat(ctcp_buffer, str, BIG_BUFFER_SIZE); + return (ctcp_buffer); + } + +@@ -812,7 +812,7 @@ + + flags = 0; + *(cmd++) = '\0'; +- my_strcat(ctcp_buffer, *str); ++ my_strmcat(ctcp_buffer, *str, BIG_BUFFER_SIZE); + if ((end = my_index(cmd, CTCP_DELIM_CHAR)) != NULL) + { + *(end++) = '\0'; +@@ -825,7 +825,7 @@ + { + if ((ptr = ctcp_cmd[i].func(&(ctcp_cmd[i]), from, to, arg_copy)) != NULL) + { +- my_strcat(ctcp_buffer, ptr); ++ my_strmcat(ctcp_buffer, ptr, BIG_BUFFER_SIZE); + new_free(&ptr); + flags = ctcp_cmd[i].flag; + } +@@ -866,7 +866,7 @@ + } + else + { +- my_strcat(ctcp_buffer, CTCP_DELIM_STR); ++ my_strmcat(ctcp_buffer, CTCP_DELIM_STR, BIG_BUFFER_SIZE); + *str = cmd; + } + } +--- ircii-20021103/source/dcc.c Tue Sep 10 15:04:56 2002 ++++ ircii-20030315/source/dcc.c Thu Mar 13 12:34:27 2003 +@@ -844,7 +847,7 @@ + } + if (IS_ABSOLUTE_PATH(filename)) + { +- my_strcpy(FileBuf, filename); ++ my_strmcpy(FileBuf, filename, BIG_BUFFER_SIZE); + } + else if (*filename == '~') + { +@@ -853,14 +856,14 @@ + yell("Unable to expand %s", filename); + return; + } +- my_strcpy(FileBuf, fullname); ++ my_strmcpy(FileBuf, fullname, BIG_BUFFER_SIZE); + new_free(&fullname); + } + else + { + getcwd(CP(FileBuf), sizeof(FileBuf)); +- my_strcat(FileBuf, "/"); +- my_strcat(FileBuf, filename); ++ my_strmcat(FileBuf, "/", BIG_BUFFER_SIZE); ++ my_strmcat(FileBuf, filename, BIG_BUFFER_SIZE); + } + if (0 != access(CP(FileBuf), R_OK)) + { +--- ircii-20021103/source/edit.c Thu Oct 31 13:06:38 2002 ++++ ircii-20030315/source/edit.c Thu Mar 13 12:34:27 2003 +@@ -1282,7 +1282,7 @@ + *(s - 1) = '\0'; + else + n--; +- my_strcpy(buffer, t); ++ my_strmcpy(buffer, t, BIG_BUFFER_SIZE); + t = s; + + if (userhost_cmd) +@@ -1735,11 +1735,11 @@ + u_char *dest; + u_char *msg; + { +- u_char buffer[BIG_BUFFER_SIZE]; ++ u_char buffer[BIG_BUFFER_SIZE+1]; + +- my_strcpy(buffer, dest); +- my_strcat(buffer, " "); +- my_strcat(buffer, msg); ++ my_strmcpy(buffer, dest, BIG_BUFFER_SIZE); ++ my_strmcat(buffer, " ", BIG_BUFFER_SIZE); ++ my_strmcat(buffer, msg, BIG_BUFFER_SIZE); + e_privmsg("PRIVMSG", buffer, NULL); + } + +@@ -2223,11 +2227,11 @@ + { + if (*nick_list) + { +- my_strcat(nick_list, ","); +- my_strcat(nick_list, nick); ++ my_strmcat(nick_list, ",", IRCD_BUFFER_SIZE); ++ my_strmcat(nick_list, nick, IRCD_BUFFER_SIZE); + } + else +- my_strcpy(nick_list, nick); ++ my_strmcpy(nick_list, nick, IRCD_BUFFER_SIZE); + } + do_final_send = 1; + } +@@ -2265,11 +2269,11 @@ + { + if (*nick_list) + { +- my_strcat(nick_list, ","); +- my_strcat(nick_list, nick); ++ my_strmcat(nick_list, ",", IRCD_BUFFER_SIZE); ++ my_strmcat(nick_list, nick, IRCD_BUFFER_SIZE); + } + else +- my_strcpy(nick_list, nick); ++ my_strmcpy(nick_list, nick, IRCD_BUFFER_SIZE); + } + + if (get_int_var(WARN_OF_IGNORES_VAR) && (is_ignored(nick, IGNORE_MSGS) == IGNORED)) +--- ircii-20021103/source/funny.c Thu Aug 29 12:26:38 2002 ++++ ircii-20030315/source/funny.c Thu Mar 13 12:34:27 2003 +@@ -124,7 +124,6 @@ + int i; + u_char buffer1[BIG_BUFFER_SIZE]; + u_char buffer2[BIG_BUFFER_SIZE]; +- u_char *ptr; + + if (!wide_list) + return; +@@ -141,16 +140,13 @@ + { + snprintf(CP(buffer2), sizeof buffer2, "%s(%d) ", wide_list[i]->channel, + wide_list[i]->users); +- ptr = my_index(buffer1, '\0'); + if (my_strlen(buffer1) + my_strlen(buffer2) > current_screen->co - 5) + { + if (do_hook(WIDELIST_LIST, "%s", buffer1)) + say("%s", buffer1); + *buffer1 = '\0'; +- my_strcat(buffer1, buffer2); + } +- else +- my_strcpy(ptr, buffer2); ++ my_strmcat(buffer1, buffer2, BIG_BUFFER_SIZE); + } + if (*buffer1 && do_hook(WIDELIST_LIST, "%s", buffer1)) + say("%s" , buffer1); +@@ -184,7 +180,7 @@ + (u_char) last_width, + (u_char) last_width); + else +- my_strcpy(format, "*** %s\t%-5s %s"); ++ my_strmcpy(format, "*** %s\t%-5s %s", sizeof format); + } + channel = ArgList[0]; + user_cnt = ArgList[1]; +@@ -279,7 +275,7 @@ + (u_char) last_width, + (u_char) last_width); + else +- my_strcpy(format, "%s: %s\t%s"); ++ my_strmcpy(format, "%s: %s\t%s", sizeof format); + } + ptr = line; + for (cnt = -1; ptr; cnt++) +--- ircii-20021103/source/help.c Fri Oct 4 06:50:26 2002 ++++ ircii-20030315/source/help.c Thu Mar 13 12:34:27 2003 +@@ -552,7 +552,7 @@ + u_char *arg_z = (u_char *) 0; + #endif /* ZCAT */ + +- my_strcpy(help_topic_list, topics); ++ my_strmcpy(help_topic_list, topics, BIG_BUFFER_SIZE); + + #ifdef DAEMON_UID + if (DAEMON_UID == getuid()) +@@ -726,10 +726,10 @@ + } + if (stat_buf.st_mode & S_IFDIR) + { +- my_strcpy(path, tmp); ++ my_strmcpy(path, tmp, BIG_BUFFER_SIZE); + if (*help_topic_list) +- my_strcat(help_topic_list, " "); +- my_strcat(help_topic_list, namelist[0]->d_name); ++ my_strmcat(help_topic_list, " ", BIG_BUFFER_SIZE); ++ my_strmcat(help_topic_list, namelist[0]->d_name, BIG_BUFFER_SIZE); + if ((this_arg = next_arg(args, &args)) == + (u_char *) 0) + { +@@ -758,7 +758,7 @@ + } + default: + help_show_directory = 1; +- my_strcpy(paused_topic, help_topic_list); ++ my_strmcpy(paused_topic, help_topic_list, sizeof paused_topic); + help_pause_add_line("*** %s choices:", help_topic_list); + *buffer = (u_char) 0; + cnt = 0; +--- ircii-20021103/source/ignore.c Wed Mar 20 18:03:15 2002 ++++ ircii-20030315/source/ignore.c Thu Mar 13 12:34:27 2003 +@@ -106,7 +106,7 @@ + Ignore *new; + char *msg; + u_char *ptr; +- u_char buffer[BIG_BUFFER_SIZE]; ++ u_char buffer[BIG_BUFFER_SIZE+1]; + + while (nick) + { +@@ -197,25 +197,25 @@ + } + else if (type) + { +- my_strcpy(buffer, msg); ++ my_strmcpy(buffer, msg, BIG_BUFFER_SIZE); + if (type & IGNORE_MSGS) +- my_strcat(buffer, " MSGS"); ++ my_strmcat(buffer, " MSGS", BIG_BUFFER_SIZE); + if (type & IGNORE_PUBLIC) +- my_strcat(buffer, " PUBLIC"); ++ my_strmcat(buffer, " PUBLIC", BIG_BUFFER_SIZE); + if (type & IGNORE_WALLS) +- my_strcat(buffer, " WALLS"); ++ my_strmcat(buffer, " WALLS", BIG_BUFFER_SIZE); + if (type & IGNORE_WALLOPS) +- my_strcat(buffer, " WALLOPS"); ++ my_strmcat(buffer, " WALLOPS", BIG_BUFFER_SIZE); + if (type & IGNORE_INVITES) +- my_strcat(buffer, " INVITES"); ++ my_strmcat(buffer, " INVITES", BIG_BUFFER_SIZE); + if (type & IGNORE_NOTICES) +- my_strcat(buffer, " NOTICES"); ++ my_strmcat(buffer, " NOTICES", BIG_BUFFER_SIZE); + if (type & IGNORE_NOTES) +- my_strcat(buffer, " NOTES"); ++ my_strmcat(buffer, " NOTES", BIG_BUFFER_SIZE); + if (type & IGNORE_CTCPS) +- my_strcat(buffer, " CTCPS"); ++ my_strmcat(buffer, " CTCPS", BIG_BUFFER_SIZE); + if (type & IGNORE_CRAP) +- my_strcat(buffer, " CRAP"); ++ my_strmcat(buffer, " CRAP", BIG_BUFFER_SIZE); + say("%s from %s", buffer, new->nick); + } + if ((new->type == 0) && (new->high == 0)) +--- ircii-20021103/source/ircaux.c Thu Sep 12 08:28:12 2002 ++++ ircii-20030315/source/ircaux.c Thu Mar 13 12:34:27 2003 +@@ -1160,7 +1164,7 @@ + if ((ptr = my_index(path, ':')) != NULL) + #endif /* __MSDOS */ + *(ptr++) = '\0'; +- my_strcpy(lbuf, empty_string); ++ lbuf[0] = 0; + if (path[0] == '~') + { + my_strmcat(lbuf, my_path, BIG_BUFFER_SIZE); +--- ircii-20021103/source/names.c Sun Sep 8 07:09:46 2002 ++++ ircii-20030315/source/names.c Sat Mar 15 05:53:54 2003 +@@ -954,13 +958,13 @@ + { + ChannelList *tmp; + u_char *value = (u_char *) 0; +- u_char buffer[BIG_BUFFER_SIZE]; ++ u_char buffer[BIG_BUFFER_SIZE+1]; + + *buffer = '\0'; + for (tmp = server_list[window->server].chan_list; tmp; tmp = tmp->next) + { +- my_strcat(buffer, tmp->channel); +- my_strcat(buffer, " "); ++ my_strmcat(buffer, tmp->channel, BIG_BUFFER_SIZE); ++ my_strmcat(buffer, " ", BIG_BUFFER_SIZE); + } + malloc_strcpy(&value, buffer); + +--- ircii-20021103/source/notice.c Tue Sep 3 04:39:31 2002 ++++ ircii-20030315/source/notice.c Fri Dec 6 15:33:17 2002 +@@ -388,7 +388,7 @@ + else if ((c = server[strlen(server) - 1]) == ',' || c == '.') + server[strlen(server) - 1] = '\0'; + #endif /* BROKEN_SCANF */ +- server_list[parsing_server_index].attempting_to_connect--; ++ server_list[parsing_server_index].attempting_to_connect = 0; + set_server_motd(parsing_server_index, 1); + server_is_connected(parsing_server_index, 1); + if ((s = my_index(server, '[')) != NULL) +--- ircii-20021103/source/notify.c Thu Aug 29 12:26:41 2002 ++++ ircii-20030315/source/notify.c Thu Mar 13 12:34:27 2003 +@@ -228,8 +228,8 @@ + if (count >= location && count < location + 40) + { + c2++; +- my_strcat(buf, " "); +- my_strcat(buf, tmp->nick); ++ my_strmcat(buf, " ", BIG_BUFFER_SIZE); ++ my_strmcat(buf, tmp->nick, BIG_BUFFER_SIZE); + } + } + if (c2) +--- ircii-20021103/source/numbers.c Sat Sep 7 09:19:45 2002 ++++ ircii-20030315/source/numbers.c Thu Mar 13 12:34:28 2003 +@@ -307,7 +277,7 @@ + **ArgList; + { + u_char *chan; +- u_char buffer[BIG_BUFFER_SIZE]; ++ u_char buffer[BIG_BUFFER_SIZE + 1]; + + if (ArgList[0]) + chan = ArgList[0]; +@@ -322,23 +292,23 @@ + + PasteArgs(ArgList, 0); + if (do_hook(current_numeric, "%s %s", from, *ArgList)) { +- my_strcpy(buffer, ArgList[0]); ++ my_strmcpy(buffer, ArgList[0], BIG_BUFFER_SIZE); + switch(-current_numeric) + { + case 471: +- my_strcat(buffer, " (Channel is full)"); ++ my_strmcat(buffer, " (Channel is full)", BIG_BUFFER_SIZE); + break; + case 473: +- my_strcat(buffer, " (Invite only channel)"); ++ my_strmcat(buffer, " (Invite only channel)", BIG_BUFFER_SIZE); + break; + case 474: +- my_strcat(buffer, " (Banned from channel)"); ++ my_strmcat(buffer, " (Banned from channel)", BIG_BUFFER_SIZE); + break; + case 475: +- my_strcat(buffer, " (Bad channel key)"); ++ my_strmcat(buffer, " (Bad channel key)", BIG_BUFFER_SIZE); + break; + case 476: +- my_strcat(buffer, " (Bad channel mask)"); ++ my_strmcat(buffer, " (Bad channel mask)", BIG_BUFFER_SIZE); + break; + } + put_it("%s %s", numeric_banner(), buffer); +--- ircii-20021103/source/server.c Fri Sep 6 18:04:38 2002 ++++ ircii-20030315/source/server.c Thu Mar 13 12:34:28 2003 +@@ -2299,14 +2284,14 @@ + { + int i; + u_char *value = (u_char *) 0; +- u_char buffer[BIG_BUFFER_SIZE]; ++ u_char buffer[BIG_BUFFER_SIZE+1]; + + *buffer = '\0'; + for (i = 0; i < number_of_servers; i++) + if (server_list[i].read != -1) + { +- my_strcat(buffer, get_server_itsname(i)); +- my_strcat(buffer, " "); ++ my_strmcat(buffer, get_server_itsname(i), BIG_BUFFER_SIZE); ++ my_strmcat(buffer, " ", BIG_BUFFER_SIZE); + } + malloc_strcpy(&value, buffer); + +--- ircii-20021103/source/status.c Sat Oct 12 14:41:43 2002 ++++ ircii-20030315/source/status.c Sat Mar 15 06:26:46 2003 +@@ -81,6 +81,7 @@ + static void status_make_printable _((u_char *, int)); + static void alarm_switch _((int)); + static u_char *convert_sub_format _((u_char *, int)); ++static void make_status_one _((Window *, int, int)); + + /* + * Maximum number of "%" expressions in a status line format. If you change +@@ -671,12 +672,7 @@ + make_status(window) + Window *window; + { +- int i, len, k, l, +- RJustifyPos = -1, +- RealPosition; +- u_char lbuf[BIG_BUFFER_SIZE + 1]; +- u_char *func_value[MAX_FUNCTIONS]; +- int final; ++ int k, l, final; + + switch (window->double_status) { + case -1: +@@ -704,143 +700,155 @@ + l = 0; + + if (!dumb && status_format[l]) ++ make_status_one(window, k, l); ++ } ++out: ++ cursor_to_input(); ++} ++ ++static void ++make_status_one(window, k, l) ++ Window *window; ++ int k; ++ int l; ++{ ++ u_char lbuf[BIG_BUFFER_SIZE + 1]; ++ u_char *func_value[MAX_FUNCTIONS]; ++ size_t len; ++ int i, ++ RJustifyPos = -1, ++ RealPosition; ++ ++ /* ++ * XXX: note that this code below depends on the definition ++ * of MAX_FUNCTIONS (currently 33), and the snprintf must ++ * be updated if MAX_FUNCTIONS is changed. ++ */ ++ for (i = 0; i < MAX_FUNCTIONS; i++) ++ func_value[i] = (status_func[l][i]) (window); ++ lbuf[0] = REV_TOG; ++ snprintf(CP(lbuf+1), sizeof(lbuf) - 1, CP(status_format[l]), ++ func_value[0], func_value[1], func_value[2], ++ func_value[3], func_value[4], func_value[5], ++ func_value[6], func_value[7], func_value[8], ++ func_value[9], func_value[10], func_value[11], ++ func_value[12], func_value[13], func_value[14], ++ func_value[15], func_value[16], func_value[17], ++ func_value[18], func_value[19], func_value[20], ++ func_value[21], func_value[22], func_value[23], ++ func_value[24], func_value[25], func_value[26], ++ func_value[27], func_value[28], func_value[29], ++ func_value[30], func_value[31], func_value[32]); ++ for (i = 0; i < MAX_FUNCTIONS; i++) ++ new_free(&(func_value[i])); ++ ++ /* Patched 26-Mar-93 by Aiken ++ * make_window now right-justifies everything ++ * after a %> ++ * it's also more efficient. ++ */ ++ ++ RealPosition = 0; ++ RJustifyPos = -1; ++ for (i = 0; lbuf[i]; i++) ++ /* formfeed is a marker for left/right border*/ ++ if (lbuf[i] == '\f') ++ RJustifyPos = i; ++ else if (lbuf[i] != REV_TOG ++ && lbuf[i] != UND_TOG ++ && lbuf[i] != ALL_OFF ++ && lbuf[i] != BOLD_TOG) + { +- /* +- * XXX: note that this code below depends on the definition +- * of MAX_FUNCTIONS (currently 33), and the snprintf must +- * be updated if MAX_FUNCTIONS is changed. +- */ +- for (i = 0; i < MAX_FUNCTIONS; i++) +- func_value[i] = (status_func[l][i]) (window); +- lbuf[0] = REV_TOG; +- snprintf(CP(lbuf+1), sizeof(lbuf) - 1, CP(status_format[l]), +- func_value[0], func_value[1], func_value[2], +- func_value[3], func_value[4], func_value[5], +- func_value[6], func_value[7], func_value[8], +- func_value[9], func_value[10], func_value[11], +- func_value[12], func_value[13], func_value[14], +- func_value[15], func_value[16], func_value[17], +- func_value[18], func_value[19], func_value[20], +- func_value[21], func_value[22], func_value[23], +- func_value[24], func_value[25], func_value[26], +- func_value[27], func_value[28], func_value[29], +- func_value[30], func_value[31],func_value[32]); +- for (i = 0; i < MAX_FUNCTIONS; i++) +- new_free(&(func_value[i])); +- +- /* Patched 26-Mar-93 by Aiken +- * make_window now right-justifies everything +- * after a %> +- * it's also more efficient. +- */ +- +- RealPosition = 0; +- RJustifyPos = -1; +- for (i = 0; lbuf[i]; i++) +- /* formfeed is a marker for left/right border*/ +- if (lbuf[i] == '\f') +- { +- RJustifyPos = i; +- } +- else if (lbuf[i] != REV_TOG +- && lbuf[i] != UND_TOG +- && lbuf[i] != ALL_OFF +- && lbuf[i] != BOLD_TOG) +- { +- if (RealPosition == current_screen->co) +- { +- lbuf[i] = '\0'; +- break; +- } +- RealPosition++; +- } +- +- /* note that i points to the nul, +- RealPosition is vis.chars */ +- +- if (RJustifyPos == -1) +- { +- RJustifyPos = i; +- } +- else ++ if (RealPosition == current_screen->co) + { +- /* get rid of the marker */ +- my_strcpy(&lbuf[RJustifyPos], +- &lbuf[RJustifyPos+1]); +- i--; +- } +- +- if (get_int_var(FULL_STATUS_LINE_VAR)) +- { +- int diff; +- u_char c; +- +- if (RJustifyPos == 0) +- c = ' '; +- else +- c = lbuf[RJustifyPos - 1]; +- +- diff = current_screen->co - RealPosition; +- +- for ( ; i >= RJustifyPos; i--) +- lbuf[i + diff] = lbuf[i]; +- +- for (i++ ; diff > 0 ; diff--, i++) +- lbuf[i] = c; ++ lbuf[i] = '\0'; ++ break; + } ++ RealPosition++; ++ } ++ ++ /* note that i points to the nul, RealPosition is vis.chars */ ++ if (RJustifyPos == -1) ++ RJustifyPos = i; ++ else ++ { ++ /* get rid of the marker */ ++ my_strcpy(&lbuf[RJustifyPos], ++ &lbuf[RJustifyPos+1]); ++ i--; ++ } ++ ++ /* don't adjust the status bar if it is full already */ ++ if (RealPosition < current_screen->co) ++ { ++ if (get_int_var(FULL_STATUS_LINE_VAR)) ++ { ++ int diff; ++ u_char c; + +- len = my_strlen(lbuf); +- lbuf[len] = ALL_OFF; +- lbuf[len+1] = '\0'; ++ if (RJustifyPos == 0) ++ c = ' '; ++ else ++ c = lbuf[RJustifyPos - 1]; + +- status_make_printable(lbuf, len); ++ /* ++ * does this work when the right justified position ++ * has non-printable characters (eg UNG_TOG)? ++ */ ++ diff = current_screen->co - RealPosition; + +- /* +- * Thanks to Max Bell ([EMAIL PROTECTED]) for info about TVI +- * terminals and the sg terminal capability +- */ +- RealPosition = 0; +- if (window->status_line[k] && (SG == -1)) +- { +- for (i = 0; lbuf[i] && window->status_line[k][i]; i++) +- { +- if ((u_char) lbuf[i] != window->status_line[k][i]) +- break; +- if (lbuf[i] != REV_TOG +- && lbuf[i] != UND_TOG +- && lbuf[i] != ALL_OFF +- && lbuf[i] != BOLD_TOG) +- RealPosition++; +- } +- } +- else +- i = 0; ++ for ( ; i >= RJustifyPos; i--) ++ lbuf[i + diff] = lbuf[i]; + +- if ((len = my_strlen(lbuf + i)) +- || lbuf[i] || window->status_line[k] +- || window->status_line[k][i]) +- { +- Screen *old_current_screen; +- +- old_current_screen = current_screen; +- set_current_screen(window->screen); +- term_move_cursor(RealPosition, window->bottom +- + k); +-/* +- term_move_cursor(RealPosition, window->bottom +- + k - window->double_status); +-*/ +- output_line(lbuf, NULL, i); +- cursor_in_display(); +- if (term_clear_to_eol()) +- term_space_erase(len); +- malloc_strcpy(&window->status_line[k], lbuf); +- set_current_screen(old_current_screen); +- } ++ for (i++ ; diff > 0 ; diff--, i++) ++ lbuf[i] = c; + } + } +-out: +- cursor_to_input(); ++ ++ len = my_strlen(lbuf); ++ if (len > (BIG_BUFFER_SIZE - 1)) ++ len = BIG_BUFFER_SIZE - 1; ++ lbuf[len] = ALL_OFF; ++ lbuf[len+1] = '\0'; ++ ++ status_make_printable(lbuf, len); ++ ++ /* ++ * Thanks to Max Bell ([EMAIL PROTECTED]) for info ++ * about TVI terminals and the sg terminal capability ++ */ ++ RealPosition = 0; ++ if (window->status_line[k] && (SG == -1)) ++ { ++ for (i = 0; lbuf[i] && window->status_line[k][i]; i++) ++ { ++ if ((u_char) lbuf[i] != window->status_line[k][i]) ++ break; ++ if (lbuf[i] != REV_TOG ++ && lbuf[i] != UND_TOG ++ && lbuf[i] != ALL_OFF ++ && lbuf[i] != BOLD_TOG) ++ RealPosition++; ++ } ++ } ++ else ++ i = 0; ++ ++ if ((len = my_strlen(lbuf + i)) || lbuf[i] || ++ window->status_line[k] || window->status_line[k][i]) ++ { ++ Screen *old_current_screen; ++ ++ old_current_screen = current_screen; ++ set_current_screen(window->screen); ++ term_move_cursor(RealPosition, window->bottom + k); ++ output_line(lbuf, NULL, i); ++ cursor_in_display(); ++ if (term_clear_to_eol()) ++ term_space_erase(len); ++ malloc_strcpy(&window->status_line[k], lbuf); ++ set_current_screen(old_current_screen); ++ } + } + + static u_char * +@@ -1429,7 +1437,8 @@ + return; + + bzero(lbuf, BIG_BUFFER_SIZE); +- for (pos = 0, s = str; s && pos < BIG_BUFFER_SIZE && pos < n; s++) ++ /* there can be 4 more chars stuff in: REV *s REV \0 */ ++ for (pos = 0, s = str; s && pos < (BIG_BUFFER_SIZE - 4) && n--; s++) + { + so = 0; + if (translation) +--- ircii-20021103/source/whois.c Tue Sep 3 04:39:31 2002 ++++ ircii-20030315/source/whois.c Thu Mar 13 12:34:28 2003 +@@ -1309,11 +1309,11 @@ + { + u_char args[BIG_BUFFER_SIZE + 1]; + +- my_strcpy(args, stuff->nick ? stuff->nick : empty_string); +- my_strcat(args, stuff->oper ? " + " : " - "); +- my_strcat(args, stuff->away ? "+ " : "- "); +- my_strcat(args, stuff->user ? stuff->user : empty_string); +- my_strcat(args, " "); +- my_strcat(args, stuff->host ? stuff->host : empty_string); ++ my_strmcpy(args, stuff->nick ? stuff->nick : empty_string, BIG_BUFFER_SIZE); ++ my_strmcat(args, stuff->oper ? " + " : " - ", BIG_BUFFER_SIZE); ++ my_strmcat(args, stuff->away ? "+ " : "- ", BIG_BUFFER_SIZE); ++ my_strmcat(args, stuff->user ? stuff->user : empty_string, BIG_BUFFER_SIZE); ++ my_strmcat(args, " ", BIG_BUFFER_SIZE); ++ my_strmcat(args, stuff->host ? stuff->host : empty_string, BIG_BUFFER_SIZE); + parse_line((u_char *) 0, text, args, 0, 0, 1); + } @@ . patch -p0 <<'@@ .' Index: openpkg-src/ircii/ircii.spec ============================================================================ $ cvs diff -u -r1.25.2.1 -r1.25.2.2 ircii.spec --- openpkg-src/ircii/ircii.spec 26 Aug 2002 19:53:56 -0000 1.25.2.1 +++ openpkg-src/ircii/ircii.spec 19 Mar 2003 13:59:49 -0000 1.25.2.2 @@ -33,10 +33,11 @@ Group: Network License: BSD Version: 20020403 -Release: 1.1.0 +Release: 1.1.1 # list of sources Source0: ftp://ircii.warped.com/pub/ircII/ircii-%{version}.tar.gz +Patch0: ircii.patch # build information Prefix: %{l_prefix} @@ -51,6 +52,7 @@ %prep %setup -q + %patch -p1 %build libs="" @@ . ______________________________________________________________________ The OpenPKG Project www.openpkg.org CVS Repository Commit List [EMAIL PROTECTED]