/pidgin/main: 9eb8f52893d0: Merge release-2.x.y
Tomasz Wasilczyk <[email protected]>
| Newsgroups | gmane.comp.gnome.gaim.cvs |
|---|---|
| Message-ID | <[email protected]> |
Changeset: 9eb8f52893d08591b65058fd3760d9a22338822d Author: Tomasz Wasilczyk <[email protected]> Date: 2014-05-13 00:26 +0200 Branch: default URL: https://hg.pidgin.im/pidgin/main/rev/9eb8f52893d0 Description: Merge release-2.x.y diffstat: finch/libgnt/gnttextview.c | 4 + libpurple/dnssrv.c | 8 ++ libpurple/internal.h | 18 +++++ libpurple/log.c | 26 ++++--- libpurple/network.c | 35 ++++++++-- libpurple/plugins/log_reader.c | 29 +++++-- libpurple/plugins/perl/common/module.h | 11 +++ libpurple/protocols/bonjour/bonjour_ft.c | 10 +-- libpurple/protocols/bonjour/jabber.c | 9 +-- libpurple/protocols/irc/dcc_send.c | 9 +-- libpurple/protocols/jabber/jabber.c | 2 +- libpurple/protocols/jabber/si.c | 9 +-- libpurple/protocols/oscar/peer.c | 8 +-- libpurple/protocols/silc/util.c | 105 +++++++---------------------- libpurple/protocols/simple/simple.c | 10 +-- libpurple/protocols/yahoo/yahoo_profile.c | 2 +- libpurple/protocols/zephyr/ZReadAscii.c | 2 +- libpurple/protocols/zephyr/zephyr.c | 4 +- libpurple/proxy.c | 50 +------------ libpurple/util.c | 7 +- libpurple/xmlnode.c | 4 +- pidgin/gtkprefs.c | 5 +- pidgin/plugins/spellchk.c | 2 +- 23 files changed, 161 insertions(+), 208 deletions(-) diffs (truncated from 825 to 300 lines): diff --git a/finch/libgnt/gnttextview.c b/finch/libgnt/gnttextview.c --- a/finch/libgnt/gnttextview.c +++ b/finch/libgnt/gnttextview.c @@ -772,6 +772,10 @@ int gnt_text_view_tag_change(GntTextView for (segs = line->segments; segs; segs = snext) { GntTextSegment *seg = segs->data; + + if (!line) + break; + snext = segs->next; if (seg->start >= tag->end) { /* The segment is somewhere after the tag */ diff --git a/libpurple/dnssrv.c b/libpurple/dnssrv.c --- a/libpurple/dnssrv.c +++ b/libpurple/dnssrv.c @@ -555,6 +555,14 @@ resolved(gpointer data, gint source, Pur responses = NULL; break; } + if (len > MAX_ADDR_RESPONSE_LEN) { + purple_debug_error("dnssrv", "we've read invalid number\n"); + size = 0; + g_list_foreach(responses, (GFunc)purple_txt_response_destroy, NULL); + g_list_free(responses); + responses = NULL; + break; + } res = g_new0(PurpleTxtResponse, 1); res->content = g_new0(gchar, len); diff --git a/libpurple/internal.h b/libpurple/internal.h --- a/libpurple/internal.h +++ b/libpurple/internal.h @@ -167,6 +167,14 @@ #include <glib-object.h> +#ifdef __COVERITY__ + +/* avoid TAINTED_SCALAR warning */ +#undef g_utf8_next_char +#define g_utf8_next_char(p) (char *)((p) + 1) + +#endif + typedef union { struct sockaddr sa; @@ -336,4 +344,14 @@ int *_purple_statuses_get_primitive_scor const gchar * _purple_blist_get_localized_default_group_name(void); +/** + * Sets most commonly used socket flags: O_NONBLOCK and FD_CLOEXEC. + * + * @param fd The file descriptor for the socket. + * + * @return TRUE if succeeded, FALSE otherwise. + */ +gboolean +_purple_network_set_common_socket_flags(int fd); + #endif /* _PURPLE_INTERNAL_H_ */ diff --git a/libpurple/log.c b/libpurple/log.c --- a/libpurple/log.c +++ b/libpurple/log.c @@ -1707,7 +1707,7 @@ static GList *old_logger_list(PurpleLogT time_t log_last_modified; FILE *index; FILE *file; - int index_fd; + int file_fd, index_fd; char *index_tmp; char buf[BUF_LONG]; struct tm tm; @@ -1723,13 +1723,21 @@ static GList *old_logger_list(PurpleLogT g_free(logfile); - if (g_stat(purple_stringref_value(pathref), &st)) - { + file_fd = g_open(purple_stringref_value(pathref), 0, O_RDONLY); + if (file_fd == -1 || (file = fdopen(file_fd, "rb")) == NULL) { + purple_debug_error("log", + "Failed to open log file \"%s\" for reading: %s\n", + purple_stringref_value(pathref), g_strerror(errno)); purple_stringref_unref(pathref); g_free(pathstr); return NULL; } - else + if (fstat(file_fd, &st) == -1) { + purple_stringref_unref(pathref); + g_free(pathstr); + fclose(file); + return NULL; + } else log_last_modified = st.st_mtime; /* Change the .log extension to .idx */ @@ -1747,6 +1755,7 @@ static GList *old_logger_list(PurpleLogT if (st.st_mtime < log_last_modified) { purple_debug_warning("log", "Index \"%s\" exists, but is older than the log.\n", pathstr); + close(index_fd); } else { @@ -1782,19 +1791,12 @@ static GList *old_logger_list(PurpleLogT fclose(index); purple_stringref_unref(pathref); + fclose(file); return list; } } } - if (!(file = g_fopen(purple_stringref_value(pathref), "rb"))) { - purple_debug_error("log", "Failed to open log file \"%s\" for reading: %s\n", - purple_stringref_value(pathref), g_strerror(errno)); - purple_stringref_unref(pathref); - g_free(pathstr); - return NULL; - } - index_tmp = g_strdup_printf("%s.XXXXXX", pathstr); if ((index_fd = g_mkstemp(index_tmp)) == -1) { purple_debug_error("log", "Failed to open index temp file: %s\n", diff --git a/libpurple/network.c b/libpurple/network.c --- a/libpurple/network.c +++ b/libpurple/network.c @@ -403,7 +403,6 @@ purple_network_do_listen(unsigned short PurpleNetworkListenCallback cb, gpointer cb_data) { int listenfd = -1; - int flags; const int on = 1; PurpleNetworkListenData *listen_data; unsigned short actual_port; @@ -488,12 +487,7 @@ purple_network_do_listen(unsigned short close(listenfd); return NULL; } - flags = fcntl(listenfd, F_GETFL); - fcntl(listenfd, F_SETFL, flags | O_NONBLOCK); -#ifndef _WIN32 - if (fcntl(listenfd, F_SETFD, FD_CLOEXEC) != 0) - purple_debug_warning("network", "couldn't set FD_CLOEXEC\n"); -#endif + _purple_network_set_common_socket_flags(listenfd); actual_port = purple_network_get_port_from_fd(listenfd); purple_debug_info("network", "Listening on port: %hu\n", actual_port); @@ -1156,6 +1150,33 @@ int purple_network_convert_idn_to_ascii( #endif } +gboolean +_purple_network_set_common_socket_flags(int fd) +{ + int flags; + gboolean succ = TRUE; + + g_return_val_if_fail(fd >= 0, FALSE); + + flags = fcntl(fd, F_GETFL); + + if (fcntl(fd, F_SETFL, flags | O_NONBLOCK) != 0) { + purple_debug_warning("network", + "Couldn't set O_NONBLOCK flag\n"); + succ = FALSE; + } + +#ifndef _WIN32 + if (fcntl(fd, F_SETFD, FD_CLOEXEC) != 0) { + purple_debug_warning("network", + "Couldn't set FD_CLOEXEC flag\n"); + succ = FALSE; + } +#endif + + return succ; +} + void purple_network_init(void) { diff --git a/libpurple/plugins/log_reader.c b/libpurple/plugins/log_reader.c --- a/libpurple/plugins/log_reader.c +++ b/libpurple/plugins/log_reader.c @@ -1419,12 +1419,16 @@ static char * trillian_logger_read (Purp purple_debug_info("Trillian log read", "Reading %s\n", data->path); - read = g_malloc(data->length + 2); - file = g_fopen(data->path, "rb"); g_return_val_if_fail(file != NULL, g_strdup("")); - if (fseek(file, data->offset, SEEK_SET) != 0) + + read = g_malloc(data->length + 2); + + if (fseek(file, data->offset, SEEK_SET) != 0) { + fclose(file); + g_free(read); g_return_val_if_reached(g_strdup("")); + } data->length = fread(read, 1, data->length, file); fclose(file); @@ -1846,8 +1850,7 @@ static GList *qip_logger_list(PurpleLogT } else { while (*c) c++; - if (c) - c--; + c--; c = g_strrstr(c, "("); } @@ -1950,8 +1953,11 @@ static char *qip_logger_read(PurpleLog * contents = g_malloc(data->length + 2); - if (fseek(file, data->offset, SEEK_SET) != 0) + if (fseek(file, data->offset, SEEK_SET) != 0) { + fclose(file); + g_free(contents); g_return_val_if_reached(g_strdup("")); + } data->length = fread(contents, 1, data->length, file); fclose(file); @@ -1994,6 +2000,8 @@ static char *qip_logger_read(PurpleLog * /* find EOL */ c = strchr(c, '\n'); + if (!c) + break; /* XXX: Do we need buddy_name when we have buddy->alias? */ buddy_name = ++c; @@ -2331,13 +2339,16 @@ static char *amsn_logger_read(PurpleLog g_return_val_if_fail(data->path != NULL, g_strdup("")); g_return_val_if_fail(data->length > 0, g_strdup("")); - contents = g_malloc(data->length + 2); - file = g_fopen(data->path, "rb"); g_return_val_if_fail(file != NULL, g_strdup("")); - if (fseek(file, data->offset, SEEK_SET) != 0) + contents = g_malloc(data->length + 2); + + if (fseek(file, data->offset, SEEK_SET) != 0) { + fclose(file); + free(contents); g_return_val_if_reached(g_strdup("")); + } data->length = fread(contents, 1, data->length, file); fclose(file); diff --git a/libpurple/plugins/perl/common/module.h b/libpurple/plugins/perl/common/module.h --- a/libpurple/plugins/perl/common/module.h +++ b/libpurple/plugins/perl/common/module.h @@ -81,6 +81,17 @@ typedef struct group *Purple__Group; #include "whiteboard.h" #include "xmlnode.h" +#ifdef __COVERITY__ + +/* avoid extra_comma false positives */ +#undef SvPOK_only +#define SvPOK_only(sv) { \ + SvFLAGS(sv) &= ~(SVf_OK | SVf_IVisUV | SVf_UTF8); \ + SvFLAGS(sv) |= (SVf_POK | SVp_POK); \ + } + +#endif /* __COVERITY__ */ + /* account.h */ typedef PurpleAccount * Purple__Account; typedef PurpleAccountOption * Purple__Account__Option; diff --git a/libpurple/protocols/bonjour/bonjour_ft.c b/libpurple/protocols/bonjour/bonjour_ft.c --- a/libpurple/protocols/bonjour/bonjour_ft.c +++ b/libpurple/protocols/bonjour/bonjour_ft.c @@ -810,17 +810,9 @@ bonjour_sock5_request_cb(gpointer data, purple_xfer_cancel_remote(xfer); return; } else { - int flags; - purple_debug_info("bonjour", "Accepted SOCKS5 ft connection - fd=%d\n", acceptfd); - flags = fcntl(acceptfd, F_GETFL); - fcntl(acceptfd, F_SETFL, flags | O_NONBLOCK); -#ifndef _WIN32