From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from localhost (localhost [127.0.0.1]) by turing.freelists.org (Avenir Technologies Mail Multiplex) with ESMTP id 31558270FB for ; Fri, 23 Aug 2019 16:23:04 -0400 (EDT) Received: from turing.freelists.org ([127.0.0.1]) by localhost (turing.freelists.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id yG8CwSPjh9k6 for ; Fri, 23 Aug 2019 16:23:04 -0400 (EDT) Received: from smtp61.i.mail.ru (smtp61.i.mail.ru [217.69.128.41]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by turing.freelists.org (Avenir Technologies Mail Multiplex) with ESMTPS id 7F6F625D90 for ; Fri, 23 Aug 2019 16:23:03 -0400 (EDT) Subject: [tarantool-patches] Re: [PATCH] lua: pwd: fix passwd and group traversal References: <5545c38a61fe1867743a75b6bb4767b8e87c629e.1566524401.git.alexander.turenko@tarantool.org> From: Vladislav Shpilevoy Message-ID: <017216c6-6d77-6298-b71a-a9b131fa360a@tarantool.org> Date: Fri, 23 Aug 2019 22:26:05 +0200 MIME-Version: 1.0 In-Reply-To: <5545c38a61fe1867743a75b6bb4767b8e87c629e.1566524401.git.alexander.turenko@tarantool.org> Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 7bit Sender: tarantool-patches-bounce@freelists.org Errors-to: tarantool-patches-bounce@freelists.org Reply-To: tarantool-patches@freelists.org List-Help: List-Unsubscribe: List-software: Ecartis version 1.0.0 List-Id: tarantool-patches List-Subscribe: List-Owner: List-post: List-Archive: To: Alexander Turenko Cc: tarantool-patches@freelists.org Hi! Thanks for the patch! > The primary reason of this commit is to overcome a startup hang on > CentOS 6. > > https://github.com/tarantool/tarantool/issues/4428 > https://github.com/tarantool/tarantool/issues/4447 > https://github.com/tarantool/tarantool/issues/4271 > https://github.com/tarantool/tarantool/tree/Totktonada/gh-4447-fix-centos-6-startup-fail-full-ci > > Waiting for CI: > https://gitlab.com/tarantool/tarantool/pipelines/77906160 > > I manually verified that tarantool starts on CentOS 6 after the change. > Also verified that the module can be used now on FreeBSD 12.0. > > I understood that the commit formally changes a behaviour that can be > visible for a user: it allows to pass cdata to > pwd.getgr() and to pass cdata to pwd.getgr(). It is > unlikely that one will want to use it or will find this ability by an > occasion. Maybe only with pwd.getpw(1LL) or so, but luajit will report > an error in the case. My intention was to keep the commit short and > avoid refactoring of the module code. But this module is not a rocket science, even its whole rewrite would not be hard. Here the refactoring is quite simple, please, consider my proposal on the branch and below. You can squash it or keep - anyway LGTM. Note, I didn't test my 'fixes', so perhaps they are totally wrong. ========================================================================= diff --git a/src/lua/pwd.lua b/src/lua/pwd.lua index ab0229a72..7a585a3f2 100644 --- a/src/lua/pwd.lua +++ b/src/lua/pwd.lua @@ -108,17 +108,7 @@ end local pwgr_errstr = "get%s failed [errno %d]: %s" -local function getgr(gid) - if gid == nil then - gid = tonumber(ffi.C.getgid()) - end - local gr = type(gid) == 'cdata' and gid or _getgr(gid) - if gr == nil then - if errno() ~= 0 then - error(pwgr_errstr:format('gr', errno(), errno.strerror())) - end - return nil - end +local function grtotable(gr) local gr_mem, group_members = gr.gr_mem, {} local i = 0 while true do @@ -137,25 +127,42 @@ local function getgr(gid) return group end -local function getpw(uid) - if uid == nil then - uid = tonumber(ffi.C.getuid()) +local function getgr(gid) + if gid == nil then + gid = tonumber(ffi.C.getgid()) end - local pw = type(uid) == 'cdata' and uid or _getpw(uid) - if pw == nil then + local gr = _getgr(gid) + if gr == nil then if errno() ~= 0 then - error(pwgr_errstr:format('pw', errno(), errno.strerror())) + error(pwgr_errstr:format('gr', errno(), errno.strerror())) end return nil end - local user = { + return grtotable(gr) +end + +local function pwtotable(pw) + return { name = ffi.string(pw.pw_name), id = tonumber(pw.pw_uid), group = getgr(pw.pw_gid), workdir = ffi.string(pw.pw_dir), shell = ffi.string(pw.pw_shell), } - return user +end + +local function getpw(uid) + if uid == nil then + uid = tonumber(ffi.C.getuid()) + end + local pw = _getpw(uid) + if pw == nil then + if errno() ~= 0 then + error(pwgr_errstr:format('pw', errno(), errno.strerror())) + end + return nil + end + return pwtotable(pw) end local function getpwall() @@ -170,7 +177,7 @@ local function getpwall() end break end - table.insert(pws, getpw(pw)) + table.insert(pws, pwtotable(pw)) end ffi.C.endpwent() return pws @@ -188,7 +195,7 @@ local function getgrall() end break end - table.insert(grs, getgr(gr)) + table.insert(grs, grtotable(gr)) end ffi.C.endgrent() return grs