[apparmor] [patch] Fix name_to_prof_filename() error behaviour

Christian Boltz apparmor at cboltz.de
Sun Jul 19 18:51:43 UTC 2015


Hello,

in some cases, the return value of name_to_prof_filename() is undefined.                                                                                     
This happens when deleting the to-be-confined binary while running
aa-genprof and leads to a not-too-helpful
    File "/usr/lib/python3/dist-packages/apparmor/aa.py", line 265, in enforce
              prof_filename, name = name_to_prof_filename(path)
        TypeError: 'NoneType' object is not iterable

(reported by maslen on IRC)

This patch makes sure name_to_prof_filename() always returns None, None
(instead of undefined aka just None) so that at least the caller can
successfully split it into two None values.

For the exotic aa-genprof usecase given above, this at least improves
the error message to
    Can't find $binary_name
(raised by enforce() via fatal_error())


The patch also changes fatal_error() to display the traceback first, and
the human-readable message at the end, which makes it more likely that
the user actually notices the human-readable message.


I propose this patch for trunk and 2.9.


[ 80-name_to_prof_filename-better-error-behaviour.diff ]

--- utils/apparmor/aa.py        2015-07-19 13:08:29.274534429 +0200
+++ ./utils/apparmor/aa.py      2015-07-19 20:45:05.298955097 +0200
@@ -150,8 +150,8 @@
     # Get the traceback to the message
     tb_stack = traceback.format_list(traceback.extract_stack())
     tb_stack = ''.join(tb_stack)
-    # Append the traceback to message
-    message = message + '\n' + tb_stack
+    # Add the traceback to message
+    message = tb_stack + '\n\n' + message
     debug_logger.error(message)
     caller = inspect.stack()[1][3]
 
@@ -257,8 +257,8 @@
             prof_filename = get_profile_filename(bin_path)
             if os.path.isfile(prof_filename):
                 return (prof_filename, bin_path)
-            else:
-                return None, None
+
+    return None, None
 
 def complain(path):
     """Sets the profile to complain mode if it exists"""


Regards,

Christian Boltz
-- 
>kann mir jemand sagen, wie ich aus einer aktuellen WindowMaker-Ober-
>fläche ne neue Sitzung starte, ohne die aktuelle Oberfläche zu beenden?
Ahem, Sitzung? Geh' ins Klo, setz dich nieder und ...
Oder was meinst du mit "Sitzung"?
[> Udo Gerhards und David Haller in suse-linux]




More information about the AppArmor mailing list