summaryrefslogtreecommitdiffstats
path: root/meta-agl-bsp/meta-raspberrypi/recipes-kernel/linux/linux-raspberrypi/0002-smack-fix-cache-of-access-labels.patch
blob: c516f3aa5e01f17e431fed006ccbad8716d988a2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
From 99267706991ab84bd44ceaea9a7ec886bbdd58e0 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jos=C3=A9=20Bollo?= <jobol@nonadev.net>
Date: Tue, 12 Jan 2016 21:23:40 +0100
Subject: [PATCH 2/4] smack: fix cache of access labels
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Before this commit, removing the access property of
a file, aka, the extended attribute security.SMACK64
was not effictive until the cache had been cleaned.

This patch fixes that problem.

Signed-off-by: José Bollo <jobol@nonadev.net>
Acked-by: Casey Schaufler <casey@schaufler-ca.com>
---
 security/smack/smack_lsm.c | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/security/smack/smack_lsm.c b/security/smack/smack_lsm.c
index b20ef06..b2bcb14 100644
--- a/security/smack/smack_lsm.c
+++ b/security/smack/smack_lsm.c
@@ -1444,9 +1444,13 @@ static int smack_inode_removexattr(struct dentry *dentry, const char *name)
 	 * Don't do anything special for these.
 	 *	XATTR_NAME_SMACKIPIN
 	 *	XATTR_NAME_SMACKIPOUT
-	 *	XATTR_NAME_SMACKEXEC
 	 */
-	if (strcmp(name, XATTR_NAME_SMACK) == 0)
+	if (strcmp(name, XATTR_NAME_SMACK) == 0) {
+		struct super_block *sbp = d_backing_inode(dentry)->i_sb;
+		struct superblock_smack *sbsp = sbp->s_security;
+
+		isp->smk_inode = sbsp->smk_default;
+	} else if (strcmp(name, XATTR_NAME_SMACKEXEC) == 0)
 		isp->smk_task = NULL;
 	else if (strcmp(name, XATTR_NAME_SMACKMMAP) == 0)
 		isp->smk_mmap = NULL;
-- 
2.7.4
* Literal.Number.Float */ .highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */ .highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */ .highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */ .highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */ .highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */ .highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */ .highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */ .highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */ .highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */ .highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */ .highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */ .highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */ .highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */ .highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */ .highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */ .highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */ .highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */ .highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */ .highlight .vc { color: #336699 } /* Name.Variable.Class */ .highlight .vg { color: #dd7700 } /* Name.Variable.Global */ .highlight .vi { color: #3333bb } /* Name.Variable.Instance */ .highlight .vm { color: #336699 } /* Name.Variable.Magic */ .highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */ }
/*
 * Copyright (C) 2019 Konsulko Group
 * Author: Matt Ranostay <matt.ranostay@konsulko.com>
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#define _GNU_SOURCE
#include <errno.h>
#include <string.h>
#include <glib.h>

#include <json-c/json.h>

#define CRLF	"\r\n"
#define SUPPORTED_VERSION "3.0"

enum {
	VC_FORMATTED_NAME,
	VC_TELEPHONE,
	VC_DATETIME,
	VC_PHOTO,
	VC_FIELD_COUNT,
};

static const gchar *VC_PREFIXES[VC_FIELD_COUNT] = {
	"FN",
	"TEL",
	"X-IRMC-CALL-DATETIME",
	"PHOTO",
};

#define vc_len(name)		strlen(VC_PREFIXES[name])

#define vc_strstr(ptr, name) \
	({ \
		void *_ptr = strstr(ptr, name); \
		if (_ptr) _ptr += strlen(name); \
		_ptr; \
	 })

static void add_fn(json_object *resp, gchar *msg)
{
	gchar *name = strstr(msg, ":");

	if (!name || !strlen(name + 1))
		return;

	json_object_object_add(resp, "fn", json_object_new_string(++name));
}

static void add_phone(json_object *array, gchar *msg)
{
	gchar *ptr = strstr(msg, ":");
	json_object *dict, *number;

	if (!ptr || !strlen(ptr + 1))
		return;

	number = json_object_new_string(ptr + 1);

	ptr = vc_strstr(msg, "TYPE=");
	if (!ptr)
		ptr = "UNKNOWN";
	else
		ptr = strsep(&ptr, ",;:");

	dict = json_object_new_object();
	json_object_object_add(dict, ptr, number);
	json_object_array_add(array, dict);
}

static void add_datetime(json_object *resp, gchar *msg)
{
	gchar *ptr;

	msg += vc_len(VC_DATETIME) + 1;

	ptr = strsep(&msg, ":");
	if (!ptr)
		return;
	json_object_object_add(resp, "type", json_object_new_string(ptr));

	ptr = strsep(&msg, "");
	if (!ptr)
		return;
	json_object_object_add(resp, "timestamp", json_object_new_string(ptr));
}

static gchar **extract_photo(json_object *resp, gchar **msg)
{
	GString *data;
	gchar *ptr;
	json_object *obj;

	// TODO: handle other mimetypes
	if (!strstr(*msg, "TYPE=JPEG"))
		return msg;

	ptr = strstr(*msg, ":");
	if (!ptr)
		return msg;

	data = g_string_new(NULL);
	g_string_append(data, ptr + 1);

	if (!*msg++)
		return msg;

	for (; *msg; msg++) {
		if (!strlen(*msg))
			break;
		if (!g_ascii_isspace(**msg))
			break;
		g_string_append(data, g_strchug(*msg));
	}

	obj = json_object_new_object();
	json_object_object_add(obj, "mimetype", json_object_new_string("image/jpeg"));
	json_object_object_add(obj, "data", json_object_new_string(data->str));
	json_object_object_add(resp, "photo", obj);

	g_string_free(data, TRUE);

	return msg;
}

static int tag_index(gchar *msg)
{
	gchar *ptr;
	int i;

	for (i = 0; i < VC_FIELD_COUNT; i++) {
		if (!g_str_has_prefix(msg, VC_PREFIXES[i]))
			continue;

		ptr = vc_strstr(msg, VC_PREFIXES[i]);
		if (*ptr == ':' || *ptr == ';')
			return i;

		break;
	}

	return -EINVAL;
}

static void process_vcard(json_object *resp, gchar **start, gchar **end)
{
	json_object *vcard = json_object_new_object();
	json_object *phone = NULL;
	gboolean history = FALSE;

	for (; start != end; start++) {
		int idx = tag_index(*start);

		switch (idx) {
		case VC_FORMATTED_NAME:
			add_fn(vcard, *start);
			break;
		case VC_TELEPHONE:
			if (!phone)
				phone = json_object_new_array();
			add_phone(phone, *start);
			break;
		case VC_DATETIME:
			history = TRUE;
			add_datetime(vcard, *start);
			break;
		case VC_PHOTO:
			start = extract_photo(vcard, start);
			break;
		default:
			continue;
		}
	}

	if (phone) {
		if (!json_object_array_length(phone)) {
			// No phone numbers, so discard
			json_object_put(phone);
			json_object_put(vcard);
			return;
		}

		if (!history)
			json_object_object_add(vcard, "telephone", phone);
		else {
			json_object *number = json_object_array_get_idx(phone, 0);

			json_object_object_foreach(number, unused, val) {
				json_object_object_add(vcard, "telephone", val);
				(void) unused;
			}
		}
	}
	json_object_array_add(resp, vcard);
}

json_object *parse_vcards(const char *message)
{
	gchar **lines, **tmp, **ptr = NULL;
	json_object *resp;

	if (!message || !strlen(message))
		return NULL;

	resp = json_object_new_array();
	lines = g_strsplit(message, CRLF, -1);

	for (tmp = lines; *tmp; tmp++) {
		// BEGIN:VCARD
		if (!g_strcmp0(*tmp, "BEGIN:VCARD")) {
			ptr = tmp + 1;
			continue;
		}

		if (!ptr)
			continue;

		// VERSION should be the line after BEGIN:VCARD
		if (tmp == ptr && g_strcmp0(*tmp, "VERSION:" SUPPORTED_VERSION)) {
			ptr = NULL;
			continue;
		}

		// END:VCARD
		if (!g_strcmp0(*tmp, "END:VCARD")) {
			process_vcard(resp, ptr, tmp);
			ptr = NULL;
		}
	}

	g_strfreev(lines);

	return resp;
}