Commit Graph

931 Commits

Author SHA1 Message Date
Thiago de Arruda
48ac06506b API: Bugfix: Remove possible double-free in buffer_get_line 2014-05-28 08:52:54 -03:00
Thiago de Arruda
89ded2dac8 Add kvec.h macro library 2014-05-28 08:52:54 -03:00
Thiago de Arruda
09bcd97023 WStream: Refactor: Use reference count for memory management
Now `wstream_write` receives pointers for WBuffer objects(created with
wstream_new_buffer), which stores a reference count to determine when it's safe
the free the buffer. This was done to enable writing of the same buffer to
multiple WStream instances
2014-05-28 08:52:54 -03:00
Thiago de Arruda
1c308e28f1 Refactor: Use size_t for {w,r}streams.c 2014-05-28 08:52:54 -03:00
Justin M. Keyes
1faf546ea2 Merge #713 'Fix localization' 2014-05-27 20:38:10 -04:00
Eliseo Martínez
3390be96bf Fix localization: Update po files.
Sync po files to code at 3a68a4861a.
2014-05-27 19:58:42 -04:00
Eliseo Martínez
5e83fa0e66 Fix localization: Fix po files.
Problem:  Build fails because of some messages being repeated.
          Curiously, all repeated messages have this comment:
          "Explicit typecast avoids warning on Mac OS X 10.6".
          No idea why.
Solution: Remove repeated messages.
2014-05-27 19:58:42 -04:00
Eliseo Martínez
89bdcb1ed8 Fix localization: Fix build: Improve checking.
Problem  : Currently, 'make check' gives no explanations when it fails,
           only the name of the po file which caused the halt. Then,
           you have to manually run check.vim on that file to see what
           happened.
Solution : Generate a 'check.log' file on every execution of check.vim
           (overwriting if already existing). That way, when make halts,
           you can go there and see details about failure.
2014-05-27 19:58:42 -04:00
Eliseo Martínez
8e3634212d Fix localization: Fix build: Fix sjis-fixing executable.
Problem:  Executable used to fix japanese files with sjis encoding
          (sjiscorr) fails to compile.
Solution: - Add mising includes.
          - Remove __END_DECLS.
          - Add removed comments.
2014-05-27 19:58:41 -04:00
Eliseo Martínez
0e9d2464b4 Fix localization: Fix build: Fix sed issue on OSX.
Problem:  On OSX, sed commands processing files converted to encodings
          other that UTF-8 fail with "RE error: illegal byte sequence".
Solution: Make sed execute with C locale throgh environment variables
          (LANG=C, LC_ALL=C, LC_CTYPE=C).
2014-05-27 19:58:41 -04:00
Eliseo Martínez
a0b78b5733 Fix localization: Fix build: Fix included source files.
Problem  : Previous build assumed all *.c files were in parent dir. It
           only included globals.h, too.
Solution : Include all *.c and *.h files under parent dir (including
           subdirs).
2014-05-27 19:58:41 -04:00
Eliseo Martínez
cd49b073e9 Fix localization: Fix build: Fix dangling references.
Problem:  Makefile references some files that don't exist anymore.
Solution: Remove those references.
2014-05-27 19:58:41 -04:00
Justin M. Keyes
dcc2b25529 Merge #756 'vim-patch:7.4.267' 2014-05-27 16:52:01 -04:00
oni-link
753401ab4c vim-patch:7.4.267
Problem:    The '[ mark is in the wrong position after "gq". (Ingo Karkat)
Solution:   Add the setmark argument to do_join(). (Christian Brabandt)

https://code.google.com/p/vim/source/detail?r=75f222d67cea335efbe0274de6340dba174c1e7e
2014-05-27 16:51:10 -04:00
Thiago de Arruda
1b43e5c47e Merge branch 'remove-multiple-protocol-support' 2014-05-27 15:09:14 -03:00
Thiago de Arruda
b8e563f516 Refactor: Remove support for multiple protocols
This removes the boilerplate code supporting more than one RPC protocol as it
was becoming hard to maintain and we probably won't ever need it.
2014-05-27 10:19:38 -03:00
Justin M. Keyes
277554a9eb Merge pull request #749 from oni-link/vim-patch-7-4-285
vim-patch:7.4.285
2014-05-26 20:44:32 -04:00
Thiago de Arruda
7df7d6bb5b Merge branch 'api-events' 2014-05-26 14:10:38 -03:00
Thiago de Arruda
cbf9564ee0 API: Bugfix: Remove memory leak from buffer_get_line 2014-05-26 14:02:13 -03:00
Thiago de Arruda
327347e3b4 API: Bugfix: Remove memory leak from buffer_set_name 2014-05-26 14:02:13 -03:00
Thiago de Arruda
807f940aa4 API: Bugfix: Remove memory leak from buffer_set_slice 2014-05-26 14:02:12 -03:00
Thiago de Arruda
0cc6050300 API: Bugfix: Remove memory leak from set_option_to 2014-05-26 14:02:12 -03:00
Thiago de Arruda
a80a68c927 Build: Enable valgrind's --leak-check when testing the API 2014-05-26 14:02:12 -03:00
Thiago de Arruda
d6291894d4 Build: Add more files to clint-files.txt and fix errors 2014-05-26 14:02:12 -03:00
Thiago de Arruda
3f990f1afb Build: Add api/{helpers,handle}.c to CONV_SRCS 2014-05-26 14:02:12 -03:00
Thiago de Arruda
e994b6f1b1 Build: Add 'nonnull' attributes to msgpack_rpc functions 2014-05-26 14:02:12 -03:00
Thiago de Arruda
f3dc04bf7f API: Events: Implement channel_send_event and vimscript wrapper
This function can be used to send arbitrary objects via the API channel back to
connected clients, identified by channel id.
2014-05-26 14:02:12 -03:00
Thiago de Arruda
139c7ffdc7 API: Events: Return channel id from the API discover request
This refactors msgapck_rpc_{dipatch,call} to receive the channel id as
argument. Now the discovery request returns the [id, metadata] array.
2014-05-26 14:02:12 -03:00
Thiago de Arruda
7a00caf7c4 API: Refactor: Close/free channels when their streams reach EOF 2014-05-26 14:02:12 -03:00
Thiago de Arruda
4bac5e9ce1 API: Refactor: Duplicate/free string arguments coming from msgpack
When receiving strings *from* msgpack, we don't need to duplicate/free since
the data only lives in the msgpack parse buffer until the end of the call.

But in order to reuse `msgpack_rpc_free_object` when sending event data(which is
sent *to* msgpack), Strings must be freed, which means they must also be
allocated separately.
2014-05-26 14:02:12 -03:00
Thiago de Arruda
339d106f7c Dead code: Remove unused vimscript functions(from FEAT_CLIENTSERVER) 2014-05-26 14:02:12 -03:00
Thiago de Arruda
fc7bc0412e Merge pull request #761 'fix a few strncpy calls by using xstrlcpy' 2014-05-26 13:09:42 -03:00
Nicolas Hillegeer
014febef22 coverity: fix BUFFER_SIZE_WARNING with str{n,l}cpy
Relates to issue #760

These coverity warnings are of the form:

>>>     CID 62602:  Buffer not null terminated  (BUFFER_SIZE_WARNING)
>>>     Calling strncpy with a maximum size argument of 256 bytes...

This is caused by strncpy not alway NULL-terminated the destination buffer
(for example in the case where strlen(src) >= size(dst)). It's better to
replace that with (x)strlcpy, which always NULL-terminates.

Most of these are related to the set_api_error macro, which uses strncpy.
The error struct is used (for example) in msgpack_rpc_error, where strlen is
executed on it, so it needs to be NULL-terminated. (x)strlcpy, unlike
strncpy, always NULL-terminates the destination buffer.

Relevant parts of the coverity report:

*** CID 62602:  Buffer not null terminated  (BUFFER_SIZE_WARNING)
/src/nvim/api/vim.c: 236 in vim_set_current_buffer()
230         if (try_end(err)) {
231           return;
232         }
233
234         char msg[256];
235         snprintf(msg, sizeof(msg),
              "failed to switch to buffer %d", (int)buffer);
>>>     CID 62602:  Buffer not null terminated  (BUFFER_SIZE_WARNING)
>>>     Calling strncpy with a maximum size argument of 256 bytes on
>>>     destination array "err->msg" of size 256 bytes might leave the
>>>     destination string unterminated.
236         set_api_error(msg, err);
237         return;
238       }
239
240       try_end(err);
241     }

*** CID 62603:  Buffer not null terminated  (BUFFER_SIZE_WARNING)
/src/nvim/api/private/helpers.c: 70 in try_end()
64       } else if (msg_list != NULL && *msg_list != NULL) {
65         int should_free;
66         char *msg = (char *)get_exception_string(*msg_list,
67                                                  ET_ERROR,
68                                                  NULL,
69                                                  &should_free);
>>>     CID 62603:  Buffer not null terminated  (BUFFER_SIZE_WARNING)
>>>     Calling strncpy with a maximum size argument of 256 bytes on
>>>     destination array "err->msg" of size 256 bytes might leave the
>>>     destination string unterminated.
70         strncpy(err->msg, msg, sizeof(err->msg));
71         err->set = true;
72         free_global_msglist();
73
74         if (should_free) {
75           free(msg);
/src/nvim/api/private/helpers.c: 78 in try_end()
72         free_global_msglist();
73
74         if (should_free) {
75           free(msg);
76         }
77       } else if (did_throw) {
>>>     CID 62603:  Buffer not null terminated  (BUFFER_SIZE_WARNING)
>>>     Calling strncpy with a maximum size argument of 256 bytes on
>>>     destination array "err->msg" of size 256 bytes might leave the
>>>     destination string unterminated.
78         set_api_error((char *)current_exception->value, err);
79       }
80
81       return err->set;
82     }
83

*** CID 62604:  Buffer not null terminated  (BUFFER_SIZE_WARNING)
/src/nvim/api/private/helpers.c: 592 in set_option_value_err()
586                                              opt_flags)))
587       {
588         if (try_end(err)) {
589           return;
590         }
591
>>>     CID 62604:  Buffer not null terminated  (BUFFER_SIZE_WARNING)
>>>     Calling strncpy with a maximum size argument of 256 bytes on
>>>     destination array "err->msg" of size 256 bytes might leave the
>>>     destination string unterminated.
592         set_api_error(errmsg, err);
593       }

*** CID 62605:  Buffer not null terminated  (BUFFER_SIZE_WARNING)
/src/nvim/os/server.c: 114 in server_start()
108       if (addr_len > sizeof(ip) - 1) {
109         // Maximum length of a ip address buffer is 15(eg: 255.255.255.255)
110         addr_len = sizeof(ip);
111       }
112
113       // Extract the address part
>>>     CID 62605:  Buffer not null terminated  (BUFFER_SIZE_WARNING)
>>>     Calling strncpy with a maximum size argument of 16 bytes on
>>>     destination array "ip" of size 16 bytes might leave the destination
>>>     string unterminated.
114       strncpy(ip, addr, addr_len);
115
116       int port = NEOVIM_DEFAULT_TCP_PORT;
117
118       if (*ip_end == ':') {
119         char *port_end;
/src/nvim/os/server.c: 88 in server_start()
82
83     void server_start(char *endpoint, ChannelProtocol prot)
84     {
85       char addr[ADDRESS_MAX_SIZE];
86
87       // Trim to `ADDRESS_MAX_SIZE`
>>>     CID 62605:  Buffer not null terminated  (BUFFER_SIZE_WARNING)
>>>     Calling strncpy with a maximum size argument of 256 bytes on
>>>     destination array "addr" of size 256 bytes might leave the
>>>     destination string unterminated.
88       strncpy(addr, endpoint, sizeof(addr));
89
90       // Check if the server already exists
91       if (map_has(cstr_t)(servers, addr)) {
92         EMSG2("Already listening on %s", addr);
93         return;

*** CID 62606:  Buffer not null terminated  (BUFFER_SIZE_WARNING)
/src/nvim/os/server.c: 186 in server_stop()
180     void server_stop(char *endpoint)
181     {
182       Server *server;
183       char addr[ADDRESS_MAX_SIZE];
184
185       // Trim to `ADDRESS_MAX_SIZE`
>>>     CID 62606:  Buffer not null terminated  (BUFFER_SIZE_WARNING)
>>>     Calling strncpy with a maximum size argument of 256 bytes on
>>>     destination array "addr" of size 256 bytes might leave the
>>>     destination string unterminated.
187
188       if ((server = map_get(cstr_t)(servers, addr)) == NULL) {
189         EMSG2("Not listening on %s", addr);
190         return;
191       }
2014-05-26 13:08:45 -03:00
Nicolas Hillegeer
a50a34f472 memory: add xstrlcpy
Less "blow a hole in your foot" than strncpy. As also indicated by coverity.
Implementation inspired by the linux kernel (very similar to OSX's Libc
implementation as well).
2014-05-26 13:08:45 -03:00
Justin M. Keyes
3a68a4861a Merge #733 'Simplify edit.c functions replace_{push,pop}.' 2014-05-24 04:57:25 -04:00
oni-link
49306cfa02 Simplify edit.c functions replace_{push,pop}.
* Replace xmalloc (+memmove) with xrealloc
* Code style adjustments.
* Remove obsolete TODO comment
2014-05-24 04:55:10 -04:00
Rainer Borene
4464732503 Add Reddit link to README. ref #704 2014-05-24 01:53:04 -04:00
Justin M. Keyes
f75d4bc3e1 Merge pull request #757 from elmart/remove-long_u
Remove project-specific integer types: long_u. (1)
2014-05-24 01:47:52 -04:00
Eliseo Martínez
f179081fc8 Remove long_u: hashtab: Enable clint: Add to clint.
- Add hashtab.[ch] to clint file.
- Fix clint errors.
2014-05-24 01:17:51 +02:00
Eliseo Martínez
ffed9bfae9 Remove long_u: hashtab: Enable clint: Sort clint file. 2014-05-24 01:17:50 +02:00
Eliseo Martínez
0509556b93 Remove long_u: hashtab: Refactor other types.
Current type of some other parameters/variables can be improved:
- hashtab_T         : ht_error : int  -> bool.
- hash_clear_all()  : off      : int  -> unsigned int.
- hash_clear_all()  : todo     : long -> size_t.
- hash_may_resize() : todo     : int  -> size_t.
2014-05-24 01:17:49 +02:00
Eliseo Martínez
ec89761e8a Remove long_u: hashtab: Refactor long_u type.
hashtab.h:
- hash_T: long_u -> size_t.

  In principle, a hash value could thought of as just an unsigned number
  without size semantics (uint32_t or uint64_t).  But it is used as
  index at some places, and so, size_t is also eligible. Therea re some
  places where assignments occur between hash_T and size_t variables, in
  both directions. Therefore, if we define hash_T to be of a type having
  a different width than that of size_t, we will have an incorrect
  assignment somewhere that will require an assert/guard.  So the most
  sensible option here seems to do hast_T to be size_t too.

- hashtab_T.ht_mask: long_u -> hash_T.

  Masks are used to be combined with hash_T values, so they should be of
  the same type.

hashtab.c:
- hash_may_resize(): oldsize: long_u -> size_t.
- hash_may_resize(): newsize: long_u -> size_t.
- hash_may_resize(): newmask: long_u -> hash_T.
2014-05-24 01:17:47 +02:00
Eliseo Martínez
0c68623aca Remove long_u: hashtab: Enable -Wconversion.
- Add hashtab.c to converted files list.
- Fix conversion issues:
    * hash_lookup()     : idx      : unsigned -> hash_T.
    * hash_may_resize() : minitems : int      -> size_t.
    * hash_may_resize() : newi     : unsigned -> hash_T.
    * hash_may_resize() : minsize  : long_u   -> size_t.
2014-05-24 01:17:46 +02:00
Eliseo Martínez
4d97ae66f9 Remove long_u: hashtab: Cleanup: Others.
hashtab.h:
- Add missing includes.
- Move hash_T to the top and use it to define hashtab_T.
- Move hash_removed related definitions to the top, as they are used in
  the definition of hashtab_T.
- Reformat multiline expression (start continuation with operator).
- Reformat function declaration into one single line.

hashtab.c:
- Use C99 style variable declarations (move declarations as near to
  first-usage point as possible).
- Simplify oldarray/newarray computation.
- Simplify unneeded else branch.
- Remove redundant casts.
2014-05-24 01:17:45 +02:00
Eliseo Martínez
98255c7a78 Remove long_u: hashtab: Cleanup: Comments.
- Restyle comments (/// when appropiate, // otherwise).
- Improve comments (add new comments, augment/clarify existing ones).
2014-05-24 01:17:43 +02:00
Eliseo Martínez
95c3300ca6 Remove long_u: do_outofmem_msg().
Remove long_u occurrences due to do_outofmem_msg() function.
Refactor size parameter from long_u into size_t.
2014-05-24 01:17:42 +02:00
Thiago de Arruda
9e95c8aa33 Merge branch 'use-uids-for-api-remote-objects' 2014-05-23 18:10:52 -03:00
Thiago de Arruda
6c96e42e2c API: Test: Setup basic test infrastructure
- Add a 'expect' utility script that can run simple API tests using clients
  developed for any platform.
- Extend travis build matrix to run API tests using the python client and
  valgrind.

This script can be used to write API tests without having to manage nvim's
lifetime:

- It starts a single nvim instance listening on a known socket
- Invokes the test runner, which should connect to NEOVIM_LISTEN_ADDRESS
- The nvim instance started by the script provides a `BeforeEachTest` function,
  which should be called before each test to reset nvim to a clean state.
- It takes care of shutting down nvim once the tests are finished.

As explained
[here](https://github.com/neovim/neovim/pull/737#issuecomment-43941520), it's
not possible to fully reset nvim to it's initial state, but the `BeforeEachTest`
function should be enough for most test cases. Tests requiring a fully clean
nvim instance should take care of starting/stopping nvim.
2014-05-23 16:06:59 -03:00
Thiago de Arruda
f03a7672e1 API: Refactor: Fix buffer_get_mark 2014-05-23 16:06:59 -03:00
Thiago de Arruda
9815688fbd API: Refactor: Use macro for initializing all arrays 2014-05-23 16:06:59 -03:00