diff --git a/channels/chan_gtalk.c b/channels/chan_gtalk.c index 604d4c27f8..9aaeeae6c1 100644 --- a/channels/chan_gtalk.c +++ b/channels/chan_gtalk.c @@ -111,8 +111,8 @@ struct gtalk_pvt { time_t laststun; struct gtalk *parent; /*!< Parent client */ char sid[100]; - char us[100]; - char them[100]; + char us[AJI_MAX_JIDLEN]; + char them[AJI_MAX_JIDLEN]; char ring[10]; /*!< Message ID of ring */ iksrule *ringrule; /*!< Rule for matching RING request */ int initiator; /*!< If we're the initiator */ @@ -154,8 +154,8 @@ struct gtalk { struct gtalk_pvt *p; struct ast_codec_pref prefs; int amaflags; /*!< AMA Flags */ - char user[100]; - char context[100]; + char user[AJI_MAX_JIDLEN]; + char context[AST_MAX_CONTEXT]; char accountcode[AST_MAX_ACCOUNT_CODE]; /*!< Account code */ int capability; ast_group_t callgroup; /*!< Call group */ @@ -1567,7 +1567,7 @@ static int gtalk_show_channels(int fd, int argc, char **argv) struct gtalk_pvt *p; struct ast_channel *chan; int numchans = 0; - char them[100]; + char them[AJI_MAX_JIDLEN]; char *jid = NULL; char *resource = NULL; @@ -1758,7 +1758,7 @@ static int gtalk_load_config(void) { char *cat = NULL; struct ast_config *cfg = NULL; - char context[100]; + char context[AST_MAX_CONTEXT]; int allowguest = 1; struct ast_variable *var; struct gtalk *member; diff --git a/include/asterisk/jabber.h b/include/asterisk/jabber.h index 181fc1a14a..39618cd4ba 100644 --- a/include/asterisk/jabber.h +++ b/include/asterisk/jabber.h @@ -23,6 +23,19 @@ #include "asterisk/astobj.h" #include "asterisk/linkedlists.h" +/* + * As per RFC 3920 - section 3.1, the maximum length for a full Jabber ID + * is 3071 bytes. + * The ABNF syntax for jid : + * jid = [node "@" ] domain [ "/" resource ] + * Each allowable portion of a JID (node identifier, domain identifier, + * and resource identifier) MUST NOT be more than 1023 bytes in length, + * resulting in a maximum total size (including the '@' and '/' separators) + * of 3071 bytes. + */ +#define AJI_MAX_JIDLEN 3071 +#define AJI_MAX_RESJIDLEN 1023 + enum aji_state { AJI_DISCONNECTING, AJI_DISCONNECTED, @@ -56,7 +69,7 @@ struct aji_capabilities { struct aji_resource { int status; - char resource[80]; + char resource[AJI_MAX_RESJIDLEN]; char *description; struct aji_version *cap; int priority; @@ -72,7 +85,7 @@ struct aji_message { }; struct aji_buddy { - ASTOBJ_COMPONENTS(struct aji_buddy); + ASTOBJ_COMPONENTS_FULL(struct aji_buddy, AJI_MAX_JIDLEN, 1); struct aji_resource *resources; unsigned int flags; }; @@ -88,9 +101,8 @@ struct aji_transport_container { struct aji_client { ASTOBJ_COMPONENTS(struct aji_client); char password[160]; - char user[160]; - char serverhost[160]; - char context[100]; + char user[AJI_MAX_JIDLEN]; + char serverhost[AJI_MAX_RESJIDLEN]; char statusmessage[256]; char sid[10]; /* Session ID */ char mid[6]; /* Message ID */