include $(TOPDIR)/rules.mk
PKG_NAME:=shadow
-PKG_VERSION:=4.19.4
-PKG_RELEASE:=2
+PKG_VERSION:=4.20.2
+PKG_RELEASE:=1
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
PKG_SOURCE_URL:=https://github.com/shadow-maint/shadow/releases/download/$(PKG_VERSION)
-PKG_HASH:=ce57a313e315a0a7cb04a8f50cc20753e994e487bbe9b78a2a824ca75cb486c0
+PKG_HASH:=b89f432b75ae55a2d852b446d0365484795fdf533ab97d550e325fa15594a224
PKG_MAINTAINER:=Alexandru Ardelean <ardeleanalex@gmail.com>
PKG_LICENSE:=BSD-3-Clause
include $(INCLUDE_DIR)/nls.mk
SHADOW_APPLETS := \
- chage chfn chgpasswd chpasswd chsh expiry faillog gpasswd \
- groupadd groupdel groupmems groupmod grpck grpconv grpunconv \
- login logoutd newgrp newgidmap newuidmap newusers nologin \
+ chage chfn chgpasswd chpasswd chsh faillog gpasswd \
+ groupadd groupdel groupmod grpck grpconv grpunconv \
+ login newgrp newgidmap newuidmap newusers nologin \
passwd pwck pwconv pwunconv su \
useradd userdel usermod vipw
$(INSTALL_DIR) $(1)/etc
$(INSTALL_CONF) $(PKG_INSTALL_DIR)/etc/login.defs $(1)/etc/
$(SED) 's,SU_NAME,#SU_NAME,g' $(1)/etc/login.defs
- $(SED) 's,#ENCRYPT_METHOD DES,ENCRYPT_METHOD BCRYPT,g' $(1)/etc/login.defs
+ $(SED) 's,#ENCRYPT_METHOD SHA512,ENCRYPT_METHOD BCRYPT,g' $(1)/etc/login.defs
endef
define Package/shadow-utils/install
+From d4399c664ec1f1c9fc2c2e19a3db1e0948d37859 Mon Sep 17 00:00:00 2001
+From: Alexandru Ardelean <alex@shruggie.ro>
+Date: Wed, 20 Aug 2026 09:00:00 +0300
+Subject: [PATCH] su: tolerate the absence of a controlling terminal
+
+su drops the controlling terminal when running a command, treating a
+missing one (ENXIO from open) as success. On musl, open("/dev/tty")
+can fail with EACCES instead, or TIOCNOTTY can fail with ENOTTY;
+handle both so "su <user> -c <cmd>" works without a controlling
+terminal (init scripts, service supervisors). OpenWrt issue #1521.
+
+Signed-off-by: Alexandru Ardelean <alex@shruggie.ro>
+---
--- a/src/su.c
+++ b/src/su.c
-@@ -1169,8 +1169,12 @@ int main (int argc, char **argv)
+@@ -1165,8 +1165,12 @@ int main (int argc, char **argv)
if (fd >= 0) {
err = ioctl (fd, TIOCNOTTY, (char *) NULL);