Patch 7.4.1261
Problem:    Pending channel messages are garbage collected. Leaking memory in
            ch_sendexpr().  Leaking memory for a decoded JSON string.
Solution:   Mark the message list as used. Free the encoded JSON.  Don't save
            the JSON string.
Files:      src/eval.c, src/channel.c, src/json.c, src/proto/channel.pro


*** ../vim-7.4.1260/src/eval.c  2016-02-02 20:46:29.711412047 +0100
--- src/eval.c  2016-02-04 22:40:45.289175845 +0100
***************
*** 6855,6860 ****
--- 6855,6864 ----
      abort = abort || set_ref_in_python3(copyID);
  #endif
  
+ #ifdef FEAT_CHANNEL
+     abort = abort || set_ref_in_channel(copyID);
+ #endif
+ 
      if (!abort)
      {
        /*
***************
*** 9842,9847 ****
--- 9846,9852 ----
        return;
  
      ch_idx = send_common(argvars, text, "sendexpr");
+     vim_free(text);
      if (ch_idx >= 0)
      {
        if (channel_read_json_block(ch_idx, id, &listtv) == OK)
*** ../vim-7.4.1260/src/channel.c       2016-02-04 22:09:44.692012667 +0100
--- src/channel.c       2016-02-04 22:37:22.011218253 +0100
***************
*** 1315,1318 ****
--- 1315,1343 ----
      return ret;
  }
  
+     int
+ set_ref_in_channel(int copyID)
+ {
+     int           i;
+     int           abort = FALSE;
+ 
+     for (i = 0; i < channel_count; ++i)
+     {
+       jsonq_T *head = &channels[i].ch_json_head;
+       jsonq_T *item = head->next;
+ 
+       while (item != head)
+       {
+           list_T      *l = item->value->vval.v_list;
+ 
+           if (l->lv_copyID != copyID)
+           {
+               l->lv_copyID = copyID;
+               abort = abort || set_ref_in_list(l, copyID, NULL);
+           }
+           item = item->next;
+       }
+     }
+     return abort;
+ }
  #endif /* FEAT_CHANNEL */
*** ../vim-7.4.1260/src/json.c  2016-02-02 19:43:53.042456259 +0100
--- src/json.c  2016-02-04 22:43:55.335218936 +0100
***************
*** 533,542 ****
        if (res != NULL)
        {
            res->v_type = VAR_STRING;
!           if (ga.ga_data == NULL)
!               res->vval.v_string = NULL;
!           else
!               res->vval.v_string = vim_strsave(ga.ga_data);
        }
        return OK;
      }
--- 533,539 ----
        if (res != NULL)
        {
            res->v_type = VAR_STRING;
!           res->vval.v_string = ga.ga_data;
        }
        return OK;
      }
*** ../vim-7.4.1260/src/proto/channel.pro       2016-02-02 23:22:38.101181704 
+0100
--- src/proto/channel.pro       2016-02-04 22:36:55.923476301 +0100
***************
*** 22,25 ****
--- 22,26 ----
  int channel_select_setup(int maxfd_in, void *rfds_in);
  int channel_select_check(int ret_in, void *rfds_in);
  int channel_parse_messages(void);
+ int set_ref_in_channel(int copyID);
  /* vim: set ft=c : */
*** ../vim-7.4.1260/src/version.c       2016-02-04 22:09:44.692012667 +0100
--- src/version.c       2016-02-04 22:32:10.766231369 +0100
***************
*** 744,745 ****
--- 744,747 ----
  {   /* Add new patch number below this line */
+ /**/
+     1261,
  /**/

-- 
hundred-and-one symptoms of being an internet addict:
141. You'd rather go to http://www.weather.com/ than look out your window.

 /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net   \\\
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\  an exciting new programming language -- http://www.Zimbu.org        ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Raspunde prin e-mail lui