<html>
  <head>

    <meta http-equiv="content-type" content="text/html; charset=utf-8">
  </head>
  <body text="#000000" bgcolor="#FFFFFF">
    <p>I have some confusion about source code of lxc-test-apparmor
      defined in 'lxc/src/tests/aa.c'.</p>
    <ul>
      <li>The output of<code></code></li>
      <li><code>lxc-test-apparmor</code>
      </li>
    </ul>
    <pre><code>     passed with /sys/kernel/uevent_helper
        passed with /proc/sys/fs/file-nr
        failed - opened /sys/kernel/mm/ksm/pages_to_scan
</code></pre>
    <ul>
      <li><code>ls -l /sys/kernel/uevent_helper</code></li>
      <li><code>ls -l /sys/kernel/mm/ksm/pages_to_scan</code></li>
    </ul>
    <pre><code>     root@intel-x86-64:# ls -l /sys/kernel/uevent_helper    
        ls: cannot access '/sys/kernel/uevent_helper': No such file or directory
        root@intel-x86-64:# ls -l /sys/kernel/mm/ksm/pages_to_scan 
        -rw-r--r-- 1 root root 4096 Mar  6 19:17 /sys/kernel/mm/ksm/pages_to_scan

</code></pre>
    <h4>Issue description</h4>
    <p>As shown above, /sys/kernel/mm/ksm/pages_to_scan is exist, and
      can be opened. But error message prompts that fail to open it.<br>
      I refer to source code lxc/src/tests/aa.c, branch master.</p>
    <pre><code>108 char *files_to_deny[] = {
109                 "/sys/kernel/uevent_helper",
110                 "/proc/sys/fs/file-nr",
111                 "/sys/kernel/mm/ksm/pages_to_scan",
112                 "/proc/sys/kernel/sysrq",
113                 NULL };

</code></pre>
    <pre><code>115 static bool test_aa_policy(struct lxc_container *c)
116 {
117         int i, ret;
118 
119         for (i = 0; files_to_deny[i]; i++) {
120                 ret = do_test_file_open(c, files_to_deny[i]);
121                 if (ret < 0) {
122                         fprintf(stderr, "attach failed; skipping test\n");
123                         return true;
124                 }
125                 if (ret > 0) {
126                         fprintf(stderr, "failed - opened %s\n",
127                                         files_to_deny[i]);
128                         return false;
129                 }
130                 fprintf(stderr, "passed with %s\n", files_to_deny[i]);
131         }
......

</code></pre>
    <pre><code> 63 static int do_test_file_open(struct lxc_container *c, char *fnam)
 64 {
 65         int fret = -1;
 66         int ret;
 67         pid_t pid;
 68         int pipefd[2];
 69         char result[1024];
 70         lxc_attach_options_t attach_options = LXC_ATTACH_OPTIONS_DEFAULT;
 71 
 72         ret = pipe(pipefd);
 73         if (ret < 0) {
 74                 fprintf(stderr, "pipe failed %d\n", ret);
 75                 return fret;
 76         }
 77         attach_options.stdout_fd = pipefd[1];
 78         attach_options.attach_flags &= ~(LXC_ATTACH_LSM_EXEC|LXC_ATTACH_DROP_CAPABILITIES);
 79         attach_options.attach_flags |= LXC_ATTACH_LSM_NOW;
 80         ret = c->attach(c, test_attach_write_file, fnam, &attach_options, &pid);
......
 85 
 86         ret = read(pipefd[0], result, sizeof(result)-1);
 87         if (ret < 0) {
 88                 fprintf(stderr, "read failed %d\n", ret);
 89                 goto err2;
 90         }
 91 
 92         fret = 1;
 93         if (strncmp(result, "no", 2) == 0)
 94                 fret = 0;
......
101         return fret;
102 }

</code></pre>
    <pre><code> 41 static int test_attach_write_file(void* payload)
 42 {
 43         char *fnam = payload;
 44         FILE *f;
 45 
 46         f = fopen(fnam, "w");
 47         if (f) {
 48                 printf("yes\n");
 49                 fclose(f);
 50                 fflush(NULL);
 51                 return 1;
 52         }
 53         printf("no\n");
 54         fflush(NULL);
 55         return 0;
 56 }

</code></pre>
    <p>Line46-48: If open interfaces successfully listed in
      files_to_deny[], Line108, printf 'yes' into pipe[1].<br>
      Line86: And then pipe[0] reads out 'yes'.<br>
      Line92-101: If result is 'yes', do_test_file_open() will return 1.<br>
      Line125-128: If the return of do_test_file_open() is 1, then
      fprintf( failed open).<br>
      So can anyone tell me why files listed in files_to_deny[] exit but
      print fail.</p>
    <p>Thanks.</p>
    <p><br>
    </p>
    <pre>
<code></code></pre>
  </body>
</html>