Cope with xattr syscalls raising EOPNOTSUPP
authorSimon McVittie <smcv@collabora.com>
Mon, 16 Oct 2017 11:51:04 +0000 (12:51 +0100)
committerSimon McVittie <smcv@debian.org>
Thu, 26 Oct 2017 23:19:45 +0000 (00:19 +0100)
ENOTSUP and EOPNOTSUPP are numerically equal on most Linux ports,
but inexplicably differ on PA-RISC (hppa) and possibly other
rare architectures.

Signed-off-by: Simon McVittie <smcv@collabora.com>
Closes: #1275
Approved by: cgwalters
Applied-upstream: 2017.13, commit:a4723dafed722008ed1ee3c952b7ff8e3d9b9a45

Gbp-Pq: Topic 2017.13
Gbp-Pq: Name Cope-with-xattr-syscalls-raising-EOPNOTSUPP.patch

src/ostree/ot-builtin-create-usb.c
tests/libostreetest.c

index c77dbcbae29e9c56f15db959eff2cdd97026bf56..742a6c230ed2f5655282e7afcfc6a50ec25dada2 100644 (file)
@@ -113,7 +113,7 @@ ostree_builtin_create_usb (int            argc,
   OstreeRepoMode mode = OSTREE_REPO_MODE_BARE_USER;
 
   if (TEMP_FAILURE_RETRY (fgetxattr (mount_root_dfd, "user.test", NULL, 0)) < 0 &&
-      errno == ENOTSUP)
+      (errno == ENOTSUP || errno == EOPNOTSUPP))
     mode = OSTREE_REPO_MODE_ARCHIVE;
 
   g_debug ("%s: Creating repository in mode %u", G_STRFUNC, mode);
index 496ff74071dc2e33f626b77cb6c307c5ac38244f..11949c98213e22245fc856520c284370df842559 100644 (file)
@@ -85,8 +85,10 @@ ot_check_relabeling (gboolean *can_relabel,
   g_autoptr(GBytes) bytes = glnx_fgetxattr_bytes (tmpf.fd, "security.selinux", &local_error);
   if (!bytes)
     {
-      /* libglnx preserves errno */
-      if (G_IN_SET (errno, ENOTSUP, ENODATA))
+      /* libglnx preserves errno. The EOPNOTSUPP case can't be part of a
+       * 'case' statement because on most but not all architectures,
+       * it's numerically equal to ENOTSUP. */
+      if (G_IN_SET (errno, ENOTSUP, ENODATA) || errno == EOPNOTSUPP)
         {
           *can_relabel = FALSE;
           return TRUE;
@@ -99,7 +101,7 @@ ot_check_relabeling (gboolean *can_relabel,
   const guint8 *data = g_bytes_get_data (bytes, &data_len);
   if (fsetxattr (tmpf.fd, "security.selinux", data, data_len, 0) < 0)
     {
-      if (errno == ENOTSUP)
+      if (errno == ENOTSUP || errno == EOPNOTSUPP)
         {
           *can_relabel = FALSE;
           return TRUE;
@@ -122,7 +124,7 @@ ot_check_user_xattrs (gboolean *has_user_xattrs,
 
   if (fsetxattr (tmpf.fd, "user.test", "novalue", strlen ("novalue"), 0) < 0)
     {
-      if (errno == ENOTSUP)
+      if (errno == ENOTSUP || errno == EOPNOTSUPP)
         {
           *has_user_xattrs = FALSE;
           return TRUE;