diff --git a/cmake/BuildLibYAML.cmake b/cmake/BuildLibYAML.cmake index 01eb6116d74420ef98463cf494eb362fbb6a9e33..bca7910d7a29ac95ff7dea2b44219ec0ccac80b7 100644 --- a/cmake/BuildLibYAML.cmake +++ b/cmake/BuildLibYAML.cmake @@ -13,7 +13,7 @@ macro(libyaml_build) ${PROJECT_SOURCE_DIR}/third_party/lua-yaml/b64.c) set_source_files_properties(${yaml_src} PROPERTIES COMPILE_FLAGS - "-std=c99") + "-std=c99 -I\"${PROJECT_SOURCE_DIR}/third_party/lua-yaml\"") set_source_files_properties( ${PROJECT_SOURCE_DIR}/third_party/lua-yaml/lyaml.cc PROPERTIES COMPILE_FLAGS diff --git a/src/lua/box_net_box.lua b/src/lua/box_net_box.lua index 31adf5785d1554d29c043a1c705cd1bf9f52bc89..cef696ed4d8424f9cf912c1128b2bc463196cc2e 100644 --- a/src/lua/box_net_box.lua +++ b/src/lua/box_net_box.lua @@ -517,11 +517,12 @@ local remote_methods = { end local len, off = msgpack.decode(self.rbuf) - - if len < #self.rbuf - off then - return + -- wait for correct package length + if len + off - 1 > #self.rbuf then + break end + local hdr, body hdr, off = msgpack.decode(self.rbuf, off) if off < #self.rbuf then diff --git a/src/lua/bsdsocket.lua b/src/lua/bsdsocket.lua index a86e14bad85a8886f621bcc967249b3c4db25dbd..871bdbd356a6fdf65f1d67199b3681c9b0a3dffc 100644 --- a/src/lua/bsdsocket.lua +++ b/src/lua/bsdsocket.lua @@ -205,6 +205,7 @@ socket_methods.nonblock = function(self, nb) end end +local waiters_mt = { __serialize = 'mapping' } local function wait_safely(self, what, timeout) local fd = check_socket(self) local f = fiber.self() @@ -214,7 +215,7 @@ local function wait_safely(self, what, timeout) timeout = timeout or TIMEOUT_INFINITY if self.waiters == nil then - self.waiters = {} + self.waiters = setmetatable({}, waiters_mt) end self.waiters[fid] = true @@ -1072,6 +1073,11 @@ socket_mt = { end self._errno = save_errno return name + end, + __serialize = function(self) + -- Allow YAML, MsgPack and JSON to dump objects with sockets + local fd = check_socket(self) + return { fd = fd, peer = self:peer(), name = self:name() } end } diff --git a/test/app/yaml.test.lua b/test/app/yaml.test.lua index 54ef89d6a92f2ba46da0e5d7fabe9ddff040fe9d..d339a41f68d46198b341d13662f3850318fb4168 100755 --- a/test/app/yaml.test.lua +++ b/test/app/yaml.test.lua @@ -6,11 +6,11 @@ local tap = require('tap') local common = require('serializer_test') local function is_map(s) - return s:match("---\n%w+%:") or s:match("---\n{%w+%:") + return s:match("---[\n ]%w+%:") or s:match("---[\n ]{%w+%:") end local function is_array(s) - return s:match("---\n%[") or s:match("---\n- "); + return s:match("---[\n ]%[") or s:match("---[\n ]- "); end local function test_compact(test, s) @@ -25,16 +25,16 @@ local function test_compact(test, s) "---\n- 10\n- 15\n- 20\n...\n", "block array") test:is(ss.encode(setmetatable({10, 15, 20}, { __serialize="sequence"})), "---\n- 10\n- 15\n- 20\n...\n", "block array") - test:is(ss.encode(setmetatable({10, 15, 20}, { __serialize="seq"})), - "---\n[10, 15, 20]\n...\n", "flow array") + test:is(ss.encode({setmetatable({10, 15, 20}, { __serialize="seq"})}), + "---\n- [10, 15, 20]\n...\n", "flow array") test:is(getmetatable(ss.decode(ss.encode({10, 15, 20}))).__serialize, "seq", "decoded __serialize is seq") test:is(ss.encode({k = 'v'}), "---\nk: v\n...\n", "block map") test:is(ss.encode(setmetatable({k = 'v'}, { __serialize="mapping"})), "---\nk: v\n...\n", "block map") - test:is(ss.encode(setmetatable({k = 'v'}, { __serialize="map"})), - "---\n{k: v}\n...\n", "flow map") + test:is(ss.encode({setmetatable({k = 'v'}, { __serialize="map"})}), + "---\n- {k: v}\n...\n", "flow map") test:is(getmetatable(ss.decode(ss.encode({k = 'v'}))).__serialize, "map", "decoded __serialize is map") @@ -43,11 +43,11 @@ end local function test_output(test, s) test:plan(6) - test:is(s.encode(true), '---\ntrue\n...\n', "encode for true") + test:is(s.encode({true}), '---\n- true\n...\n', "encode for true") test:is(s.decode("---\nyes\n..."), true, "decode for 'yes'") - test:is(s.encode(false), '---\nfalse\n...\n', "encode for false") + test:is(s.encode({false}), '---\n- false\n...\n', "encode for false") test:is(s.decode("---\nno\n..."), false, "decode for 'no'") - test:is(s.encode(nil), '---\nnull\n...\n', "encode for nil") + test:is(s.encode({s.NULL}), '---\n- null\n...\n', "encode for nil") test:is(s.decode("---\n~\n..."), s.NULL, "decode for ~") end diff --git a/test/box/box.net.box.result b/test/box/box.net.box.result index c3bfff51de0265b9d0c63c8044b6a4938ae6a666..f3e7a5da7c3f5043ed9d8cb67621005ec39ee638 100644 --- a/test/box/box.net.box.result +++ b/test/box/box.net.box.result @@ -382,6 +382,35 @@ cn:call('test_foo', 'a', 'b', 'c') - [{'b': 2}] - ['c'] ... +-- long replies +function long_rep() return { 1, string.rep('a', 5000) } end +--- +... +res = cn:call('long_rep') +--- +... +res[1][1] == 1 +--- +- true +... +res[1][2] == string.rep('a', 5000) +--- +- true +... +function long_rep() return { 1, string.rep('a', 50000) } end +--- +... +res = cn:call('long_rep') +--- +... +res[1][1] == 1 +--- +- true +... +res[1][2] == string.rep('a', 50000) +--- +- true +... -- auth cn.proto.b64decode('gJLocxbO32VmfO8x04xRVxKfgwzmNVM2t6a1ME8XsD0=') --- diff --git a/test/box/box.net.box.test.lua b/test/box/box.net.box.test.lua index 2df3b8f6aae33da5b6f488636ec6b1c69d2aa73c..647a62c6bc2bdac682ab6e6e872d167628e41f45 100644 --- a/test/box/box.net.box.test.lua +++ b/test/box/box.net.box.test.lua @@ -136,11 +136,21 @@ cn:call('test_foo', 'a', 'b', 'c') remote.self:call('test_foo', 'a', 'b', 'c') cn:call('test_foo', 'a', 'b', 'c') +-- long replies +function long_rep() return { 1, string.rep('a', 5000) } end +res = cn:call('long_rep') +res[1][1] == 1 +res[1][2] == string.rep('a', 5000) + +function long_rep() return { 1, string.rep('a', 50000) } end +res = cn:call('long_rep') +res[1][1] == 1 +res[1][2] == string.rep('a', 50000) + -- auth cn.proto.b64decode('gJLocxbO32VmfO8x04xRVxKfgwzmNVM2t6a1ME8XsD0=') cn.proto.b64decode('gJLoc!!!!!!!') - cn = remote:new('127.0.0.1', port, { user = 'netbox', password = '123', wait_connected = true }) cn:is_connected() cn.error @@ -172,6 +182,8 @@ remote.self:ping() remote.self.space.net_box_test_space:select{234} remote.self:timeout(123).space.net_box_test_space:select{234} + + -- cleanup database after tests space:drop() diff --git a/test/box/bsdsocket.result b/test/box/bsdsocket.result index c803cb769e4a245c8ed807e44cab187dd78a1f45..ccc0973dea38030d9b48b65242cb2c55859ef2ea 100644 --- a/test/box/bsdsocket.result +++ b/test/box/bsdsocket.result @@ -1,6 +1,9 @@ json = require 'json' --- ... +yaml = require 'yaml' +--- +... pickle = require 'pickle' --- ... @@ -265,7 +268,7 @@ s:getsockopt('SOL_SOCKET', 'SO_DEBUG') ... s:setsockopt('SOL_SOCKET', 'SO_ACCEPTCONN', 1) --- -- error: 'builtin/socket.lua:340: Socket option SO_ACCEPTCONN is read only' +- error: 'builtin/socket.lua:341: Socket option SO_ACCEPTCONN is read only' ... s:getsockopt('SOL_SOCKET', 'SO_RCVBUF') > 32 --- @@ -1312,3 +1315,27 @@ os.remove(path) --- - true ... +-- Test serializers with sockets +s = socket('AF_UNIX', 'SOCK_STREAM', 'ip') +--- +... +x = s:wait() +--- +... +-- waiters is map +s.waiters +--- +- {} +... +-- check __serialize hook +json.decode(json.encode(s)).fd == s:fd() +--- +- true +... +yaml.decode(yaml.encode(s)).fd == s:fd() +--- +- true +... +s = nil +--- +... diff --git a/test/box/bsdsocket.test.lua b/test/box/bsdsocket.test.lua index 23d527bfbcc2ed26e29c98f58fb4a62bda60ce6c..7ead95599262bb1498d51354ba5cd88928b7ed1b 100644 --- a/test/box/bsdsocket.test.lua +++ b/test/box/bsdsocket.test.lua @@ -1,4 +1,5 @@ json = require 'json' +yaml = require 'yaml' pickle = require 'pickle' socket = require 'socket' fiber = require 'fiber' @@ -445,3 +446,13 @@ collectgarbage('collect') collectgarbage('collect') socket.tcp_connect('unix/', path), errno() == errno.ECONNREFUSED os.remove(path) + +-- Test serializers with sockets +s = socket('AF_UNIX', 'SOCK_STREAM', 'ip') +x = s:wait() +-- waiters is map +s.waiters +-- check __serialize hook +json.decode(json.encode(s)).fd == s:fd() +yaml.decode(yaml.encode(s)).fd == s:fd() +s = nil diff --git a/test/box/snap_daemon.result b/test/box/snap_daemon.result index 164ef5994ff2b5cfd7c4484584aeed08f48d24c9..e411a87accc3ec5ed842a16873eb06664735ddf5 100644 --- a/test/box/snap_daemon.result +++ b/test/box/snap_daemon.result @@ -76,15 +76,19 @@ for i = 1, box.cfg.rows_per_wal + 10 do space:insert { no } no = no + 1 end --- ... -- wait for last snapshot -fiber.sleep(2.5 * PERIOD) ---- -... -snaps = fio.glob(fio.pathjoin(box.cfg.snap_dir, '*.snap')) ---- -... -xlogs = fio.glob(fio.pathjoin(box.cfg.wal_dir, '*.xlog')) +--# setopt delimiter ';' +for i = 1, 100 do + fiber.sleep(PERIOD) + snaps = fio.glob(fio.pathjoin(box.cfg.snap_dir, '*.snap')) + xlogs = fio.glob(fio.pathjoin(box.cfg.wal_dir, '*.xlog')) + + if #snaps == 2 then + break + end +end; --- ... +--# setopt delimiter '' #snaps == 2 or snaps --- - true diff --git a/test/box/snap_daemon.test.lua b/test/box/snap_daemon.test.lua index 82eb4385640416b351de2673113962dfc5060bfc..bdfcc649274af25bdb9f564dfe1e17d884d62f4a 100644 --- a/test/box/snap_daemon.test.lua +++ b/test/box/snap_daemon.test.lua @@ -43,10 +43,22 @@ for i = 1, box.cfg.rows_per_wal + 10 do space:insert { no } no = no + 1 end for i = 1, box.cfg.rows_per_wal + 10 do space:insert { no } no = no + 1 end -- wait for last snapshot -fiber.sleep(2.5 * PERIOD) -snaps = fio.glob(fio.pathjoin(box.cfg.snap_dir, '*.snap')) -xlogs = fio.glob(fio.pathjoin(box.cfg.wal_dir, '*.xlog')) +--# setopt delimiter ';' + +for i = 1, 100 do + fiber.sleep(PERIOD) + snaps = fio.glob(fio.pathjoin(box.cfg.snap_dir, '*.snap')) + xlogs = fio.glob(fio.pathjoin(box.cfg.wal_dir, '*.xlog')) + + if #snaps == 2 then + break + end +end; + +--# setopt delimiter '' + + #snaps == 2 or snaps #xlogs > 0 diff --git a/third_party/lua-yaml/emitter.c b/third_party/lua-yaml/emitter.c index ce257d1847b4fd987990c8aa831fc5fdd95a41c3..c4b56a26bb56e33cd3b2a54eee040211c39cae96 100644 --- a/third_party/lua-yaml/emitter.c +++ b/third_party/lua-yaml/emitter.c @@ -236,10 +236,6 @@ static int yaml_emitter_write_tag_content(yaml_emitter_t *emitter, yaml_char_t *value, size_t length, int need_whitespace); -static int -yaml_emitter_write_verbatim_scalar(yaml_emitter_t *emitter, - yaml_char_t *value, size_t length, int allow_breaks); - static int yaml_emitter_write_plain_scalar(yaml_emitter_t *emitter, yaml_char_t *value, size_t length, int allow_breaks); @@ -640,8 +636,10 @@ yaml_emitter_emit_document_start(yaml_emitter_t *emitter, return 0; if (!yaml_emitter_write_indicator(emitter, "---", 1, 0, 0)) return 0; - if (!yaml_emitter_write_indent(emitter)) - return 0; + if (emitter->canonical) { + if (!yaml_emitter_write_indent(emitter)) + return 0; + } } emitter->state = YAML_EMIT_DOCUMENT_CONTENT_STATE; @@ -1156,7 +1154,7 @@ yaml_emitter_check_simple_key(yaml_emitter_t *emitter) break; case YAML_MAPPING_START_EVENT: - if (!yaml_emitter_check_empty_sequence(emitter)) + if (!yaml_emitter_check_empty_mapping(emitter)) return 0; length += emitter->anchor_data.anchor_length + emitter->tag_data.handle_length @@ -1181,9 +1179,6 @@ static int yaml_emitter_select_scalar_style(yaml_emitter_t *emitter, yaml_event_t *event) { yaml_scalar_style_t style = event->data.scalar.style; - if (style == YAML_VERBATIM_SCALAR_STYLE) - goto done; - int no_tag = (!emitter->tag_data.handle && !emitter->tag_data.suffix); if (no_tag && !event->data.scalar.plain_implicit @@ -1233,8 +1228,8 @@ yaml_emitter_select_scalar_style(yaml_emitter_t *emitter, yaml_event_t *event) emitter->tag_data.handle_length = 1; } -done: emitter->scalar_data.style = style; + return 1; } @@ -1300,11 +1295,6 @@ yaml_emitter_process_scalar(yaml_emitter_t *emitter) { switch (emitter->scalar_data.style) { - case YAML_VERBATIM_SCALAR_STYLE: - return yaml_emitter_write_verbatim_scalar(emitter, - emitter->scalar_data.value, emitter->scalar_data.length, - !emitter->simple_key_context); - case YAML_PLAIN_SCALAR_STYLE: return yaml_emitter_write_plain_scalar(emitter, emitter->scalar_data.value, emitter->scalar_data.length, @@ -1481,20 +1471,6 @@ yaml_emitter_analyze_tag(yaml_emitter_t *emitter, return 1; } -static int -yaml_emitter_analyze_scalar_verbatim(yaml_emitter_t *emitter, - yaml_char_t *value, size_t length) -{ - emitter->scalar_data.value = value; - emitter->scalar_data.length = length; - emitter->scalar_data.multiline = 0; - emitter->scalar_data.flow_plain_allowed = 0; - emitter->scalar_data.block_plain_allowed = 1; - emitter->scalar_data.single_quoted_allowed = 1; - emitter->scalar_data.block_allowed = 0; - return 1; -} - /* * Check if a scalar is valid. */ @@ -1527,12 +1503,6 @@ yaml_emitter_analyze_scalar(yaml_emitter_t *emitter, emitter->scalar_data.value = value; emitter->scalar_data.length = length; - emitter->scalar_data.multiline = 0; - emitter->scalar_data.flow_plain_allowed = 0; - emitter->scalar_data.block_plain_allowed = 1; - emitter->scalar_data.single_quoted_allowed = 1; - emitter->scalar_data.block_allowed = 0; - if (string.start == string.end) { emitter->scalar_data.multiline = 0; @@ -1738,10 +1708,6 @@ yaml_emitter_analyze_event(yaml_emitter_t *emitter, if (!yaml_emitter_analyze_tag(emitter, event->data.scalar.tag)) return 0; } - if (event->data.scalar.style == YAML_VERBATIM_SCALAR_STYLE) { - yaml_emitter_analyze_scalar_verbatim(emitter, - event->data.scalar.value, event->data.scalar.length); - } else if (!yaml_emitter_analyze_scalar(emitter, event->data.scalar.value, event->data.scalar.length)) return 0; @@ -1928,19 +1894,6 @@ yaml_emitter_write_tag_content(yaml_emitter_t *emitter, return 1; } -static int -yaml_emitter_write_verbatim_scalar(yaml_emitter_t *emitter, - yaml_char_t *value, size_t length, int allow_breaks) -{ - (void)allow_breaks; - yaml_string_t string; - STRING_ASSIGN(string, value, length); - while (string.pointer != string.end) { - if (!WRITE(emitter, string)) return 0; - } - return 1; -} - static int yaml_emitter_write_plain_scalar(yaml_emitter_t *emitter, yaml_char_t *value, size_t length, int allow_breaks) diff --git a/third_party/lua-yaml/loader.c b/third_party/lua-yaml/loader.c index 9d3d912663c3282e5c731ebf9e5587a1111ec79b..871149ab91f0cef5329bb5421f1dcb71cfcbf64f 100644 --- a/third_party/lua-yaml/loader.c +++ b/third_party/lua-yaml/loader.c @@ -286,6 +286,8 @@ yaml_parser_load_scalar(yaml_parser_t *parser, yaml_event_t *first_event) int index; yaml_char_t *tag = first_event->data.scalar.tag; + if (!STACK_LIMIT(parser, parser->document->nodes, INT_MAX-1)) goto error; + if (!tag || strcmp((char *)tag, "!") == 0) { yaml_free(tag); tag = yaml_strdup((yaml_char_t *)YAML_DEFAULT_SCALAR_TAG); @@ -329,6 +331,8 @@ yaml_parser_load_sequence(yaml_parser_t *parser, yaml_event_t *first_event) int index, item_index; yaml_char_t *tag = first_event->data.sequence_start.tag; + if (!STACK_LIMIT(parser, parser->document->nodes, INT_MAX-1)) goto error; + if (!tag || strcmp((char *)tag, "!") == 0) { yaml_free(tag); tag = yaml_strdup((yaml_char_t *)YAML_DEFAULT_SEQUENCE_TAG); @@ -351,6 +355,9 @@ yaml_parser_load_sequence(yaml_parser_t *parser, yaml_event_t *first_event) if (!yaml_parser_parse(parser, &event)) return 0; while (event.type != YAML_SEQUENCE_END_EVENT) { + if (!STACK_LIMIT(parser, + parser->document->nodes.start[index-1].data.sequence.items, + INT_MAX-1)) return 0; item_index = yaml_parser_load_node(parser, &event); if (!item_index) return 0; if (!PUSH(parser, @@ -387,6 +394,8 @@ yaml_parser_load_mapping(yaml_parser_t *parser, yaml_event_t *first_event) yaml_node_pair_t pair; yaml_char_t *tag = first_event->data.mapping_start.tag; + if (!STACK_LIMIT(parser, parser->document->nodes, INT_MAX-1)) goto error; + if (!tag || strcmp((char *)tag, "!") == 0) { yaml_free(tag); tag = yaml_strdup((yaml_char_t *)YAML_DEFAULT_MAPPING_TAG); @@ -409,6 +418,9 @@ yaml_parser_load_mapping(yaml_parser_t *parser, yaml_event_t *first_event) if (!yaml_parser_parse(parser, &event)) return 0; while (event.type != YAML_MAPPING_END_EVENT) { + if (!STACK_LIMIT(parser, + parser->document->nodes.start[index-1].data.mapping.pairs, + INT_MAX-1)) return 0; pair.key = yaml_parser_load_node(parser, &event); if (!pair.key) return 0; if (!yaml_parser_parse(parser, &event)) return 0; diff --git a/third_party/lua-yaml/reader.c b/third_party/lua-yaml/reader.c index 829e32da55c0bee1baf572d72b574076a7ca52eb..d47921ce2b216f031d9ec93f54da6628bdc448ec 100644 --- a/third_party/lua-yaml/reader.c +++ b/third_party/lua-yaml/reader.c @@ -460,6 +460,10 @@ yaml_parser_update_buffer(yaml_parser_t *parser, size_t length) } + if (parser->offset >= PTRDIFF_MAX) + return yaml_parser_set_reader_error(parser, "input is too long", + PTRDIFF_MAX, -1); + return 1; } diff --git a/third_party/lua-yaml/scanner.c b/third_party/lua-yaml/scanner.c index 86e2050165a0f2da6e4e2342cc6d630a7f614b8d..88d4fa5df24cb68f752135978f5f17e7e68810a1 100644 --- a/third_party/lua-yaml/scanner.c +++ b/third_party/lua-yaml/scanner.c @@ -615,11 +615,11 @@ yaml_parser_decrease_flow_level(yaml_parser_t *parser); */ static int -yaml_parser_roll_indent(yaml_parser_t *parser, int column, - int number, yaml_token_type_t type, yaml_mark_t mark); +yaml_parser_roll_indent(yaml_parser_t *parser, ptrdiff_t column, + ptrdiff_t number, yaml_token_type_t type, yaml_mark_t mark); static int -yaml_parser_unroll_indent(yaml_parser_t *parser, int column); +yaml_parser_unroll_indent(yaml_parser_t *parser, ptrdiff_t column); /* * Token fetchers. @@ -1103,7 +1103,7 @@ yaml_parser_save_simple_key(yaml_parser_t *parser) */ int required = (!parser->flow_level - && parser->indent == (int)parser->mark.column); + && parser->indent == (ptrdiff_t)parser->mark.column); /* * A simple key is required only when it is the first token in the current @@ -1122,7 +1122,7 @@ yaml_parser_save_simple_key(yaml_parser_t *parser) simple_key.possible = 1; simple_key.required = required; simple_key.token_number = - parser->tokens_parsed + parser->tokens.tail - parser->tokens.head; + parser->tokens_parsed + (parser->tokens.tail - parser->tokens.head); simple_key.mark = parser->mark; if (!yaml_parser_remove_simple_key(parser)) return 0; @@ -1176,6 +1176,11 @@ yaml_parser_increase_flow_level(yaml_parser_t *parser) /* Increase the flow level. */ + if (parser->flow_level == INT_MAX) { + parser->error = YAML_MEMORY_ERROR; + return 0; + } + parser->flow_level++; return 1; @@ -1206,8 +1211,8 @@ yaml_parser_decrease_flow_level(yaml_parser_t *parser) */ static int -yaml_parser_roll_indent(yaml_parser_t *parser, int column, - int number, yaml_token_type_t type, yaml_mark_t mark) +yaml_parser_roll_indent(yaml_parser_t *parser, ptrdiff_t column, + ptrdiff_t number, yaml_token_type_t type, yaml_mark_t mark) { yaml_token_t token; @@ -1226,6 +1231,11 @@ yaml_parser_roll_indent(yaml_parser_t *parser, int column, if (!PUSH(parser, parser->indents, parser->indent)) return 0; + if (column > INT_MAX) { + parser->error = YAML_MEMORY_ERROR; + return 0; + } + parser->indent = column; /* Create a token and insert it into the queue. */ @@ -1254,7 +1264,7 @@ yaml_parser_roll_indent(yaml_parser_t *parser, int column, static int -yaml_parser_unroll_indent(yaml_parser_t *parser, int column) +yaml_parser_unroll_indent(yaml_parser_t *parser, ptrdiff_t column) { yaml_token_t token; @@ -2574,7 +2584,7 @@ yaml_parser_scan_tag_uri(yaml_parser_t *parser, int directive, /* Resize the string to include the head. */ - while (string.end - string.start <= (int)length) { + while ((size_t)(string.end - string.start) <= length) { if (!yaml_string_extend(&string.start, &string.pointer, &string.end)) { parser->error = YAML_MEMORY_ERROR; goto error; @@ -2619,6 +2629,9 @@ yaml_parser_scan_tag_uri(yaml_parser_t *parser, int directive, /* Check if it is a URI-escape sequence. */ if (CHECK(parser->buffer, '%')) { + if (!STRING_EXTEND(parser, string)) + goto error; + if (!yaml_parser_scan_uri_escapes(parser, directive, start_mark, &string)) goto error; } diff --git a/third_party/lua-yaml/yaml_private.h b/third_party/lua-yaml/yaml_private.h index 08bca967bd2ed218cf69b9cd1dea2950fd3cb191..f4e790423ec03b4c23118907448ebbc16c29dfcd 100644 --- a/third_party/lua-yaml/yaml_private.h +++ b/third_party/lua-yaml/yaml_private.h @@ -1,13 +1,27 @@ - #define YAML_VERSION_MAJOR 0 #define YAML_VERSION_MINOR 1 -#define YAML_VERSION_PATCH 3 -#define YAML_VERSION_STRING "0.1.3" +#define YAML_VERSION_PATCH 6 +#define YAML_VERSION_STRING "0.1.6" + +#if HAVE_CONFIG_H +#include <config.h> +#endif -#include "yaml.h" +#include <yaml.h> #include <assert.h> #include <limits.h> +#include <stddef.h> + +#ifndef _MSC_VER +#include <stdint.h> +#else +#ifdef _WIN64 +#define PTRDIFF_MAX _I64_MAX +#else +#define PTRDIFF_MAX INT_MAX +#endif +#endif /* * Memory management. @@ -133,9 +147,12 @@ yaml_string_join( (string).start = (string).pointer = (string).end = 0) #define STRING_EXTEND(context,string) \ - (((string).pointer+5 < (string).end) \ + ((((string).pointer+5 < (string).end) \ || yaml_string_extend(&(string).start, \ - &(string).pointer, &(string).end)) + &(string).pointer, &(string).end)) ? \ + 1 : \ + ((context)->error = YAML_MEMORY_ERROR, \ + 0)) #define CLEAR(context,string) \ ((string).pointer = (string).start, \ @@ -229,9 +246,9 @@ yaml_string_join( (string).pointer[offset] <= (yaml_char_t) 'f') ? \ ((string).pointer[offset] - (yaml_char_t) 'a' + 10) : \ ((string).pointer[offset] - (yaml_char_t) '0')) - + #define AS_HEX(string) AS_HEX_AT((string),0) - + /* * Check if the character is ASCII. */ @@ -422,6 +439,12 @@ yaml_queue_extend(void **start, void **head, void **tail, void **end); #define STACK_EMPTY(context,stack) \ ((stack).start == (stack).top) +#define STACK_LIMIT(context,stack,size) \ + ((stack).top - (stack).start < (size) ? \ + 1 : \ + ((context)->error = YAML_MEMORY_ERROR, \ + 0)) + #define PUSH(context,stack,value) \ (((stack).top != (stack).end \ || yaml_stack_extend((void **)&(stack).start, \