From: Vladislav Shpilevoy <v.shpilevoy@tarantool.org>
To: Alexander Turenko <alexander.turenko@tarantool.org>
Cc: tarantool-patches@freelists.org
Subject: [tarantool-patches] Re: [PATCH] lua: pwd: fix passwd and group traversal
Date: Fri, 23 Aug 2019 22:26:05 +0200 [thread overview]
Message-ID: <017216c6-6d77-6298-b71a-a9b131fa360a@tarantool.org> (raw)
In-Reply-To: <5545c38a61fe1867743a75b6bb4767b8e87c629e.1566524401.git.alexander.turenko@tarantool.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<struct passwd> to
> pwd.getgr() and to pass cdata<struct group> 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
next prev parent reply other threads:[~2019-08-23 20:23 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-08-23 1:57 [tarantool-patches] " Alexander Turenko
2019-08-23 20:26 ` Vladislav Shpilevoy [this message]
2019-08-25 11:07 ` [tarantool-patches] " Alexander Turenko
2019-08-25 18:03 ` Vladislav Shpilevoy
2019-08-26 9:43 ` Alexander Turenko
2019-08-26 15:08 ` Kirill Yukhin
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=017216c6-6d77-6298-b71a-a9b131fa360a@tarantool.org \
--to=v.shpilevoy@tarantool.org \
--cc=alexander.turenko@tarantool.org \
--cc=tarantool-patches@freelists.org \
--subject='[tarantool-patches] Re: [PATCH] lua: pwd: fix passwd and group traversal' \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox