twemproxy中经典 bug分析

      在nc_message.c中定义了局部变量sendv,且定义为栈上空间,在后续调用中array_push(&sendv),如果array的size达到预定义的值,在array_push会对send->elem进行realloc。

      问题就出现了,sendv是栈上变量,不允许对其进行realloc(只有堆变量才可以)。知道原因了,修复方案很简单,send改为malloc方式获得。

      代码如下:

...
struct array sendv;                  /* send iovec */
...

ciov = array_push(&sendv);
            |
            |
        array_push(struct array *a)
        {
         ...
            if (a->nelem == a->nalloc) {
               /* the array is full; allocate new array */                                                         
               size = a->size * a->nalloc;
               new = nc_realloc(a->elem, 2 * size);
         }

 

你可能感兴趣的:(twemproxy)