diff --git a/package/info b/package/info index a6f2e47..cb6f46c 100644 --- a/package/info +++ b/package/info @@ -1,4 +1,4 @@ package=s6-overlay-preinit -version=1.0.3 +version=1.0.4 category=admin package_macro_name=S6_OVERLAY_PREINIT diff --git a/src/s6-overlay-preinit/s6-overlay-preinit.c b/src/s6-overlay-preinit/s6-overlay-preinit.c index 430073f..48212db 100644 --- a/src/s6-overlay-preinit/s6-overlay-preinit.c +++ b/src/s6-overlay-preinit/s6-overlay-preinit.c @@ -43,21 +43,27 @@ int main (void) } } - /* requirement: /var/run/s6 must be owned by current user */ + /* requirement: /var/run/s6 must be owned by current user, + * if (and only if) current user != root */ + uid_t uid = getuid() , + gid = getgid() , + euid = geteuid() ; + struct stat s6stat ; if(stat(VAR_RUN_S6, &s6stat) == -1) { strerr_diefu2sys(111, "stat ", VAR_RUN_S6) ; } - uid_t uid = getuid() , - gid = getgid() ; /* only call chown if uid/gid are not from current user */ if(s6stat.st_uid != uid || s6stat.st_gid != gid) { - if (chown(VAR_RUN_S6, uid, gid) == -1) + if (euid == 0) /* chown will fail if we're not root */ { - strerr_diefu2sys(111, "chown ", VAR_RUN_S6) ; + if (chown(VAR_RUN_S6, uid, gid) == -1) + { + strerr_diefu2sys(111, "chown ", VAR_RUN_S6) ; + } } }