22073126 sysattr CFFI code raises wrong exception types s12b86
authorErik Trauschke <Erik.Trauschke@oracle.com>
Wed, 21 Oct 2015 10:05:52 -0700
changeset 3270 e7a2981c67d0
parent 3269 248b897a153c
child 3272 2ad41f0a43dc
22073126 sysattr CFFI code raises wrong exception types
src/modules/sysattr.py
src/modules/syscallat.py
src/tests/api/t_sysattr.py
src/tests/cli/t_pkg_install.py
--- a/src/modules/sysattr.py	Fri Oct 16 13:55:01 2015 -0700
+++ b/src/modules/sysattr.py	Wed Oct 21 10:05:52 2015 -0700
@@ -66,11 +66,11 @@
 
     fd = os.open(filename, os.O_RDONLY)
     if fd == -1:
-        raise ffi.error(ffi.errno)
+        raise OSError(ffi.errno, os.strerror(ffi.errno), filename)
 
     if lib.fgetattr(fd, lib.XATTR_VIEW_READWRITE, response):
         os.close(fd)
-        raise ffi.error(ffi.errno)
+        raise OSError(ffi.errno, os.strerror(ffi.errno), filename)
     os.close(fd)
 
     count = 0
@@ -131,7 +131,7 @@
     request[0] = ffi.gc(request[0], lib.nvlist_free)
 
     if lib.nvlist_alloc(request, lib.NV_UNIQUE_NAME, 0) != 0:
-        raise ffi.error(ffi.errno)
+        raise OSError(ffi.errno, os.strerror(ffi.errno))
 
     # A single string indicates system attributes are passed in compact
     # form (e.g. AHi), verbose attributes are read as a list of strings.
@@ -161,15 +161,15 @@
                                  "attribute".format(attr))
         if lib.nvlist_add_boolean_value(request[0], lib.attr_to_name(sys_attr),
                                         1) != 0:
-            raise ffi.error(ffi.errno)
+            raise OSError(ffi.errno, os.strerror(ffi.errno))
 
     fd = os.open(filename, os.O_RDONLY)
     if fd == -1:
-        raise ffi.error(ffi.errno)
+        raise OSError(ffi.errno, os.strerror(ffi.errno), filename)
 
     if lib.fsetattr(fd, lib.XATTR_VIEW_READWRITE, request[0]):
         os.close(fd)
-        raise ffi.error(ffi.errno)
+        raise OSError(ffi.errno, os.strerror(ffi.errno), filename)
     os.close(fd)
 
 
--- a/src/modules/syscallat.py	Fri Oct 16 13:55:01 2015 -0700
+++ b/src/modules/syscallat.py	Wed Oct 21 10:05:52 2015 -0700
@@ -25,6 +25,7 @@
 #
 
 from __future__ import unicode_literals
+import os
 import six
 from pkg._syscallat import lib, ffi
 
@@ -41,7 +42,7 @@
 
     rv = lib.mkdirat(fd, path, mode)
     if rv != 0:
-        raise OSError(ffi.errno, "No such file or directory")
+        raise OSError(ffi.errno, os.strerror(ffi.errno), path)
 
 
 def openat(fildes, path, oflag, mode):
@@ -58,7 +59,7 @@
 
     rv = lib.openat(fildes, path, oflag, mode)
     if rv < 0:
-        raise OSError(ffi.errno, "No such file or directory")
+        raise OSError(ffi.errno, os.strerror(ffi.errno), path)
     return rv
 
 
@@ -76,7 +77,7 @@
 
     rv = lib.renameat(fromfd, old, tofd, new)
     if rv != 0:
-        raise OSError(ffi.errno, "No such file or directory")
+        raise OSError(ffi.errno, os.strerror(ffi.errno), old)
 
 
 def unlinkat(dirfd, path, flag):
@@ -91,4 +92,4 @@
 
     rv = lib.unlinkat(dirfd, path, flag)
     if rv < 0:
-        raise OSError(ffi.errno, "No such file or directory")
+        raise OSError(ffi.errno, os.strerror(ffi.errno), path)
--- a/src/tests/api/t_sysattr.py	Fri Oct 16 13:55:01 2015 -0700
+++ b/src/tests/api/t_sysattr.py	Wed Oct 21 10:05:52 2015 -0700
@@ -76,10 +76,16 @@
                     dir="/var/tmp")
                 self.test_fh, self.test_fn = tempfile.mkstemp(
                     dir=self.test_path)
+                self.unsup_test_path = tempfile.mkdtemp(prefix="test-suite",
+                    dir="/tmp")
+                self.test_fh2, self.test_fn2 = tempfile.mkstemp(
+                    dir=self.unsup_test_path)
 
         def tearDown(self):
                 portable.remove(self.test_fn)
+                portable.remove(self.test_fn2)
                 os.rmdir(self.test_path)
+                os.rmdir(self.unsup_test_path)
 
         def test_0_bad_input(self):
                 # fsetattr
@@ -91,6 +97,9 @@
                     "xyz")
                 self.assertRaises(OSError, portable.fsetattr, "/nofile",
                     "H")
+                # FS does not support system attributes.
+                self.assertRaises(OSError, portable.fsetattr, self.test_fn2,
+                    "H")
 
                 # fgetattr
                 self.assertRaises(OSError, portable.fgetattr, "/nofile")
--- a/src/tests/cli/t_pkg_install.py	Fri Oct 16 13:55:01 2015 -0700
+++ b/src/tests/cli/t_pkg_install.py	Wed Oct 21 10:05:52 2015 -0700
@@ -1058,6 +1058,11 @@
                 plist = self.pkgsend_bulk(self.rurl, [self.secret1,
                     self.secret2, self.secret3, self.secret4])
 
+                # Try to install in /tmp which does not support system
+                # attributes. Just make sure we fail gracefully.
+                self.image_create(self.rurl)
+                self.pkg("install secret1", exit=1)
+
                 # Need to create an image in /var/tmp since sysattrs don't work
                 # in tmpfs.
                 self.debug(self.rurl)