Re: Earlier /tmp cleanup in /etc/rc
Andrew Hewus Fresh <[email protected]>
| Newsgroups | gmane.os.openbsd.tech |
|---|---|
| Message-ID | <[email protected]> |
As noticed by landry@ and deraadt@, the previous incantation of find
searching by depth left the paths in $skip, but attempted to remove up
to 50 files from them which it isn't supposed to.
So, instead, we need another round of indirection using xargs to only
use depth into the directories we actually want to remove. We also
-print only if the rm succeeds (although with -f, I think it always
"succeeds") and hide STDERR from the `find ... rm`.
While here, we also stop trying to remove any top-level entries with the
sticky bit.
Index: rc
===================================================================
RCS file: /cvs/src/etc/rc,v
diff -u -p -r1.590 rc
--- rc 17 Aug 2026 22:41:38 -0000 1.590
+++ rc 26 Aug 2026 16:04:34 -0000
@@ -502,6 +502,23 @@ sysctl_conf
mount -s /var >/dev/null 2>&1 # cannot be on NFS
mount -s /var/log >/dev/null 2>&1 # cannot be on NFS
mount -s /usr >/dev/null 2>&1 # if NFS, fstab must use IP address
+mount -s /tmp >/dev/null 2>&1 # if NFS, fstab must use IP address
+
+# Prune /tmp before users can authenticate. A few files are removed
+# immediately, but most of the deletion happens asynchronously while
+# daemons are being started
+( cd /tmp && {
+ echo clearing /tmp
+ skip="-maxdepth 1 -mindepth 1 ! -perm -1000 ! -path ./lost+found
+ ! -path ./quota.user ! -path ./quota.group ! -path ./vi.recover"
+ find . $skip -print0 | xargs -r0J % find -d % -exec rm -rf {} \; -print |
+ head -50 >/dev/null 2>&1
+ tmpdir=$(mktemp -d .delXXXXXXXXXX) && {
+ find . $skip ! -name "$tmpdir" -print0 |
+ xargs -r0J % mv -f % "$tmpdir"
+ rm -rf "$tmpdir" &
+ }
+} )
reorder_libs 2>&1 |&
@@ -597,26 +614,6 @@ if [[ -f /etc/ptmp ]]; then
'password file may be incorrect -- /etc/ptmp exists'
fi
-echo clearing /tmp
-
-# Prune /tmp before users can authenticate. A few files are removed
-# immediately, but most of the deletion happens asyncronously while
-# daemons are being started
-clear_tmp_dir=$(cd /tmp && {
- rm -rf .{X11,ICE}-unix
-
- set -- rm -rf
- TMPDIR=$(mktemp -d /tmp/.delXXXXXXXXXX) && export TMPDIR &&
- set -- sh -c 'mv -f -- "$@" "$TMPDIR"'
- find . -maxdepth 1 ! -name . ! -name lost+found ! -name quota.user \
- ! -name quota.group ! -name vi.recover ! -name "$(basename "$TMPDIR")" \
- -exec "$@" -- {} \+
- rm -rfv "$TMPDIR" 2>&1 | head -20 >/dev/null
- echo "$TMPDIR"
-} )
-rm -rf "$clear_tmp_dir" &
-clear_tmp_pid=$!
-
# Create Unix sockets directories for X if needed and make sure they have
# correct permissions.
[[ -d /usr/X11R6/lib ]] && mkdir -m 1777 /tmp/.{X11,ICE}-unix
@@ -666,8 +663,6 @@ start_daemon dhcp6leased rad hostapd lpd
start_daemon ftpproxy ftpproxy6 tftpd tftpproxy identd inetd rarpd bootparamd
start_daemon rbootd mopd vmd spamd spamlogd sndiod
echo '.'
-
-wait $clear_tmp_pid
# If rc.firsttime exists, run it just once, and make sure it is deleted.
run_upgrade_script firsttime