|
@@ -1,151 +0,0 @@
|
|
|
-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
|