/soc/2013/ankitkv/gobjectification: 8826f95514fd: Merged default...
Ankit Vani <[email protected]>
| Newsgroups | gmane.comp.gnome.gaim.cvs |
|---|---|
| Message-ID | <[email protected]> |
Changeset: 8826f95514fdba180150a7c4993a44a427b4654e Author: Ankit Vani <[email protected]> Date: 2014-05-15 10:16 +0530 Branch: soc.2013.gobjectification.plugins URL: https://hg.pidgin.im/soc/2013/ankitkv/gobjectification/rev/8826f95514fd Description: Merged default branch diffstat: configure.ac | 23 +++-- doc/reference/libpurple/Makefile.am | 5 +- finch/libgnt/gnttextview.c | 4 + libpurple/dnssrv.c | 8 + libpurple/internal.h | 30 ++++++- libpurple/log.c | 28 +++--- 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/roster.c | 9 +- libpurple/protocols/jabber/si.c | 9 +- libpurple/protocols/oscar/peer.c | 8 +- libpurple/protocols/silc/util.c | 129 ++++++----------------------- 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 | 27 +++++- libpurple/xmlnode.c | 4 +- pidgin/gtkprefs.c | 5 +- pidgin/gtkutils.c | 9 ++ pidgin/plugins/spellchk.c | 2 +- po/POTFILES.in | 1 + 28 files changed, 220 insertions(+), 254 deletions(-) diffs (truncated from 1065 to 300 lines): diff --git a/configure.ac b/configure.ac --- a/configure.ac +++ b/configure.ac @@ -270,18 +270,21 @@ if test "x$is_win32" != "xyes" ; then fi AC_CHECK_LIB(resolv, __res_query) AC_CHECK_LIB(nsl, gethostent) -if test "x$is_win32" != "xyes" ; then +if test "x$is_win32" = "xyes" ; then + AC_DEFINE(HAVE_GETADDRINFO, 1, [Define to 1 if you have the getaddrinfo function.]) + AC_DEFINE(HAVE_INET_NTOP, 1, [Define to 1 if you have the `inet_ntop' function.]) +else AC_CHECK_FUNC(socket, , [AC_CHECK_LIB(socket, socket, , [AC_MSG_ERROR([socket not found])])]) + dnl If all goes well, by this point the previous two checks will have + dnl pulled in -lsocket and -lnsl if we need them. + AC_CHECK_FUNC(getaddrinfo, + [AC_DEFINE([HAVE_GETADDRINFO], [1], + [Define to 1 if you have the getaddrinfo function.])], + [AC_CHECK_LIB(socket, getaddrinfo, + [AC_DEFINE([HAVE_GETADDRINFO]) LIBS="-lsocket -lnsl $LIBS"], , -lnsl)]) + AC_CHECK_FUNCS(inet_ntop) fi -dnl If all goes well, by this point the previous two checks will have -dnl pulled in -lsocket and -lnsl if we need them. -AC_CHECK_FUNC(getaddrinfo, - [AC_DEFINE([HAVE_GETADDRINFO], [1], - [Define to 1 if you have the getaddrinfo function.])], - [AC_CHECK_LIB(socket, getaddrinfo, - [AC_DEFINE([HAVE_GETADDRINFO]) LIBS="-lsocket -lnsl $LIBS"], , -lnsl)]) -AC_CHECK_FUNCS(inet_ntop) AC_CHECK_FUNCS(getifaddrs) dnl Check for socklen_t (in Unix98) AC_MSG_CHECKING(for socklen_t) @@ -875,7 +878,7 @@ if test "x$enable_consoleui" = "xyes"; t [enable_consoleui=no], [$GNT_LIBS]) if test "x$is_win32" = "xyes" ; then - ncurses_sys_prefix="/usr/$host/sys-root/$host" + ncurses_sys_prefix="/usr/$host/sys-root/mingw" else ncurses_sys_prefix="/usr" fi diff --git a/doc/reference/libpurple/Makefile.am b/doc/reference/libpurple/Makefile.am --- a/doc/reference/libpurple/Makefile.am +++ b/doc/reference/libpurple/Makefile.am @@ -58,8 +58,9 @@ CFILE_GLOB=$(top_srcdir)/$(DOC_MODULE)/* # e.g. EXTRA_HFILES=$(top_srcdir}/contrib/extra.h # TODO: those files are not properly scanned when building out-of-tree EXTRA_HFILES = \ - $(top_builddir)/$(DOC_MODULE)/version.h \ - $(top_builddir)/$(DOC_MODULE)/purple.h + $(top_builddir)/$(DOC_MODULE)/enums.h \ + $(top_builddir)/$(DOC_MODULE)/purple.h \ + $(top_builddir)/$(DOC_MODULE)/version.h # Header files or dirs to ignore when scanning. Use base file/dir names # e.g. IGNORE_HFILES=gtkdebug.h gtkintl.h private_code 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 @@ -147,7 +147,6 @@ [(condition) ? 1 : -1]; static_assertion_failed_ ## message dummy; \ (void)dummy; } - #ifdef __clang__ #define PURPLE_BEGIN_IGNORE_CAST_ALIGN \ @@ -166,6 +165,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; @@ -335,4 +342,25 @@ 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); + +/** + * A fstat alternative, like g_stat for stat. + * + * @param fd The file descriptor. + * @param st The stat buffer. + * + * @return the result just like for fstat. + */ +int +_purple_fstat(int fd, GStatBuf *st); + #endif /* _PURPLE_INTERNAL_H_ */ diff --git a/libpurple/log.c b/libpurple/log.c --- a/libpurple/log.c +++ b/libpurple/log.c @@ -1704,7 +1704,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; @@ -1720,13 +1720,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 (_purple_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 */ @@ -1734,7 +1742,7 @@ static GList *old_logger_list(PurpleLogT index_fd = g_open(pathstr, 0, O_RDONLY); if (index_fd != -1) { - if (fstat(index_fd, &st) != 0) { + if (_purple_fstat(index_fd, &st) != 0) { close(index_fd); index_fd = -1; } @@ -1744,6 +1752,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 { @@ -1779,19 +1788,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 @@ -1409,12 +1409,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); @@ -1831,8 +1835,7 @@ static GList *qip_logger_list(PurpleLogT