]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
FS-3621 --resolve
authorAnthony Minessale <anthm@freeswitch.org>
Thu, 20 Oct 2011 15:19:39 +0000 (10:19 -0500)
committerAnthony Minessale <anthm@freeswitch.org>
Thu, 20 Oct 2011 15:19:39 +0000 (10:19 -0500)
src/mod/event_handlers/mod_event_socket/mod_event_socket.c

index f6ea4735ce8c0e6c955c68917d3cbe291dd6c779..76149ffed97f160af12f03004137d6db546860ed 100644 (file)
@@ -1095,7 +1095,7 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_event_socket_load)
 static switch_status_t read_packet(listener_t *listener, switch_event_t **event, uint32_t timeout)
 {
        switch_size_t mlen, bytes = 0;
-       char mbuf[2048] = "";
+       char *mbuf = NULL;
        char buf[1024] = "";
        switch_size_t len;
        switch_status_t status = SWITCH_STATUS_SUCCESS;
@@ -1105,16 +1105,20 @@ static switch_status_t read_packet(listener_t *listener, switch_event_t **event,
        void *pop;
        char *ptr;
        uint8_t crcount = 0;
-       uint32_t max_len = sizeof(mbuf);
+       uint32_t max_len = 10485760, block_len = 2048, buf_len = 0;
        switch_channel_t *channel = NULL;
        int clen = 0;
 
        *event = NULL;
 
        if (prefs.done) {
-               return SWITCH_STATUS_FALSE;
+               switch_goto_status(SWITCH_STATUS_FALSE, end);
        }
 
+       switch_zmalloc(mbuf, block_len);
+       switch_assert(mbuf);
+       buf_len = block_len;
+
        start = switch_epoch_time_now(NULL);
        ptr = mbuf;
 
@@ -1126,10 +1130,24 @@ static switch_status_t read_packet(listener_t *listener, switch_event_t **event,
                uint8_t do_sleep = 1;
                mlen = 1;
 
+               if (bytes == buf_len - 1) {
+                       char *tmp;
+                       int pos;
+
+                       pos = (ptr - mbuf);
+                       buf_len += block_len;
+                       tmp = realloc(mbuf, buf_len);
+                       switch_assert(tmp);
+                       mbuf = tmp;
+                       memset(mbuf + bytes, 0, buf_len - bytes);
+                       ptr = (mbuf + pos);
+
+               }
+               
                status = switch_socket_recv(listener->sock, ptr, &mlen);
 
                if (prefs.done || (!SWITCH_STATUS_IS_BREAK(status) && status != SWITCH_STATUS_SUCCESS)) {
-                       return SWITCH_STATUS_FALSE;
+                       switch_goto_status(SWITCH_STATUS_FALSE, end);
                }
 
                if (mlen) {
@@ -1198,7 +1216,7 @@ static switch_status_t read_packet(listener_t *listener, switch_event_t **event,
 
                                                                                        if (prefs.done || (!SWITCH_STATUS_IS_BREAK(status) && status != SWITCH_STATUS_SUCCESS)) {
                                                                                                free(body);                                                                                             
-                                                                                               return SWITCH_STATUS_FALSE;
+                                                                                               switch_goto_status(SWITCH_STATUS_FALSE, end);
                                                                                        }
 
                                                                                        /*
@@ -1230,7 +1248,7 @@ static switch_status_t read_packet(listener_t *listener, switch_event_t **event,
                        elapsed = (uint32_t) (switch_epoch_time_now(NULL) - start);
                        if (elapsed >= timeout) {
                                switch_clear_flag_locked(listener, LFLAG_RUNNING);
-                               return SWITCH_STATUS_FALSE;
+                               switch_goto_status(SWITCH_STATUS_FALSE, end);
                        }
                }
 
@@ -1354,6 +1372,9 @@ static switch_status_t read_packet(listener_t *listener, switch_event_t **event,
                }
        }
 
+ end:
+
+       //switch_safe_free(mbuf);
        return status;
 
 }