From f82473f748a2add0999b45190fe2f51c8c4e3c34 Mon Sep 17 00:00:00 2001
From: Roman Tsisyk <roman@tsisyk.com>
Date: Mon, 15 Sep 2014 16:29:24 +0400
Subject: [PATCH] Fix #493: Segmentation fault with isnil

---
 src/lua/uuid.lua       | 12 ++++++++++++
 test/box/uuid.result   | 23 ++++++++++++++++++++++-
 test/box/uuid.test.lua | 10 ++++++++++
 3 files changed, 44 insertions(+), 1 deletion(-)

diff --git a/src/lua/uuid.lua b/src/lua/uuid.lua
index cc91363c02..956ad6e36e 100644
--- a/src/lua/uuid.lua
+++ b/src/lua/uuid.lua
@@ -36,6 +36,9 @@ local UUID_LEN = ffi.sizeof(uuid_t)
 local uuidbuf = ffi.new(uuid_t)
 
 local uuid_tostring = function(uu)
+    if not ffi.istype(uuid_t, uu) then
+        return error('Usage: uuid:str()')
+    end
     return ffi.string(builtin.tt_uuid_str(uu), UUID_STR_LEN)
 end
 
@@ -62,6 +65,9 @@ local need_bswap = function(order)
 end
 
 local uuid_tobin = function(uu, byteorder)
+    if not ffi.istype(uuid_t, uu) then
+        return error('Usage: uuid:bin([byteorder])')
+    end
     if need_bswap(byteorder) then
         if uu ~= uuidbuf then
             ffi.copy(uuidbuf, uu, UUID_LEN)
@@ -85,6 +91,9 @@ local uuid_frombin = function(bin, byteorder)
 end
 
 local uuid_isnil = function(uu)
+    if not ffi.istype(uuid_t, uu) then
+        return error('Usage: uuid:isnil()')
+    end
     return builtin.tt_uuid_is_nil(uu)
 end
 
@@ -92,6 +101,9 @@ local uuid_eq = function(lhs, rhs)
     if not ffi.istype(uuid_t, rhs) then
         return false
     end
+    if not ffi.istype(uuid_t, lhs) then
+        return error('Usage: uuid == var')
+    end
     return builtin.tt_uuid_is_equal(lhs, rhs)
 end
 
diff --git a/test/box/uuid.result b/test/box/uuid.result
index eb5fba13da..0713614c68 100644
--- a/test/box/uuid.result
+++ b/test/box/uuid.result
@@ -106,7 +106,7 @@ uu.node[5]
 -- invalid values
 uuid.fromstr(nil)
 ---
-- error: 'builtin/uuid.lua:44: fromstr(str)'
+- error: 'builtin/uuid.lua:47: fromstr(str)'
 ...
 uuid.fromstr('')
 ---
@@ -244,6 +244,27 @@ uu == "blablabla"
 ---
 - false
 ...
+--
+-- invalid usage
+--
+uu = uuid.new()
+---
+...
+uu.isnil()
+---
+- error: 'Usage: uuid:isnil()'
+...
+uu.bin()
+---
+- error: 'Usage: uuid:bin([byteorder])'
+...
+uu.str()
+---
+- error: 'Usage: uuid:str()'
+...
+uu = nil
+---
+...
 uuid = nil
 ---
 ...
diff --git a/test/box/uuid.test.lua b/test/box/uuid.test.lua
index c1c0a8bd95..ecb0cc3feb 100644
--- a/test/box/uuid.test.lua
+++ b/test/box/uuid.test.lua
@@ -85,4 +85,14 @@ uu == nil
 uu == 12345
 uu == "blablabla"
 
+--
+-- invalid usage
+--
+
+uu = uuid.new()
+uu.isnil()
+uu.bin()
+uu.str()
+
+uu = nil
 uuid = nil
-- 
GitLab