From 49f2d67070b51f6b72f8189b53abe9de6e2c727b Mon Sep 17 00:00:00 2001 From: "Todd C. Miller" Date: Thu, 22 Dec 2022 16:45:13 -0700 Subject: [PATCH] Fix support for AIX-style path(module) syntax in sudo.conf Plugin lines. --- lib/util/sudo_dso.c | 2 +- src/load_plugins.c | 16 +++++++++++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/lib/util/sudo_dso.c b/lib/util/sudo_dso.c index c4fa0a5df..3516a641b 100644 --- a/lib/util/sudo_dso.c +++ b/lib/util/sudo_dso.c @@ -240,7 +240,7 @@ sudo_dso_load_v1(const char *path, int mode) cp = strrchr(path, '('); if (cp != NULL) { size_t len = strlen(cp); - if (len > 2 && cp[len - 1] == '\0') + if (len > 2 && cp[len - 1] == ')') SET(flags, RTLD_MEMBER); } # endif /* RTLD_MEMBER */ diff --git a/src/load_plugins.c b/src/load_plugins.c index 573460299..376306c3d 100644 --- a/src/load_plugins.c +++ b/src/load_plugins.c @@ -82,7 +82,21 @@ sudo_stat_plugin(struct plugin_info *info, char *fullpath, } status = stat(fullpath, sb); } - if (status == -1) { +#ifdef _AIX + if (status == -1 && errno == ENOENT) { + /* Check for AIX path(module) syntax. */ + char *cp = strrchr(fullpath, '('); + if (cp != NULL) { + /* Only for archive files (e.g. sudoers.a). */ + if (cp > fullpath + 2 && cp[-2] == '.' && cp[-1] == 'a') { + *cp = '\0'; + status = stat(fullpath, sb); + *cp = '('; + } + } + } +#endif /* _AIX */ + if (status == -1 && errno == ENOENT) { char *newpath = sudo_stat_multiarch(fullpath, sb); if (newpath != NULL) { len = strlcpy(fullpath, newpath, pathsize);