fix(lib): preserve file mode/ownership across ini_set's atomic write
mktemp defaults to 0600 root:root. The tmpfile+mv swap in ini_set was carrying that over onto the replaced config, silently locking out whatever service account owned the original file (e.g. gitea:www-data on Gitea's app.ini — the service failed to start with a permission denied on its own config after the very first ini_set call). Restore the original file's mode and ownership on the tmpfile before the mv. Verified on both BusyBox (Alpine) and GNU coreutils (Debian) stat -c. Refs #18
This commit is contained in:
@@ -151,6 +151,14 @@ ini_set() {
|
||||
|
||||
tmp=$(mktemp "${file}.tmp.XXXXXX")
|
||||
|
||||
# mktemp defaults to 0600 root:root, which would silently lock the
|
||||
# service account that owns $file (e.g. gitea:www-data on Gitea's
|
||||
# app.ini) out of the config this function just wrote. Carry the
|
||||
# original file's mode/ownership onto the replacement before it lands.
|
||||
# `stat -c` works identically on GNU coreutils and BusyBox.
|
||||
chmod "$(stat -c '%a' "$file")" "$tmp" 2>/dev/null || true
|
||||
chown "$(stat -c '%u:%g' "$file")" "$tmp" 2>/dev/null || true
|
||||
|
||||
awk -v section="$section" -v key="$key" -v value="$value" '
|
||||
/^\[.*\]$/ {
|
||||
if (in_section && !done) {
|
||||
|
||||
Reference in New Issue
Block a user