ell-key-crypto kernel branch updated for v4.9
by Mat Martineau
Hello -
There's an updated ell-key-crypto branch on git.kernel.org:
https://git.kernel.org/cgit/linux/kernel/git/martineau/linux.git/
This is based on v4.9-rc5 of the kernel and includes:
* My keyctl restricted keyring patch set
* linux-fs/keys-blacklist (as a basis for upstreaming)
* linux-fs/keys-next (for keyctl crypto ops)
* A revert commit for an AF_ALG hash commit that caused a kernel crash
when ELL's unit/test-checksum was run
The nl80211 patches I had been carrying for iwd are part of v4.9.
The previous v4.8 key crypto kernel is tagged as ell-key-crypto-48
Relative to my Fedora 24 kernel 4.8 config, the following commands will
enable the required config options:
$ cp /boot/config-<recent kernel-version> .config
$ scripts/config --enable CONFIG_PKCS8_PRIVATE_KEY_PARSER
$ make olddefconfig
--
Mat Martineau
Intel OTC
5 years, 6 months
[PATCH 1/2] tls: Fix CA certificate presence check
by Andrew Zaborowski
---
ell/tls.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/ell/tls.c b/ell/tls.c
index 3879b50..388efa7 100644
--- a/ell/tls.c
+++ b/ell/tls.c
@@ -1474,7 +1474,7 @@ static void tls_handle_certificate(struct l_tls *tls,
* against our CA if we have any.
*/
- if (ca_cert) {
+ if (tls->ca_cert_path) {
ca_cert = tls_cert_load_file(tls->ca_cert_path);
if (!ca_cert) {
tls_disconnect(tls, TLS_ALERT_INTERNAL_ERROR,
--
2.7.4
5 years, 6 months
[PATCH] dbus: Don't send replies to messages with no reply flag
by Andrew Zaborowski
Kdbus doesn't store the cookies for messages that have the no reply flag
and throws error when a reply is sent with reply_cookie that it doesn't
know. It's not fatal, but we save some cycles by not sending the message
with both dbus versions.
We mark those replies with reply_serial == 0, rather than setting a
"discard" flag on the message, because the method call's serial is
effectively an invalid reply_serial value.
---
ell/dbus-message.c | 10 +++++++---
ell/dbus.c | 10 ++++++++++
2 files changed, 17 insertions(+), 3 deletions(-)
diff --git a/ell/dbus-message.c b/ell/dbus-message.c
index 072a902..3b44fb8 100644
--- a/ell/dbus-message.c
+++ b/ell/dbus-message.c
@@ -326,7 +326,8 @@ LIB_EXPORT struct l_dbus_message *l_dbus_message_new_method_return(
DBUS_MESSAGE_FLAG_NO_REPLY_EXPECTED,
hdr->version);
- message->reply_serial = _dbus_message_get_serial(method_call);
+ if (!l_dbus_message_get_no_reply(method_call))
+ message->reply_serial = _dbus_message_get_serial(method_call);
sender = l_dbus_message_get_sender(method_call);
if (sender)
@@ -369,11 +370,14 @@ LIB_EXPORT struct l_dbus_message *l_dbus_message_new_error_valist(
{
char str[1024];
struct dbus_header *hdr = method_call->header;
+ uint32_t reply_serial = 0;
vsnprintf(str, sizeof(str), format, args);
- return _dbus_message_new_error(hdr->version,
- _dbus_message_get_serial(method_call),
+ if (!l_dbus_message_get_no_reply(method_call))
+ reply_serial = _dbus_message_get_serial(method_call);
+
+ return _dbus_message_new_error(hdr->version, reply_serial,
l_dbus_message_get_sender(method_call),
name, str);
}
diff --git a/ell/dbus.c b/ell/dbus.c
index 236c35a..2c04ec9 100644
--- a/ell/dbus.c
+++ b/ell/dbus.c
@@ -313,6 +313,16 @@ static uint32_t send_message(struct l_dbus *dbus, bool priority,
void *user_data, l_dbus_destroy_func_t destroy)
{
struct message_callback *callback;
+ enum dbus_message_type type;
+
+ type = _dbus_message_get_type(message);
+
+ if ((type == DBUS_MESSAGE_TYPE_METHOD_RETURN ||
+ type == DBUS_MESSAGE_TYPE_ERROR) &&
+ _dbus_message_get_reply_serial(message) == 0) {
+ l_dbus_message_unref(message);
+ return 0;
+ }
callback = l_new(struct message_callback, 1);
--
2.7.4
5 years, 6 months
[PATCH 1/2] dbus: Fix disconnect watch with unique bus names
by Andrew Zaborowski
Make the dbus-name-cache, service watches and disconnect watches work
with unique bus names. Problem spotted by Daniel Wagner and culprit
pointed out by Denis Kenzior.
---
ell/dbus-name-cache.c | 3 ---
1 file changed, 3 deletions(-)
diff --git a/ell/dbus-name-cache.c b/ell/dbus-name-cache.c
index 0c2e08e..cb6a516 100644
--- a/ell/dbus-name-cache.c
+++ b/ell/dbus-name-cache.c
@@ -178,9 +178,6 @@ void _dbus_name_cache_notify(struct _dbus_name_cache *cache,
if (!cache)
return;
- if (_dbus_parse_unique_name(name, NULL))
- return;
-
entry = l_hashmap_lookup(cache->names, name);
if (!entry)
--
2.7.4
5 years, 6 months
[PATCH 1/5] string: Add l_string_unwrap and simplify l_string_free
by Mat Martineau
This removes the "free a string object but return the internal data"
functionality of l_string_free. The option to not free everything was a
source of confusion.
l_string_unwrap is the same as the old l_string_free(ptr, false).
---
ell/dbus-filter.c | 4 ++--
ell/dbus-service.c | 2 +-
ell/dbus-util.c | 4 ++--
ell/gvariant-util.c | 4 ++--
ell/key.c | 2 +-
ell/settings.c | 2 +-
ell/string.c | 32 +++++++++++++++++++++-----------
ell/string.h | 3 ++-
8 files changed, 32 insertions(+), 21 deletions(-)
diff --git a/ell/dbus-filter.c b/ell/dbus-filter.c
index 9e3cad5..0af1b67 100644
--- a/ell/dbus-filter.c
+++ b/ell/dbus-filter.c
@@ -393,7 +393,7 @@ char *_dbus_filter_rule_to_str(const struct _dbus_filter_condition *rule,
rule->type - L_DBUS_MATCH_ARG0);
break;
default:
- l_string_free(str, true);
+ l_string_free(str);
return NULL;
}
@@ -417,5 +417,5 @@ char *_dbus_filter_rule_to_str(const struct _dbus_filter_condition *rule,
l_string_append_c(str, ',');
}
- return l_string_free(str, false);
+ return l_string_unwrap(str);
}
diff --git a/ell/dbus-service.c b/ell/dbus-service.c
index 98f6e7a..8bc9244 100644
--- a/ell/dbus-service.c
+++ b/ell/dbus-service.c
@@ -1600,7 +1600,7 @@ bool _dbus_object_tree_dispatch(struct _dbus_object_tree *tree,
buf = l_string_new(0);
_dbus_object_tree_introspect(tree, path, buf);
- xml = l_string_free(buf, false);
+ xml = l_string_unwrap(buf);
reply = l_dbus_message_new_method_return(message);
l_dbus_message_set_arguments(reply, "s", xml);
diff --git a/ell/dbus-util.c b/ell/dbus-util.c
index 1298228..c4e8419 100644
--- a/ell/dbus-util.c
+++ b/ell/dbus-util.c
@@ -901,7 +901,7 @@ void _dbus1_builder_free(struct dbus_builder *builder)
if (unlikely(!builder))
return;
- l_string_free(builder->signature, true);
+ l_string_free(builder->signature);
l_queue_destroy(builder->containers,
(l_queue_destroy_func_t) container_free);
l_free(builder->body);
@@ -1265,7 +1265,7 @@ char *_dbus1_builder_finish(struct dbus_builder *builder,
if (unlikely(l_queue_length(builder->containers) != 1))
return NULL;
- signature = l_string_free(builder->signature, false);
+ signature = l_string_unwrap(builder->signature);
builder->signature = NULL;
*body = builder->body;
diff --git a/ell/gvariant-util.c b/ell/gvariant-util.c
index 2172ad9..e6f70ad 100644
--- a/ell/gvariant-util.c
+++ b/ell/gvariant-util.c
@@ -918,7 +918,7 @@ void _gvariant_builder_free(struct dbus_builder *builder)
if (unlikely(!builder))
return;
- l_string_free(builder->signature, true);
+ l_string_free(builder->signature);
l_queue_destroy(builder->containers,
(l_queue_destroy_func_t) container_free);
l_free(builder->body);
@@ -1319,7 +1319,7 @@ char *_gvariant_builder_finish(struct dbus_builder *builder,
root = l_queue_peek_head(builder->containers);
- signature = l_string_free(builder->signature, false);
+ signature = l_string_unwrap(builder->signature);
builder->signature = NULL;
if (_gvariant_is_fixed_size(signature)) {
diff --git a/ell/key.c b/ell/key.c
index 370b3c8..11700e8 100644
--- a/ell/key.c
+++ b/ell/key.c
@@ -169,7 +169,7 @@ static char *format_key_info(const char *encoding, const char *hash)
if (hash)
l_string_append_printf(info, "hash=%s", hash);
- return l_string_free(info, false);
+ return l_string_unwrap(info);
}
static long kernel_query_key(int32_t key_serial, const char *encoding,
diff --git a/ell/settings.c b/ell/settings.c
index c6eec35..08ba967 100644
--- a/ell/settings.c
+++ b/ell/settings.c
@@ -427,7 +427,7 @@ LIB_EXPORT char *l_settings_to_data(struct l_settings *settings, size_t *len)
group_entry = group_entry->next;
}
- ret = l_string_free(buf, false);
+ ret = l_string_unwrap(buf);
if (len)
*len = strlen(ret);
diff --git a/ell/string.c b/ell/string.c
index 98e1c46..e6e7140 100644
--- a/ell/string.c
+++ b/ell/string.c
@@ -117,27 +117,37 @@ LIB_EXPORT struct l_string *l_string_new(size_t initial_length)
/**
* l_string_free:
* @string: growable string object
+ *
+ * Free the growable string object and all associated data
+ **/
+LIB_EXPORT void l_string_free(struct l_string *string)
+{
+ if (unlikely(!string))
+ return;
+
+ l_free(string->str);
+ l_free(string);
+}
+
+/**
+ * l_string_unwrap:
+ * @string: growable string object
* @free_data: internal string array
*
- * Free the growable string object. If @free_data #true, then the internal
- * string data will be freed and NULL will be returned. Otherwise the
- * internal string data will be returned to the caller. The caller is
- * responsible for freeing it using l_free().
+ * Free the growable string object and return the internal string data.
+ * The caller is responsible for freeing the string data using l_free(),
+ * and the string object is no longer usable.
*
- * Returns: @string's internal buffer or NULL
+ * Returns: @string's internal buffer
**/
-LIB_EXPORT char *l_string_free(struct l_string *string, bool free_data)
+LIB_EXPORT char *l_string_unwrap(struct l_string *string)
{
char *result;
if (unlikely(!string))
return NULL;
- if (free_data) {
- l_free(string->str);
- result = NULL;
- } else
- result = string->str;
+ result = string->str;
l_free(string);
diff --git a/ell/string.h b/ell/string.h
index a778b31..6549a05 100644
--- a/ell/string.h
+++ b/ell/string.h
@@ -100,7 +100,8 @@ static inline bool __attribute__ ((always_inline))
}
struct l_string *l_string_new(size_t initial_length);
-char *l_string_free(struct l_string *string, bool free_data);
+void l_string_free(struct l_string *string);
+char *l_string_unwrap(struct l_string *string);
struct l_string *l_string_append(struct l_string *dest, const char *src);
struct l_string *l_string_append_c(struct l_string *dest, const char c);
--
2.10.2
5 years, 6 months
[PATCH] settings: Make getters const correct
by Tim Kourt
---
ell/settings.c | 31 ++++++++++++++++---------------
ell/settings.h | 44 ++++++++++++++++++++++++++------------------
2 files changed, 42 insertions(+), 33 deletions(-)
diff --git a/ell/settings.c b/ell/settings.c
index c6eec35..078150a 100644
--- a/ell/settings.c
+++ b/ell/settings.c
@@ -394,7 +394,8 @@ LIB_EXPORT bool l_settings_load_from_data(struct l_settings *settings,
return r;
}
-LIB_EXPORT char *l_settings_to_data(struct l_settings *settings, size_t *len)
+LIB_EXPORT char *l_settings_to_data(const struct l_settings *settings,
+ size_t *len)
{
struct l_string *buf;
char *ret;
@@ -520,7 +521,7 @@ static void gather_groups(void *data, void *user_data)
gather->v[gather->cur++] = l_strdup(group_data->name);
}
-LIB_EXPORT char **l_settings_get_groups(struct l_settings *settings)
+LIB_EXPORT char **l_settings_get_groups(const struct l_settings *settings)
{
char **ret;
struct gather_data gather;
@@ -537,7 +538,7 @@ LIB_EXPORT char **l_settings_get_groups(struct l_settings *settings)
return ret;
}
-LIB_EXPORT bool l_settings_has_group(struct l_settings *settings,
+LIB_EXPORT bool l_settings_has_group(const struct l_settings *settings,
const char *group_name)
{
struct group_data *group;
@@ -566,7 +567,7 @@ static void gather_keys(void *data, void *user_data)
gather->v[gather->cur++] = l_strdup(setting_data->key);
}
-LIB_EXPORT char **l_settings_get_keys(struct l_settings *settings,
+LIB_EXPORT char **l_settings_get_keys(const struct l_settings *settings,
const char *group_name)
{
char **ret;
@@ -589,7 +590,7 @@ LIB_EXPORT char **l_settings_get_keys(struct l_settings *settings,
return ret;
}
-LIB_EXPORT bool l_settings_has_key(struct l_settings *settings,
+LIB_EXPORT bool l_settings_has_key(const struct l_settings *settings,
const char *group_name, const char *key)
{
struct group_data *group;
@@ -607,7 +608,7 @@ LIB_EXPORT bool l_settings_has_key(struct l_settings *settings,
return !!setting;
}
-LIB_EXPORT const char *l_settings_get_value(struct l_settings *settings,
+LIB_EXPORT const char *l_settings_get_value(const struct l_settings *settings,
const char *group_name,
const char *key)
{
@@ -719,7 +720,7 @@ LIB_EXPORT bool l_settings_set_value(struct l_settings *settings,
return set_value(settings, group_name, key, l_strdup(value));
}
-LIB_EXPORT bool l_settings_get_bool(struct l_settings *settings,
+LIB_EXPORT bool l_settings_get_bool(const struct l_settings *settings,
const char *group_name, const char *key,
bool *out)
{
@@ -765,7 +766,7 @@ LIB_EXPORT bool l_settings_set_bool(struct l_settings *settings,
return l_settings_set_value(settings, group_name, key, v);
}
-LIB_EXPORT bool l_settings_get_int(struct l_settings *settings,
+LIB_EXPORT bool l_settings_get_int(const struct l_settings *settings,
const char *group_name,
const char *key, int *out)
{
@@ -812,7 +813,7 @@ LIB_EXPORT bool l_settings_set_int(struct l_settings *settings,
return l_settings_set_value(settings, group_name, key, buf);
}
-LIB_EXPORT bool l_settings_get_uint(struct l_settings *settings,
+LIB_EXPORT bool l_settings_get_uint(const struct l_settings *settings,
const char *group_name, const char *key,
unsigned int *out)
{
@@ -859,7 +860,7 @@ LIB_EXPORT bool l_settings_set_uint(struct l_settings *settings,
return l_settings_set_value(settings, group_name, key, buf);
}
-LIB_EXPORT bool l_settings_get_int64(struct l_settings *settings,
+LIB_EXPORT bool l_settings_get_int64(const struct l_settings *settings,
const char *group_name, const char *key,
int64_t *out)
{
@@ -905,7 +906,7 @@ LIB_EXPORT bool l_settings_set_int64(struct l_settings *settings,
return l_settings_set_value(settings, group_name, key, buf);
}
-LIB_EXPORT bool l_settings_get_uint64(struct l_settings *settings,
+LIB_EXPORT bool l_settings_get_uint64(const struct l_settings *settings,
const char *group_name, const char *key,
uint64_t *out)
{
@@ -951,7 +952,7 @@ LIB_EXPORT bool l_settings_set_uint64(struct l_settings *settings,
return l_settings_set_value(settings, group_name, key, buf);
}
-LIB_EXPORT char *l_settings_get_string(struct l_settings *settings,
+LIB_EXPORT char *l_settings_get_string(const struct l_settings *settings,
const char *group_name, const char *key)
{
const char *value = l_settings_get_value(settings, group_name, key);
@@ -976,7 +977,7 @@ LIB_EXPORT bool l_settings_set_string(struct l_settings *settings,
return set_value(settings, group_name, key, buf);
}
-LIB_EXPORT char **l_settings_get_string_list(struct l_settings *settings,
+LIB_EXPORT char **l_settings_get_string_list(const struct l_settings *settings,
const char *group_name,
const char *key,
const char delimiter)
@@ -1015,7 +1016,7 @@ LIB_EXPORT bool l_settings_set_string_list(struct l_settings *settings,
return set_value(settings, group_name, key, buf);
}
-LIB_EXPORT bool l_settings_get_double(struct l_settings *settings,
+LIB_EXPORT bool l_settings_get_double(const struct l_settings *settings,
const char *group_name, const char *key,
double *out)
{
@@ -1061,7 +1062,7 @@ LIB_EXPORT bool l_settings_set_double(struct l_settings *settings,
return l_settings_set_value(settings, group_name, key, buf);
}
-LIB_EXPORT bool l_settings_get_float(struct l_settings *settings,
+LIB_EXPORT bool l_settings_get_float(const struct l_settings *settings,
const char *group_name, const char *key,
float *out)
{
diff --git a/ell/settings.h b/ell/settings.h
index 718c1d7..0da9f55 100644
--- a/ell/settings.h
+++ b/ell/settings.h
@@ -40,7 +40,7 @@ void l_settings_free(struct l_settings *settings);
bool l_settings_load_from_data(struct l_settings *settings,
const char *data, size_t len);
-char *l_settings_to_data(struct l_settings *settings, size_t *len);
+char *l_settings_to_data(const struct l_settings *settings, size_t *len);
bool l_settings_load_from_file(struct l_settings *settings,
const char *filename);
@@ -50,50 +50,56 @@ bool l_settings_set_debug(struct l_settings *settings,
void *user_data,
l_settings_destroy_cb_t destroy);
-char **l_settings_get_groups(struct l_settings *settings);
-char **l_settings_get_keys(struct l_settings *settings, const char *group_name);
+char **l_settings_get_groups(const struct l_settings *settings);
+char **l_settings_get_keys(const struct l_settings *settings,
+ const char *group_name);
-bool l_settings_has_group(struct l_settings *settings, const char *group_name);
-bool l_settings_has_key(struct l_settings *settings, const char *group_name,
- const char *key);
+bool l_settings_has_group(const struct l_settings *settings,
+ const char *group_name);
+bool l_settings_has_key(const struct l_settings *settings,
+ const char *group_name, const char *key);
-const char *l_settings_get_value(struct l_settings *settings,
+const char *l_settings_get_value(const struct l_settings *settings,
const char *group_name,
const char *key);
bool l_settings_set_value(struct l_settings *settings, const char *group_name,
const char *key, const char *value);
-bool l_settings_get_bool(struct l_settings *settings, const char *group_name,
+bool l_settings_get_bool(const struct l_settings *settings,
+ const char *group_name,
const char *key, bool *out);
bool l_settings_set_bool(struct l_settings *settings, const char *group_name,
const char *key, bool in);
-bool l_settings_get_int(struct l_settings *settings, const char *group_name,
- const char *key, int *out);
+bool l_settings_get_int(const struct l_settings *settings,
+ const char *group_name, const char *key, int *out);
bool l_settings_set_int(struct l_settings *settings, const char *group_name,
const char *key, int in);
-bool l_settings_get_uint(struct l_settings *settings, const char *group_name,
+bool l_settings_get_uint(const struct l_settings *settings,
+ const char *group_name,
const char *key, unsigned int *out);
bool l_settings_set_uint(struct l_settings *settings, const char *group_name,
const char *key, unsigned int in);
-bool l_settings_get_int64(struct l_settings *settings, const char *group_name,
+bool l_settings_get_int64(const struct l_settings *settings,
+ const char *group_name,
const char *key, int64_t *out);
bool l_settings_set_int64(struct l_settings *settings, const char *group_name,
const char *key, int64_t in);
-bool l_settings_get_uint64(struct l_settings *settings, const char *group_name,
+bool l_settings_get_uint64(const struct l_settings *settings,
+ const char *group_name,
const char *key, uint64_t *out);
bool l_settings_set_uint64(struct l_settings *settings, const char *group_name,
const char *key, uint64_t in);
-char *l_settings_get_string(struct l_settings *settings, const char *group_name,
- const char *key);
+char *l_settings_get_string(const struct l_settings *settings,
+ const char *group_name, const char *key);
bool l_settings_set_string(struct l_settings *settings, const char *group_name,
const char *key, const char *value);
-char **l_settings_get_string_list(struct l_settings *settings,
+char **l_settings_get_string_list(const struct l_settings *settings,
const char *group_name,
const char *key, char delimiter);
bool l_settings_set_string_list(struct l_settings *settings,
@@ -101,12 +107,14 @@ bool l_settings_set_string_list(struct l_settings *settings,
const char *key, char **list,
char delimiter);
-bool l_settings_get_double(struct l_settings *settings, const char *group_name,
+bool l_settings_get_double(const struct l_settings *settings,
+ const char *group_name,
const char *key, double *out);
bool l_settings_set_double(struct l_settings *settings, const char *group_name,
const char *key, double in);
-bool l_settings_get_float(struct l_settings *settings, const char *group_name,
+bool l_settings_get_float(const struct l_settings *settings,
+ const char *group_name,
const char *key, float *out);
bool l_settings_set_float(struct l_settings *settings, const char *group_name,
const char *key, float in);
--
2.5.5
5 years, 6 months