What happened?
X is a valid char in ACLs
For some details see
https://nordisch.org/posts/linux-acl-masks-fun/
I am not sure why we do the whole octal conversion in the first place.
my current attempt to solve it looks like this:
diff --git a/salt/modules/linux_acl.py b/salt/modules/linux_acl.py
index e1fcf4a9c8..64f1f061c4 100644
--- a/salt/modules/linux_acl.py
+++ b/salt/modules/linux_acl.py
@@ -157,7 +157,7 @@ def _parse_acl(acl, user, group):
vals["permissions"]["write"] = True
else:
vals["permissions"]["write"] = False
- if "x" in comps[-1]:
+ if "x" in comps[-1] or "X" in comps[-1]:
octal += 1
vals["permissions"]["execute"] = True
else:
diff --git a/salt/states/linux_acl.py b/salt/states/linux_acl.py
index c45c938348..2899287b64 100644
--- a/salt/states/linux_acl.py
+++ b/salt/states/linux_acl.py
@@ -102,7 +102,7 @@ def present(name, acl_type, acl_name="", perms="", recurse=False, force=False):
"""
ret = {"name": name, "result": True, "changes": {}, "comment": ""}
- _octal = {"r": 4, "w": 2, "x": 1, "-": 0}
+ _octal = {"r": 4, "w": 2, "x": 1, "X": 1, "-": 0}
_octal_lookup = {0: "-", 1: "r", 2: "w", 4: "x"}
if not os.path.exists(name):
Why do we go through octal here at all?
Type of salt install
other (please specify in bug details)
Major version
3006.x
What supported OS are you seeing the problem on? Can select multiple. (If bug appears on an unsupported OS, please open a GitHub Discussion instead)
opensuse-leap-15.5
salt --versions-report output
salt --versions-report
Salt Version:
Salt: 3006.0
Python Version:
Python: 3.13.15 (main, Sep 16 2026, 12:10:42) [GCC]
Dependency Versions:
cffi: 2.0.0
cherrypy: Not Installed
contextvars: 2.4
dateutil: 2.9.0.post0
docker-py: Not Installed
gitdb: Not Installed
gitpython: Not Installed
Jinja2: 3.1.6
libgit2: Not Installed
looseversion: 1.3.0
M2Crypto: 0.49.0
Mako: Not Installed
msgpack: 1.2.1
msgpack-pure: Not Installed
mysql-python: Not Installed
packaging: 26.3
pycparser: 3.00
pycrypto: Not Installed
pycryptodome: 3.23.0
pygit2: Not Installed
python-gnupg: Not Installed
PyYAML: 6.0.3
PyZMQ: 27.2.0
relenv: Not Installed
smmap: Not Installed
timelib: Not Installed
Tornado: 6.5.8
ZMQ: 4.3.5
System Versions:
dist: opensuse-tumbleweed 20260921 n/a
locale: utf-8
machine: x86_64
release: 7.2.6-1-default
system: Linux
version: openSUSE Tumbleweed 20260921 n/a
What happened?
X is a valid char in ACLs
For some details see
https://nordisch.org/posts/linux-acl-masks-fun/
I am not sure why we do the whole octal conversion in the first place.
my current attempt to solve it looks like this:
Why do we go through octal here at all?
Type of salt install
other (please specify in bug details)
Major version
3006.x
What supported OS are you seeing the problem on? Can select multiple. (If bug appears on an unsupported OS, please open a GitHub Discussion instead)
opensuse-leap-15.5
salt --versions-report output
salt --versions-report Salt Version: Salt: 3006.0 Python Version: Python: 3.13.15 (main, Sep 16 2026, 12:10:42) [GCC] Dependency Versions: cffi: 2.0.0 cherrypy: Not Installed contextvars: 2.4 dateutil: 2.9.0.post0 docker-py: Not Installed gitdb: Not Installed gitpython: Not Installed Jinja2: 3.1.6 libgit2: Not Installed looseversion: 1.3.0 M2Crypto: 0.49.0 Mako: Not Installed msgpack: 1.2.1 msgpack-pure: Not Installed mysql-python: Not Installed packaging: 26.3 pycparser: 3.00 pycrypto: Not Installed pycryptodome: 3.23.0 pygit2: Not Installed python-gnupg: Not Installed PyYAML: 6.0.3 PyZMQ: 27.2.0 relenv: Not Installed smmap: Not Installed timelib: Not Installed Tornado: 6.5.8 ZMQ: 4.3.5 System Versions: dist: opensuse-tumbleweed 20260921 n/a locale: utf-8 machine: x86_64 release: 7.2.6-1-default system: Linux version: openSUSE Tumbleweed 20260921 n/a