[SR-Users] [sr-dev] kamailio core at qm_status

Andrei Pelinescu-Onciul andrei at iptel.org
Mon Oct 1 12:59:25 CEST 2012


On Sep 19, 2012 at 10:54, Jijo <realjijo at gmail.com> wrote:
> Hi All,
> 
> Finally i found the issue,
> 
> Here is one of the bad trace for SUBSCRIBE(722bytes) and NOTIFY(1282bytes)
> which corrupted the memory. The messages came in the order NOTIFY and
> SUBSCRIBE. The core is generated in a different place but I believe this
> could be the reason for memory corruption.
> 
> Here is the trace UDP Process 27294 processing NOTIFY and Process
> 27303 processing
> SUBSCRIBE .
> 
[...]

> 
> Process 27294(NOTIFY) created the TCP connection structure for destination
> IP and just before calling wbufq_insert(), context switch happened and
> process 27303(SUBSCRIBE) got the cpu. Since the connection structure is
> already available process 27303 add the SUBSCRIBE message(722 bytes) to
> wbufq. Afterwards process 27294 got the CPU and invoked wbufq_insert()
> which basically corrupted the memory due to an overflow with the existing
> implementation.
> 
> 

Thanks a lot, it was indeed a problem in _wbufq_insert, however the fix
is slightly different (see below).
> 

[...]

> I think we don?t need memove, so we can change the code as below

We need the memmove, because the memory areas might overlap
(e.g we are moving a 1000 bytes message  only 512 bytes further in the
buffer).
> 
> 
> 
>        if ((q->first==q->last) && ((q->last->b_size-q->last_used)>=size)){
> 
>                 /* one block with enough space in it for size bytes */
> 
>                 //memmove(q->first->buf+size, q->first->buf, size);
> 
>                 memcpy(q->first->buf+q->last_used, data, size);

The problem here was that the wrong size was used for the memmove.
The fixed version is:
                  memmove(q->first->buf+size, q->first->buf, q->last_used);
> 
>                 q->last_used+=size;
> 
>         }
[...]


Andrei



More information about the sr-users mailing list