[apparmor] [PATCH] libapparmor: ENOENT should only signify label not found in label queries
Tyler Hicks
tyhicks at canonical.com
Fri Aug 2 20:10:36 UTC 2013
On 2013-08-02 12:40:50, Tyler Hicks wrote:
> When doing label queries with aa_query_label(), there are a number of
> error conditions that can occur. Most of them indicate that the query
> could not happen. That may be because the application provided invalid
> input, memory allocation failed, the kernel doesn't support queries,
> libapparmor and the kernel may be out of sync, etc.
>
> However, there's one special error condition that stands out from the
> rest. That is when the query was successful but the kernel was unable to
> find the subject label of the query.
>
> This is a special error condition because it would be useful for
> applications that will be doing queries to do a test query during their
> initialization stage to make sure that their queries, the current
> version of libapparmor, and the current kernel can be expected to work
> well together later during runtime. If the test query fails, depending
> on the application's configuration, it may want to continue without
> AppArmor mediation or it may want to exit right then and there.
>
> The significance of ENOENT for these test queries is that the
> application has no idea what a valid label may be in its early
> initialization phase. It isn't aware of what profiles are loaded and no
> other application has started talking to it. So, it will have to guess
> at a label name (maybe "default"?) for its test query and it needs to
> know if the query was successful even if the label doesn't exist.
>
> This patch eliminates all potential return locations that may have errno
> set to ENOENT, except for the write() that sets ENOENT when the label
> isn't found.
>
> Signed-off-by: Tyler Hicks <tyhicks at canonical.com>
> ---
> libraries/libapparmor/src/kernel_interface.c | 18 ++++++++++++++----
> 1 file changed, 14 insertions(+), 4 deletions(-)
>
> diff --git a/libraries/libapparmor/src/kernel_interface.c b/libraries/libapparmor/src/kernel_interface.c
> index 34f9579..53961b2 100644
> --- a/libraries/libapparmor/src/kernel_interface.c
> +++ b/libraries/libapparmor/src/kernel_interface.c
> @@ -684,7 +684,9 @@ static void aafs_access_init_once(void)
> * @audited: upon successful return, will be 1 if query should be audited and 0
> * if not
> *
> - * Returns: 0 on success else -1 and sets errno
> + * Returns: 0 on success else -1 and sets errno. If -1 is returned and errno is
> + * ENOENT, the query was successful but the label in the query string
> + * could not be found by the kernel.
> */
> int aa_query_label(uint32_t mask, char *query, size_t size, int *allowed,
> int *audited)
> @@ -708,8 +710,11 @@ int aa_query_label(uint32_t mask, char *query, size_t size, int *allowed,
> }
>
> fd = open(aafs_access, O_RDWR);
> - if (fd == -1)
> + if (fd == -1) {
> + if (errno == ENOENT)
> + errno = EPROTONOSUPPORT;
> return -1;
> + }
>
> memcpy(query, AA_QUERY_CMD_LABEL, AA_QUERY_CMD_LABEL_SIZE);
> errno = 0;
> @@ -717,6 +722,12 @@ int aa_query_label(uint32_t mask, char *query, size_t size, int *allowed,
> if (ret != size) {
> if (ret >= 0)
> errno = EPROTO;
> + /* IMPORTANT: This is the only valid place to return ENOENT. It
> + * indicates that the label cannot be found by the kernel but
> + * the query was successful. Applications may depend on this to
> + * check if their query strings and aa_query_label() work with
> + * the current kernel by doing a test query.
> + */
Unfortunately, this is slightly flawed due to the remaining read()
below. There's still a chance that the kernel returns an unexpected
query reply but that code wouldn't be reached if the label wasn't found
by the kernel. That may result in an out-of-sync libapparmor and kernel
even though aa_query_label() returned ENOENT.
If it isn't possible for applications to do a _full_ test query
(including final read() below), then I'm not sure that the test query
idea is worth implementing.
When I initially came up with this test query idea, I was hoping that I
could query the "unconfined" label, but that results in ENOENT.
John (or others) there's no label that I can rely on for the purpose of
doing a full test query, is there?
Tyler
> return -1;
> }
>
> @@ -725,8 +736,7 @@ int aa_query_label(uint32_t mask, char *query, size_t size, int *allowed,
> (void)close(fd);
> errno = saved;
> if (ret != QUERY_LABEL_REPLY_LEN) {
> - if (ret >= 0)
> - errno = EPROTO;
> + errno = EPROTO;
> return -1;
> }
>
> --
> 1.8.3.2
>
>
> --
> AppArmor mailing list
> AppArmor at lists.ubuntu.com
> Modify settings or unsubscribe at: https://lists.ubuntu.com/mailman/listinfo/apparmor
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 836 bytes
Desc: Digital signature
URL: <https://lists.ubuntu.com/archives/apparmor/attachments/20130802/7922fb08/attachment.pgp>
More information about the AppArmor
mailing list