| From 67fe32672b60afd6cf91f7a3ccc969259dc68a19 Mon Sep 17 00:00:00 2001 |
| From: Tatsuzo Osawa <tatsuzo.osawa@gmail.com> |
| Date: Thu, 24 Aug 2017 12:22:33 +0000 |
| Subject: [PATCH] Fix subs memory issue. |
| |
| Patches retrieved from: https://github.com/eclipse/mosquitto/pull/531 |
| |
| Both patches have been merged in a single one as second patch is putting |
| back code that is wrongly deleted in first patch. |
| First patch needs also an update to apply on version 1.5 |
| |
| Signed-off-by: Tatsuzo Osawa <tatsuzo.osawa@gmail.com> |
| Signed-off-by: Fabrice Fontaine <fontaine.fabrice@gmail.com> |
| --- |
| src/database.c | 16 ++++++++++++---- |
| src/mosquitto_broker_internal.h | 4 ++-- |
| src/subs.c | 21 ++++++++++++--------- |
| 3 files changed, 26 insertions(+), 15 deletions(-) |
| |
| diff --git a/src/database.c b/src/database.c |
| index 670cf710..9e02de2d 100644 |
| --- a/src/database.c |
| +++ b/src/database.c |
| @@ -12,6 +12,7 @@ and the Eclipse Distribution License is available at |
| |
| Contributors: |
| Roger Light - initial implementation and documentation. |
| + Tatsuzo Osawa - Fix subs memory issue. |
| */ |
| |
| #include <assert.h> |
| @@ -121,10 +122,10 @@ int db__open(struct mosquitto__config *config, struct mosquitto_db *db) |
| |
| db->subs = NULL; |
| |
| - subhier = sub__add_hier_entry(&db->subs, "", strlen("")); |
| + subhier = sub__add_hier_entry(NULL, &db->subs, "", strlen("")); |
| if(!subhier) return MOSQ_ERR_NOMEM; |
| |
| - subhier = sub__add_hier_entry(&db->subs, "$SYS", strlen("$SYS")); |
| + subhier = sub__add_hier_entry(NULL, &db->subs, "$SYS", strlen("$SYS")); |
| if(!subhier) return MOSQ_ERR_NOMEM; |
| |
| db->unpwd = NULL; |
| diff --git a/src/mosquitto_broker_internal.h b/src/mosquitto_broker_internal.h |
| index 3508c555..808b4f2b 100644 |
| --- a/src/mosquitto_broker_internal.h |
| +++ b/src/mosquitto_broker_internal.h |
| @@ -12,7 +12,7 @@ and the Eclipse Distribution License is available at |
| |
| Contributors: |
| Roger Light - initial implementation and documentation. |
| - Tatsuzo Osawa - Add epoll. |
| + Tatsuzo Osawa - Add epoll. Fix subs memory issue. |
| */ |
| |
| #ifndef MOSQUITTO_BROKER_INTERNAL_H |
| @@ -547,7 +547,7 @@ void sys_tree__update(struct mosquitto_db *db, int interval, time_t start_time); |
| * Subscription functions |
| * ============================================================ */ |
| int sub__add(struct mosquitto_db *db, struct mosquitto *context, const char *sub, int qos, struct mosquitto__subhier **root); |
| -struct mosquitto__subhier *sub__add_hier_entry(struct mosquitto__subhier **parent, const char *topic, size_t len); |
| +struct mosquitto__subhier *sub__add_hier_entry(struct mosquitto__subhier *parent, struct mosquitto__subhier **head, const char *topic, size_t len); |
| int sub__remove(struct mosquitto_db *db, struct mosquitto *context, const char *sub, struct mosquitto__subhier *root); |
| void sub__tree_print(struct mosquitto__subhier *root, int level); |
| int sub__clean_session(struct mosquitto_db *db, struct mosquitto *context); |
| diff --git a/src/subs.c b/src/subs.c |
| index 7b9b457c..b1c0fc78 100644 |
| --- a/src/subs.c |
| +++ b/src/subs.c |
| @@ -12,6 +12,7 @@ and the Eclipse Distribution License is available at |
| |
| Contributors: |
| Roger Light - initial implementation and documentation. |
| + Tatsuzo Osawa - Fix subs memory issue. |
| */ |
| |
| /* A note on matching topic subscriptions. |
| @@ -314,7 +315,7 @@ static int sub__add_recurse(struct mosquitto_db *db, struct mosquitto *context, |
| return sub__add_recurse(db, context, qos, branch, tokens->next); |
| }else{ |
| /* Not found */ |
| - branch = sub__add_hier_entry(&subhier->children, UHPA_ACCESS_TOPIC(tokens), tokens->topic_len+1); |
| + branch = sub__add_hier_entry(subhier, &subhier->children, UHPA_ACCESS_TOPIC(tokens), tokens->topic_len+1); |
| if(!branch) return MOSQ_ERR_NOMEM; |
| |
| return sub__add_recurse(db, context, qos, branch, tokens->next); |
| @@ -406,18 +407,18 @@ static void sub__search(struct mosquitto_db *db, struct mosquitto__subhier *subh |
| } |
| |
| |
| -struct mosquitto__subhier *sub__add_hier_entry(struct mosquitto__subhier **parent, const char *topic, size_t len) |
| +struct mosquitto__subhier *sub__add_hier_entry(struct mosquitto__subhier *parent, struct mosquitto__subhier **head, const char *topic, size_t len) |
| { |
| struct mosquitto__subhier *child; |
| |
| - assert(parent); |
| + assert(head); |
| |
| child = mosquitto__malloc(sizeof(struct mosquitto__subhier)); |
| if(!child){ |
| log__printf(NULL, MOSQ_LOG_ERR, "Error: Out of memory."); |
| return NULL; |
| } |
| - child->parent = *parent; |
| + child->parent = parent; |
| child->topic_len = strlen(topic); |
| if(UHPA_ALLOC_TOPIC(child) == 0){ |
| child->topic_len = 0; |
| @@ -433,13 +434,13 @@ struct mosquitto__subhier *sub__add_hier_entry(struct mosquitto__subhier **paren |
| |
| if(child->topic_len+1 > sizeof(child->topic.array)){ |
| if(child->topic.ptr){ |
| - HASH_ADD_KEYPTR(hh, *parent, child->topic.ptr, child->topic_len, child); |
| + HASH_ADD_KEYPTR(hh, *head, child->topic.ptr, child->topic_len, child); |
| }else{ |
| mosquitto__free(child); |
| return NULL; |
| } |
| }else{ |
| - HASH_ADD(hh, *parent, topic.array, child->topic_len, child); |
| + HASH_ADD(hh, *head, topic.array, child->topic_len, child); |
| } |
| |
| return child; |
| @@ -460,7 +461,7 @@ int sub__add(struct mosquitto_db *db, struct mosquitto *context, const char *sub |
| |
| HASH_FIND(hh, *root, UHPA_ACCESS_TOPIC(tokens), tokens->topic_len, subhier); |
| if(!subhier){ |
| - subhier = sub__add_hier_entry(root, UHPA_ACCESS_TOPIC(tokens), tokens->topic_len+1); |
| + subhier = sub__add_hier_entry(NULL, root, UHPA_ACCESS_TOPIC(tokens), tokens->topic_len+1); |
| if(!subhier){ |
| sub__topic_tokens_free(tokens); |
| log__printf(NULL, MOSQ_LOG_ERR, "Error: Out of memory."); |
| @@ -545,12 +546,14 @@ static struct mosquitto__subhier *tmp_remove_subs(struct mosquitto__subhier *sub |
| return NULL; |
| } |
| |
| - if(sub->children || sub->subs){ |
| + if(sub->children || sub->subs || sub->retained){ |
| return NULL; |
| } |
| |
| parent = sub->parent; |
| - HASH_DELETE(hh, parent, sub); |
| + HASH_DELETE(hh, parent->children, sub); |
| + UHPA_FREE_TOPIC(sub); |
| + mosquitto__free(sub); |
| |
| if(parent->subs == NULL |
| && parent->children == NULL |