Tarantool development patches archive
 help / color / mirror / Atom feed
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

  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