From 58eb5f39d4e57fd9c7409efade54b5792dfefab3 Mon Sep 17 00:00:00 2001
From: Tim <t4im@users.noreply.github.com>
Date: Thu, 7 Jul 2016 23:58:52 +0200
Subject: [PATCH] Builtin: Fix check for a player object in
 core.check_player_privs

core.check_player_privs accepts as first argument a name or player object, but just tested for a string.
This caused crashes inside builtin, when being passed any unexpected types.

This provides a better (duck-typing like) test, better error reporting.
---
 builtin/game/misc.lua | 10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)

diff --git a/builtin/game/misc.lua b/builtin/game/misc.lua
index 918315656..4773e0012 100644
--- a/builtin/game/misc.lua
+++ b/builtin/game/misc.lua
@@ -48,11 +48,13 @@ function core.after(after, func, ...)
 	}
 end
 
-function core.check_player_privs(player_or_name, ...)
-	local name = player_or_name
-	-- Check if we have been provided with a Player object.
-	if type(name) ~= "string" then
+function core.check_player_privs(name, ...)
+	local arg_type = type(name)
+	if (arg_type == "userdata" or arg_type == "table") and
+			name.get_player_name then -- If it quacks like a Player...
 		name = name:get_player_name()
+	elseif arg_type ~= "string" then
+		error("Invalid core.check_player_privs argument type: " .. arg_type, 2)
 	end
 	
 	local requested_privs = {...}