]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Merged revisions 198375 via svnmerge from
authorSean Bright <sean@malleable.com>
Sat, 30 May 2009 20:21:03 +0000 (20:21 +0000)
committerSean Bright <sean@malleable.com>
Sat, 30 May 2009 20:21:03 +0000 (20:21 +0000)
https://origsvn.digium.com/svn/asterisk/trunk

........
  r198375 | seanbright | 2009-05-30 16:11:33 -0400 (Sat, 30 May 2009) | 13 lines

  Properly terminate the receive buffer before sending to iksemel.

  aji_io_recv takes the maximum number of bytes to read (instead of the total
  buffer size), so we have to subtract 1 from our buffer size.  Without this, when
  we receive packets that are larger than our buffer, iksemel will choke and
  things get wonky.

  (closes issue #15232)
  Reported by: lp0
  Patches:
        05302009_res_jabber.c.patch uploaded by seanbright (license 71)
  Tested by: seanbright, lp0
........

git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.6.1@198390 65c4cc65-6c06-0410-ace0-fbb531ad65f3

res/res_jabber.c

index 053056ce94fdde51f29d0c21e2424a77e7ba4326..b8fd910282d7b6632c569c6e088cc0b5ec70ddef 100644 (file)
@@ -645,8 +645,8 @@ static int aji_io_recv(struct aji_client *client, char *buffer, size_t buf_len,
 static int aji_recv (struct aji_client *client, int timeout)
 {
        int len, ret;
-       char buf[NET_IO_BUF_SIZE -1];
-       char newbuf[NET_IO_BUF_SIZE -1];
+       char buf[NET_IO_BUF_SIZE - 1];
+       char newbuf[NET_IO_BUF_SIZE - 1];
        int pos = 0;
        int newbufpos = 0;
        unsigned char c;
@@ -655,7 +655,7 @@ static int aji_recv (struct aji_client *client, int timeout)
        memset(newbuf, 0, sizeof(newbuf));
 
        while (1) {
-               len = aji_io_recv(client, buf, NET_IO_BUF_SIZE - 1, timeout);
+               len = aji_io_recv(client, buf, NET_IO_BUF_SIZE - 2, timeout);
                if (len < 0) return IKS_NET_RWERR;
                if (len == 0) return IKS_NET_EXPIRED;
                buf[len] = '\0';
@@ -688,8 +688,18 @@ static int aji_recv (struct aji_client *client, int timeout)
                ret = iks_parse(client->p, newbuf, 0, 0);
                memset(newbuf, 0, sizeof(newbuf));
 
+               switch (ret) {
+               case IKS_NOMEM:
+                       ast_log(LOG_WARNING, "Parsing failure: Out of memory.\n");
+                       break;
+               case IKS_BADXML:
+                       ast_log(LOG_WARNING, "Parsing failure: Invalid XML.\n");
+                       break;
+               case IKS_HOOK:
+                       ast_log(LOG_WARNING, "Parsing failure: Hook returned an error.\n");
+                       break;
+               }
                if (ret != IKS_OK) {
-                       ast_log(LOG_WARNING, "XML parsing failed\n");
                        return ret;
                }
                ast_debug(3, "XML parsing successful\n");