diff --git a/libselinux/src/fsetfilecon.c b/libselinux/src/fsetfilecon.c index 309105c2..9963f7ab 100644 --- a/libselinux/src/fsetfilecon.c +++ b/libselinux/src/fsetfilecon.c @@ -9,8 +9,20 @@ int fsetfilecon_raw(int fd, const security_context_t context) { - return fsetxattr(fd, XATTR_NAME_SELINUX, context, strlen(context) + 1, + int rc = fsetxattr(fd, XATTR_NAME_SELINUX, context, strlen(context) + 1, 0); + if (rc < 0 && errno == ENOTSUP) { + security_context_t ccontext = NULL; + int err = errno; + if ((fgetfilecon_raw(fd, &ccontext) >= 0) && + (strcmp(context,ccontext) == 0)) { + rc = 0; + } else { + errno = err; + } + freecon(ccontext); + } + return rc; } hidden_def(fsetfilecon_raw) diff --git a/libselinux/src/lsetfilecon.c b/libselinux/src/lsetfilecon.c index 461e3f7c..fd9bb261 100644 --- a/libselinux/src/lsetfilecon.c +++ b/libselinux/src/lsetfilecon.c @@ -9,8 +9,20 @@ int lsetfilecon_raw(const char *path, const security_context_t context) { - return lsetxattr(path, XATTR_NAME_SELINUX, context, strlen(context) + 1, + int rc = lsetxattr(path, XATTR_NAME_SELINUX, context, strlen(context) + 1, 0); + if (rc < 0 && errno == ENOTSUP) { + security_context_t ccontext = NULL; + int err = errno; + if ((lgetfilecon_raw(path, &ccontext) >= 0) && + (strcmp(context,ccontext) == 0)) { + rc = 0; + } else { + errno = err; + } + freecon(ccontext); + } + return rc; } hidden_def(lsetfilecon_raw) diff --git a/libselinux/src/setfilecon.c b/libselinux/src/setfilecon.c index 7465c6a4..50cb228f 100644 --- a/libselinux/src/setfilecon.c +++ b/libselinux/src/setfilecon.c @@ -9,8 +9,20 @@ int setfilecon_raw(const char *path, const security_context_t context) { - return setxattr(path, XATTR_NAME_SELINUX, context, strlen(context) + 1, + int rc = setxattr(path, XATTR_NAME_SELINUX, context, strlen(context) + 1, 0); + if (rc < 0 && errno == ENOTSUP) { + security_context_t ccontext = NULL; + int err = errno; + if ((getfilecon_raw(path, &ccontext) >= 0) && + (strcmp(context,ccontext) == 0)) { + rc = 0; + } else { + errno = err; + } + freecon(ccontext); + } + return rc; } hidden_def(setfilecon_raw)