File apparmor-utils-328707-update-repo-profiles-before-execdecision.diff of Package apparmor-utils

Index: trunk/utils/SubDomain.pm
===================================================================
--- trunk.orig/utils/SubDomain.pm
+++ trunk/utils/SubDomain.pm
@@ -1395,6 +1395,12 @@ sub handlechildren {
                     $hat = $uhat;
                     next;
                 }
+                my $new_p = fetch_newer_repo_profile($profile);
+                if ( UI_SelectUpdatedRepoProfile($profile, $new_p) and
+                     $sd{$profile}{$uhat} ) {
+                    $hat = $uhat;
+                    next;
+                }
 
                 # figure out what our default hat for this application is.
                 my $defaulthat;
@@ -1520,7 +1526,16 @@ sub handlechildren {
                 }
 
                 if ($do_execute) {
-
+                    next if ( profile_exec_access_check( $profile,
+                                                         $hat,
+                                                         "exec",
+                                                         $exec_target ) );
+                    my $p = fetch_newer_repo_profile($profile);
+                    next if ( UI_SelectUpdatedRepoProfile($profile, $p) and
+                              profile_exec_access_check( $profile,
+                                                         $hat,
+                                                         "exec",
+                                                         $exec_target ) );
                     my $context = $profile;
                     $context .= "^$hat" if $profile ne $hat;
                     $context .= " -> $exec_target";
@@ -2309,17 +2324,16 @@ sub get_repo_profiles_for_user {
     return $p_hash;
 }
 
-sub check_repo_for_newer {
+sub fetch_newer_repo_profile {
     my $profile = shift;
 
     my $distro = $cfg->{repository}{distro};
     my $url    = $sd{$profile}{$profile}{repo}{url};
     my $user   = $sd{$profile}{$profile}{repo}{user};
     my $id     = $sd{$profile}{$profile}{repo}{id};
-
-    return unless ($distro && $url && $user && $id);
-
     my $p;
+
+    return undef unless ($distro && $url && $user && $id);
     if ($repo_client) {
         UI_BusyStart( gettext("Connecting to repository.....") );
         my $res =
@@ -2336,6 +2350,17 @@ sub check_repo_for_newer {
             }
         }
     }
+    return $p;
+}
+
+sub UI_SelectUpdatedRepoProfile ($$) {
+
+    my ($profile, $p) = @_;
+    my $distro        = $cfg->{repository}{distro};
+    my $url           = $sd{$profile}{$profile}{repo}{url};
+    my $user          = $sd{$profile}{$profile}{repo}{user};
+    my $id            = $sd{$profile}{$profile}{repo}{id};
+    my $updated       = 0;
 
     if ($p) {
         my $q = { };
@@ -2385,9 +2410,12 @@ sub check_repo_for_newer {
 
             if ($@) {
                 UI_Info(gettext("Error parsing repository profile."));
+            } else {
+                $updated = 1;
             }
         }
     }
+    return $updated;
 }
 
 sub ask_the_questions {
@@ -2409,7 +2437,8 @@ sub ask_the_questions {
 
         for my $profile (sort keys %{ $log{$sdmode} }) {
 
-            check_repo_for_newer($profile);
+            my $p = fetch_newer_repo_profile($profile);
+            UI_SelectUpdatedRepoProfile($profile, $p) if ( $p );
 
             $found++;
 
@@ -4639,6 +4668,31 @@ sub matchliteral {
     return $matches;
 }
 
+sub profile_exec_access_check ($$$$) {
+    my ($profile, $hat, $type, $exec_target) = @_;
+    if ( $type eq "exec" ) {
+        my ($combinedmode, $cm, @m);
+
+        # does path match any regexps in original profile?
+        ($cm, @m) = rematchfrag($sd{$profile}{$hat}, $exec_target);
+        $combinedmode .= $cm if $cm;
+
+        # does path match anything pulled in by includes in
+        # original profile?
+        ($cm, @m) = matchpathincludes($sd{$profile}{$hat}, $exec_target);
+        $combinedmode .= $cm if $cm;
+
+        if (contains($combinedmode, "ix") ||
+            contains($combinedmode, "px") ||
+            contains($combinedmode, "ux") ||
+            contains($combinedmode, "Px") ||
+            contains($combinedmode, "Ux")) {
+            return 1;
+        }
+    }
+    return 0;
+}
+
 sub profile_capability_access_check ($$$) {
     my ($profile, $hat, $capname) = @_;
     for my $incname ( keys %{$sd{$profile}{$hat}{include}} ) {
openSUSE Build Service is sponsored by