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,                             \