[asterisk-commits] bebuild: tag 11.1.2 r378415 - in /tags/11.1.2: ./ res/

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Thu Jan 3 10:10:59 CST 2013


Author: bebuild
Date: Thu Jan  3 10:10:55 2013
New Revision: 378415

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=378415
Log:
Merge r378409, r378411 for 11.1.2

Removed:
    tags/11.1.2/asterisk-11.1.1-summary.html
    tags/11.1.2/asterisk-11.1.1-summary.txt
Modified:
    tags/11.1.2/   (props changed)
    tags/11.1.2/.version
    tags/11.1.2/ChangeLog
    tags/11.1.2/res/res_xmpp.c

Propchange: tags/11.1.2/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Thu Jan  3 10:10:55 2013
@@ -1,1 +1,1 @@
-/branches/11:376870,377259,378287,378321
+/branches/11:376870,377259,378287,378321,378409,378411

Modified: tags/11.1.2/.version
URL: http://svnview.digium.com/svn/asterisk/tags/11.1.2/.version?view=diff&rev=378415&r1=378414&r2=378415
==============================================================================
--- tags/11.1.2/.version (original)
+++ tags/11.1.2/.version Thu Jan  3 10:10:55 2013
@@ -1,1 +1,1 @@
-11.1.1
+11.1.2

Modified: tags/11.1.2/ChangeLog
URL: http://svnview.digium.com/svn/asterisk/tags/11.1.2/ChangeLog?view=diff&rev=378415&r1=378414&r2=378415
==============================================================================
--- tags/11.1.2/ChangeLog (original)
+++ tags/11.1.2/ChangeLog Thu Jan  3 10:10:55 2013
@@ -1,3 +1,21 @@
+2013-01-03  Asterisk Development Team <asteriskteam at digium.com>
+
+	* Asterisk 11.1.2 Released.
+
+	* Prevent crashes in res_xmpp when receiving large messages
+
+	  Similar to r378287, res_xmpp was marshaling data read from an
+	  external source onto the stack. For a sufficiently large message,
+	  this could cause a stack overflow. This patch modifies res_xmpp in a
+	  similar fashion to res_jabber by removing the stack allocation, as
+	  it was unnecessary.
+
+	* Prevent exhaustion of system resources through exploitation of event
+	  cache
+
+	  This patch changes res_xmpp to no longer cache events under certain
+	  circumstances.
+
 2013-01-02  Asterisk Development Team <asteriskteam at digium.com>
 
 	* Asterisk 11.1.1 Released.

Modified: tags/11.1.2/res/res_xmpp.c
URL: http://svnview.digium.com/svn/asterisk/tags/11.1.2/res/res_xmpp.c?view=diff&rev=378415&r1=378414&r2=378415
==============================================================================
--- tags/11.1.2/res/res_xmpp.c (original)
+++ tags/11.1.2/res/res_xmpp.c Thu Jan  3 10:10:55 2013
@@ -919,7 +919,7 @@
  * \return iks *
  */
 static iks* xmpp_pubsub_build_publish_skeleton(struct ast_xmpp_client *client, const char *node,
-					       const char *event_type)
+					       const char *event_type, unsigned int cachable)
 {
 	RAII_VAR(struct xmpp_config *, cfg, ao2_global_obj_ref(globals), ao2_cleanup);
 	iks *request, *pubsub, *publish, *item;
@@ -934,6 +934,22 @@
 	iks_insert_attrib(publish, "node", ast_test_flag(&cfg->global->pubsub, XMPP_XEP0248) ? node : event_type);
 	item = iks_insert(publish, "item");
 	iks_insert_attrib(item, "id", node);
+
+	if (cachable == AST_DEVSTATE_NOT_CACHABLE) {
+		iks *options, *x, *field_form_type, *field_persist;
+
+		options = iks_insert(pubsub, "publish-options");
+		x = iks_insert(options, "x");
+		iks_insert_attrib(x, "xmlns", "jabber:x:data");
+		iks_insert_attrib(x, "type", "submit");
+		field_form_type = iks_insert(x, "field");
+		iks_insert_attrib(field_form_type, "var", "FORM_TYPE");
+		iks_insert_attrib(field_form_type, "type", "hidden");
+		iks_insert_cdata(iks_insert(field_form_type, "value"), "http://jabber.org/protocol/pubsub#publish-options", 0);
+		field_persist = iks_insert(x, "field");
+		iks_insert_attrib(field_persist, "var", "pubsub#persist_items");
+		iks_insert_cdata(iks_insert(field_persist, "value"), "0", 1);
+	}
 
 	return item;
 
@@ -1107,7 +1123,7 @@
 
 	snprintf(full_mailbox, sizeof(full_mailbox), "%s@%s", mailbox, context);
 
-	if (!(request = xmpp_pubsub_build_publish_skeleton(client, full_mailbox, "message_waiting"))) {
+	if (!(request = xmpp_pubsub_build_publish_skeleton(client, full_mailbox, "message_waiting", AST_DEVSTATE_CACHABLE))) {
 		return;
 	}
 
@@ -1131,13 +1147,13 @@
  * \return void
  */
 static void xmpp_pubsub_publish_device_state(struct ast_xmpp_client *client, const char *device,
-					     const char *device_state)
+					     const char *device_state, unsigned int cachable)
 {
 	RAII_VAR(struct xmpp_config *, cfg, ao2_global_obj_ref(globals), ao2_cleanup);
 	iks *request, *state;
-	char eid_str[20];
-
-	if (!cfg || !cfg->global || !(request = xmpp_pubsub_build_publish_skeleton(client, device, "device_state"))) {
+	char eid_str[20], cachable_str[2];
+
+	if (!cfg || !cfg->global || !(request = xmpp_pubsub_build_publish_skeleton(client, device, "device_state", cachable))) {
 		return;
 	}
 
@@ -1153,6 +1169,8 @@
 	state = iks_insert(request, "state");
 	iks_insert_attrib(state, "xmlns", "http://asterisk.org");
 	iks_insert_attrib(state, "eid", eid_str);
+	snprintf(cachable_str, sizeof(cachable_str), "%u", cachable);
+	iks_insert_attrib(state, "cachable", cachable_str);
 	iks_insert_cdata(state, device_state, strlen(device_state));
 	ast_xmpp_client_send(client, iks_root(request));
 	iks_delete(request);
@@ -1195,6 +1213,7 @@
 {
 	struct ast_xmpp_client *client = data;
 	const char *device, *device_state;
+	unsigned int cachable;
 
 	if (ast_eid_cmp(&ast_eid_default, ast_event_get_ie_raw(ast_event, AST_EVENT_IE_EID))) {
 		/* If the event didn't originate from this server, don't send it back out. */
@@ -1204,7 +1223,8 @@
 
 	device = ast_event_get_ie_str(ast_event, AST_EVENT_IE_DEVICE);
 	device_state = ast_devstate_str(ast_event_get_ie_uint(ast_event, AST_EVENT_IE_STATE));
-	xmpp_pubsub_publish_device_state(client, device, device_state);
+	cachable = ast_event_get_ie_uint(ast_event, AST_EVENT_IE_CACHABLE);
+	xmpp_pubsub_publish_device_state(client, device, device_state, cachable);
 }
 
 /*!
@@ -1287,11 +1307,12 @@
  */
 static int xmpp_pubsub_handle_event(void *data, ikspak *pak)
 {
-	char *item_id, *device_state, *context;
+	char *item_id, *device_state, *context, *cachable_str;
 	int oldmsgs, newmsgs;
 	iks *item, *item_content;
 	struct ast_eid pubsub_eid;
 	struct ast_event *event;
+	unsigned int cachable = AST_DEVSTATE_CACHABLE;
 	item = iks_find(iks_find(iks_find(pak->x, "event"), "items"), "item");
 	if (!item) {
 		ast_log(LOG_ERROR, "Could not parse incoming PubSub event\n");
@@ -1306,6 +1327,9 @@
 	}
 	if (!strcasecmp(iks_name(item_content), "state")) {
 		device_state = iks_find_cdata(item, "state");
+		if ((cachable_str = iks_find_cdata(item, "cachable"))) {
+			sscanf(cachable_str, "%30d", &cachable);
+		}
 		if (!(event = ast_event_new(AST_EVENT_DEVICE_STATE_CHANGE,
 					    AST_EVENT_IE_DEVICE, AST_EVENT_IE_PLTYPE_STR, item_id, AST_EVENT_IE_STATE,
 					    AST_EVENT_IE_PLTYPE_UINT, ast_devstate_val(device_state), AST_EVENT_IE_EID,
@@ -1330,7 +1354,13 @@
 			  iks_name(item_content));
 		return IKS_FILTER_EAT;
 	}
-	ast_event_queue_and_cache(event);
+
+	if (cachable == AST_DEVSTATE_CACHABLE) {
+		ast_event_queue_and_cache(event);
+	} else {
+		ast_event_queue(event);
+	}
+
 	return IKS_FILTER_EAT;
 }
 
@@ -1832,7 +1862,7 @@
 {
 	RAII_VAR(struct xmpp_config *, cfg, ao2_global_obj_ref(globals), ao2_cleanup);
 	RAII_VAR(struct ast_xmpp_client_config *, clientcfg, NULL, ao2_cleanup);
-	char *aux = NULL, *parse = NULL;
+	char *parse = NULL;
 	int timeout, jidlen, resourcelen, found = 0;
 	struct timeval start;
 	long diff = 0;
@@ -1946,7 +1976,7 @@
 				continue;
 			}
 			found = 1;
-			aux = ast_strdupa(message->message);
+			ast_copy_string(buf, message->message, buflen);
 			AST_LIST_REMOVE_CURRENT(list);
 			xmpp_message_destroy(message);
 			break;
@@ -1970,7 +2000,6 @@
 		ast_log(LOG_NOTICE, "Timed out : no message received from %s\n", args.jid);
 		return -1;
 	}
-	ast_copy_string(buf, aux, buflen);
 
 	return 0;
 }




More information about the asterisk-commits mailing list