/pidgin/main: 31a8779e91d4: Merge release-2.x.y

Tomasz Wasilczyk <[email protected]>
Newsgroups gmane.comp.gnome.gaim.cvs
Message-ID <[email protected]>
Changeset: 31a8779e91d44d4a634283d03cee9b64cf126f9e
Author:	 Tomasz Wasilczyk <[email protected]>
Date:	 2014-05-07 11:07 +0200
Branch:	 default
URL: https://hg.pidgin.im/pidgin/main/rev/31a8779e91d4

Description:

Merge release-2.x.y

diffstat:

 finch/gntnotify.c                           |   2 +
 finch/gntprefs.c                            |   6 ++-
 finch/gntrequest.c                          |   7 +++-
 finch/libfinch.c                            |   5 +-
 finch/libgnt/gntbox.c                       |   4 +-
 finch/libgnt/gntcheckbox.c                  |   2 +-
 finch/libgnt/gntcombobox.c                  |   2 +-
 finch/libgnt/gntentry.c                     |   2 +-
 finch/libgnt/gnttextview.c                  |   2 +-
 finch/libgnt/gntwidget.c                    |   2 +
 finch/libgnt/gntwm.c                        |   4 +-
 finch/libgnt/gntws.c                        |   2 +
 finch/libgnt/wms/irssi.c                    |   2 +-
 libpurple/dnsquery.c                        |   4 +-
 libpurple/dnssrv.c                          |   6 +++
 libpurple/log.c                             |  38 +++++++++++++++-------
 libpurple/mediamanager.c                    |   6 +++-
 libpurple/network.c                         |   5 +-
 libpurple/plugins/log_reader.c              |  28 +++++++++++-----
 libpurple/plugins/perl/common/Cipher.xs     |   6 +++
 libpurple/plugins/perl/perl-common.c        |   3 +-
 libpurple/protocols/bonjour/bonjour_ft.c    |   3 +-
 libpurple/protocols/bonjour/jabber.c        |  28 ++++++++++++----
 libpurple/protocols/irc/dcc_send.c          |   3 +-
 libpurple/protocols/jabber/chat.c           |   3 +-
 libpurple/protocols/jabber/jabber.c         |   2 +
 libpurple/protocols/jabber/si.c             |   3 +-
 libpurple/protocols/msn/contact.c           |   1 +
 libpurple/protocols/msn/msnutils.c          |   2 +-
 libpurple/protocols/oscar/family_icbm.c     |   8 ++++-
 libpurple/protocols/oscar/family_oservice.c |   9 ++++-
 libpurple/protocols/oscar/peer.c            |   3 +-
 libpurple/protocols/oscar/userinfo.c        |   5 +-
 libpurple/protocols/silc/buddy.c            |  12 +-----
 libpurple/protocols/silc/util.c             |   6 +-
 libpurple/protocols/simple/simple.c         |  10 ++++-
 libpurple/protocols/yahoo/libymsg.c         |   4 +-
 libpurple/protocols/yahoo/util.c            |  17 ++++++++-
 libpurple/protocols/zephyr/ZOpenPort.c      |  14 +++++---
 libpurple/protocols/zephyr/ZReadAscii.c     |   7 +++-
 libpurple/protocols/zephyr/ZRetSubs.c       |   1 +
 libpurple/protocols/zephyr/Zinternal.c      |   4 +-
 libpurple/protocols/zephyr/zephyr.c         |  48 ++++++++++++++++------------
 libpurple/proxy.c                           |  15 ++++++---
 libpurple/stun.c                            |   9 ++++-
 libpurple/util.c                            |  39 ++++++++++++-----------
 libpurple/xfer.c                            |   7 +++-
 libpurple/xmlnode.c                         |   1 +
 pidgin/gtkblist.c                           |   3 +
 pidgin/gtknotify.c                          |   5 +-
 pidgin/gtkprefs.c                           |   6 +-
 pidgin/gtksession.c                         |   3 +-
 pidgin/gtkstatusbox.c                       |   4 ++
 pidgin/libpidgin.c                          |   5 +-
 pidgin/plugins/spellchk.c                   |   5 +-
 55 files changed, 288 insertions(+), 145 deletions(-)

diffs (truncated from 1371 to 300 lines):

diff --git a/finch/gntnotify.c b/finch/gntnotify.c
--- a/finch/gntnotify.c
+++ b/finch/gntnotify.c
@@ -59,8 +59,10 @@ finch_notify_common(PurpleNotifyType nty
 	{
 		case PURPLE_NOTIFY_MSG_ERROR:
 			sf |= GNT_TEXT_FLAG_BOLD;
+			/* fall through */
 		case PURPLE_NOTIFY_MSG_WARNING:
 			pf |= GNT_TEXT_FLAG_UNDERLINE;
+			/* fall through */
 		case PURPLE_NOTIFY_MSG_INFO:
 			pf |= GNT_TEXT_FLAG_BOLD;
 			break;
diff --git a/finch/gntprefs.c b/finch/gntprefs.c
--- a/finch/gntprefs.c
+++ b/finch/gntprefs.c
@@ -143,12 +143,14 @@ get_pref_field(Prefs *prefs)
 			switch (prefs->type)
 			{
 				case PURPLE_PREF_BOOLEAN:
-					sscanf(iter->data, "%d", &idata);
+					if (sscanf(iter->data, "%d", &idata) != 1)
+						idata = FALSE;
 					if (purple_prefs_get_bool(prefs->pref) == idata)
 						select = TRUE;
 					break;
 				case PURPLE_PREF_INT:
-					sscanf(iter->data, "%d", &idata);
+					if (sscanf(iter->data, "%d", &idata) != 1)
+						idata = 0;
 					if (purple_prefs_get_int(prefs->pref) == idata)
 						select = TRUE;
 					break;
diff --git a/finch/gntrequest.c b/finch/gntrequest.c
--- a/finch/gntrequest.c
+++ b/finch/gntrequest.c
@@ -916,8 +916,11 @@ void finch_request_save_in_prefs(gpointe
 				case PURPLE_PREF_INT:
 				{
 					long int tmp = GPOINTER_TO_INT(val);
-					if (type == PURPLE_REQUEST_FIELD_LIST) /* Lists always return string */
-						sscanf(val, "%ld", &tmp);
+					if (type == PURPLE_REQUEST_FIELD_LIST) {
+						/* Lists always return string */
+						if (sscanf(val, "%ld", &tmp) != 1)
+							tmp = 0;
+					}
 					purple_prefs_set_int(id, (gint)tmp);
 					break;
 				}
diff --git a/finch/libfinch.c b/finch/libfinch.c
--- a/finch/libfinch.c
+++ b/finch/libfinch.c
@@ -268,7 +268,6 @@ init_libpurple(int argc, char **argv)
 	gboolean opt_version = FALSE;
 	char *opt_config_dir_arg = NULL;
 	gboolean debug_enabled = FALSE;
-	GStatBuf st;
 
 	struct option long_options[] = {
 		{"config",   required_argument, NULL, 'c'},
@@ -360,8 +359,8 @@ init_libpurple(int argc, char **argv)
 	purple_idle_set_ui_ops(finch_idle_get_ui_ops());
 
 	path = g_build_filename(purple_user_dir(), "plugins", NULL);
-	if (!g_stat(path, &st))
-		g_mkdir(path, S_IRUSR | S_IWUSR | S_IXUSR);
+	if (g_mkdir(path, S_IRUSR | S_IWUSR | S_IXUSR) != 0 && errno != EEXIST)
+		fprintf(stderr, "Couldn't create plugins dir\n");
 	purple_plugins_add_search_path(path);
 	g_free(path);
 
diff --git a/finch/libgnt/gntbox.c b/finch/libgnt/gntbox.c
--- a/finch/libgnt/gntbox.c
+++ b/finch/libgnt/gntbox.c
@@ -232,8 +232,8 @@ gnt_box_size_request(GntWidget *widget)
 				h = maxh;
 		}
 
-		gnt_widget_confirm_size(wid, w, h);
-		gnt_widget_set_size(wid, w, h);
+		if (gnt_widget_confirm_size(wid, w, h))
+			gnt_widget_set_size(wid, w, h);
 	}
 
 	reposition_children(widget);
diff --git a/finch/libgnt/gntcheckbox.c b/finch/libgnt/gntcheckbox.c
--- a/finch/libgnt/gntcheckbox.c
+++ b/finch/libgnt/gntcheckbox.c
@@ -52,7 +52,7 @@ gnt_check_box_draw(GntWidget *widget)
 
 	wbkgdset(widget->window, '\0' | gnt_color_pair(GNT_COLOR_NORMAL));
 	mvwaddstr(widget->window, 0, 4, C_(GNT_BUTTON(cb)->priv->text));
-	wmove(widget->window, 0, 1);
+	(void)wmove(widget->window, 0, 1);
 
 	GNTDEBUG;
 }
diff --git a/finch/libgnt/gntcombobox.c b/finch/libgnt/gntcombobox.c
--- a/finch/libgnt/gntcombobox.c
+++ b/finch/libgnt/gntcombobox.c
@@ -96,7 +96,7 @@ gnt_combo_box_draw(GntWidget *widget)
 	whline(widget->window, ' ' | gnt_color_pair(type), widget->priv.width - 4 - len);
 	mvwaddch(widget->window, 1, widget->priv.width - 3, ACS_VLINE | gnt_color_pair(GNT_COLOR_NORMAL));
 	mvwaddch(widget->window, 1, widget->priv.width - 2, ACS_DARROW | gnt_color_pair(GNT_COLOR_NORMAL));
-	wmove(widget->window, 1, 1);
+	(void)wmove(widget->window, 1, 1);
 
 	g_free(text);
 	GNTDEBUG;
diff --git a/finch/libgnt/gntentry.c b/finch/libgnt/gntentry.c
--- a/finch/libgnt/gntentry.c
+++ b/finch/libgnt/gntentry.c
@@ -299,7 +299,7 @@ gnt_entry_draw(GntWidget *widget)
 	curpos = gnt_util_onscreen_width(entry->scroll, entry->cursor);
 	if (focus)
 		mvwchgat(widget->window, 0, curpos, 1, A_REVERSE, GNT_COLOR_TEXT_NORMAL, NULL);
-	wmove(widget->window, 0, curpos);
+	(void)wmove(widget->window, 0, curpos);
 
 	GNTDEBUG;
 }
diff --git a/finch/libgnt/gnttextview.c b/finch/libgnt/gnttextview.c
--- a/finch/libgnt/gnttextview.c
+++ b/finch/libgnt/gnttextview.c
@@ -106,7 +106,7 @@ gnt_text_view_draw(GntWidget *widget)
 		GList *iter;
 		GntTextLine *line = lines->data;
 
-		wmove(widget->window, widget->priv.height - 1 - i - comp, 0);
+		(void)wmove(widget->window, widget->priv.height - 1 - i - comp, 0);
 
 		for (iter = line->segments; iter; iter = iter->next)
 		{
diff --git a/finch/libgnt/gntwidget.c b/finch/libgnt/gntwidget.c
--- a/finch/libgnt/gntwidget.c
+++ b/finch/libgnt/gntwidget.c
@@ -318,6 +318,8 @@ gnt_widget_destroy(GntWidget *obj)
 void
 gnt_widget_show(GntWidget *widget)
 {
+	g_return_if_fail(widget != NULL);
+
 	gnt_widget_draw(widget);
 	gnt_screen_occupy(widget);
 }
diff --git a/finch/libgnt/gntwm.c b/finch/libgnt/gntwm.c
--- a/finch/libgnt/gntwm.c
+++ b/finch/libgnt/gntwm.c
@@ -141,7 +141,7 @@ gnt_wm_copy_win(GntWidget *widget, GntNo
 			int curx = active->priv.x + getcurx(active->window);
 			int cury = active->priv.y + getcury(active->window);
 			if (wmove(node->window, cury - widget->priv.y, curx - widget->priv.x) != OK)
-				wmove(node->window, 0, 0);
+				(void)wmove(node->window, 0, 0);
 		}
 	}
 }
@@ -1817,6 +1817,8 @@ gnt_wm_new_window_real(GntWM *wm, GntWid
 
 		maxx = getmaxx(stdscr);
 		maxy = getmaxy(stdscr) - 1;              /* room for the taskbar */
+		maxx = MAX(0, maxx);
+		maxy = MAX(0, maxy);
 
 		x = MAX(0, x);
 		y = MAX(0, y);
diff --git a/finch/libgnt/gntws.c b/finch/libgnt/gntws.c
--- a/finch/libgnt/gntws.c
+++ b/finch/libgnt/gntws.c
@@ -62,6 +62,8 @@ gnt_ws_draw_taskbar(GntWS *ws, gboolean 
 	if (gnt_is_refugee())
 		return;
 
+	g_return_if_fail(ws != NULL);
+
 	if (taskbar == NULL) {
 		taskbar = newwin(1, getmaxx(stdscr), getmaxy(stdscr) - 1, 0);
 	} else if (reposition) {
diff --git a/finch/libgnt/wms/irssi.c b/finch/libgnt/wms/irssi.c
--- a/finch/libgnt/wms/irssi.c
+++ b/finch/libgnt/wms/irssi.c
@@ -218,7 +218,7 @@ update_conv_window_title(GntNode *node)
 	getyx(node->window, y, x);
 	wbkgdset(node->window, '\0' | COLOR_PAIR(gnt_widget_has_focus(node->me) ? GNT_COLOR_TITLE : GNT_COLOR_TITLE_D));
 	mvwaddstr(node->window, 0, 0, title);
-	wmove(node->window, y, x);
+	(void)wmove(node->window, y, x);
 	if (!gnt_is_refugee()) {
 		update_panels();
 		doupdate();
diff --git a/libpurple/dnsquery.c b/libpurple/dnsquery.c
--- a/libpurple/dnsquery.c
+++ b/libpurple/dnsquery.c
@@ -33,6 +33,8 @@
 #include <resolv.h>
 #endif
 
+#define MAX_ADDR_RESPONSE_LEN 1048576
+
 #if (defined(__APPLE__) || defined (__unix__)) && !defined(__osf__)
 #define PURPLE_DNSQUERY_USE_FORK
 #endif
@@ -664,7 +666,7 @@ host_resolved(gpointer data, gint source
 		/* Success! */
 		while (rc > 0) {
 			rc = read(query_data->resolver->fd_out, &addrlen, sizeof(addrlen));
-			if (rc > 0 && addrlen > 0) {
+			if (rc > 0 && addrlen > 0 && addrlen < MAX_ADDR_RESPONSE_LEN) {
 				addr = g_malloc(addrlen);
 				rc = read(query_data->resolver->fd_out, addr, addrlen);
 				hosts = g_slist_append(hosts, GINT_TO_POINTER(addrlen));
diff --git a/libpurple/dnssrv.c b/libpurple/dnssrv.c
--- a/libpurple/dnssrv.c
+++ b/libpurple/dnssrv.c
@@ -45,6 +45,8 @@
 #define T_TXT	PurpleDnsTypeTxt
 #endif
 
+#define MAX_ADDR_RESPONSE_LEN 1048576
+
 #include "debug.h"
 #include "dnssrv.h"
 #include "eventloop.h"
@@ -492,6 +494,10 @@ resolved(gpointer data, gint source, Pur
 
 	if (read(source, &type, sizeof(type)) == sizeof(type)) {
 		if (read(source, &size, sizeof(size)) == sizeof(size)) {
+			if (size < -1 || size > MAX_ADDR_RESPONSE_LEN) {
+				purple_debug_warning("dnssrv", "res_query returned invalid number\n");
+				size = 0;
+			}
 			if (size == -1 || size == 0) {
 				if (size == -1) {
 					purple_debug_warning("dnssrv", "res_query returned an error\n");
diff --git a/libpurple/log.c b/libpurple/log.c
--- a/libpurple/log.c
+++ b/libpurple/log.c
@@ -1735,8 +1735,15 @@ static GList *old_logger_list(PurpleLogT
 	/* Change the .log extension to .idx */
 	strcpy(pathstr + strlen(pathstr) - 3, "idx");
 
-	if (g_stat(pathstr, &st) == 0)
-	{
+	index_fd = g_open(pathstr, 0, O_RDONLY);
+	if (index_fd != -1) {
+		if (fstat(index_fd, &st) != 0) {
+			close(index_fd);
+			index_fd = -1;
+		}
+	}
+
+	if (index_fd != -1) {
 		if (st.st_mtime < log_last_modified)
 		{
 			purple_debug_warning("log", "Index \"%s\" exists, but is older than the log.\n", pathstr);
@@ -1744,15 +1751,12 @@ static GList *old_logger_list(PurpleLogT
 		else
 		{
 			/* The index file exists and is at least as new as the log, so open it. */
-			if (!(index = g_fopen(pathstr, "rb")))
-			{
+			if (!(index = fdopen(index_fd, "rb"))) {
 				purple_debug_error("log", "Failed to open index file \"%s\" for reading: %s\n",
 				                 pathstr, g_strerror(errno));
 
 				/* Fall through so that we'll parse the log file. */
-			}
-			else
-			{
+			} else {
 				purple_debug_info("log", "Using index: %s\n", pathstr);
 				g_free(pathstr);
 				while (fgets(buf, BUF_LONG, index))
@@ -1868,8 +1872,12 @@ static GList *old_logger_list(PurpleLogT
 
 			g_snprintf(convostart, length, "%s", temp);
 			memset(&tm, 0, sizeof(tm));
-			sscanf(convostart, "%*s %3s %d %d:%d:%d %d",
-			       month, &tm.tm_mday, &tm.tm_hour, &tm.tm_min, &tm.tm_sec, &tm.tm_year);
+			if (sscanf(convostart, "%*s %3s %d %d:%d:%d %d", month,
+				&tm.tm_mday, &tm.tm_hour, &tm.tm_min,
+				&tm.tm_sec, &tm.tm_year) != 6)
+			{
+				purple_debug_warning("log", "invalid date format\n");
+			}
 			/* Ugly hack, in case current locale is not English */
 			if (purple_strequal(month, "Jan")) {
 				tm.tm_mon= 0;
@@ -1973,9 +1981,15 @@ static char * old_logger_read (PurpleLog
 	struct old_logger_data *data = log->logger_data;
 	const char *path = purple_stringref_value(data->pathref);
 	FILE *file = g_fopen(path, "rb");
-	char *read = g_malloc(data->length + 1);
-	fseek(file, data->offset, SEEK_SET);
-	result = fread(read, data->length, 1, file);
+	char *read;
+
+	g_return_val_if_fail(file, g_strdup(""));
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.