diff --git a/lib/util_topic.c b/lib/util_topic.c index 45a2d311..18fbceb1 100644 --- a/lib/util_topic.c +++ b/lib/util_topic.c @@ -179,7 +179,7 @@ int mosquitto_topic_matches_sub2(const char *sub, size_t sublen, const char *top if(topic[tpos] == '+' || topic[tpos] == '#'){ return MOSQ_ERR_INVAL; } - if(sub[spos] != topic[tpos]){ + if(tpos == topiclen || sub[spos] != topic[tpos]){ /* Check for wildcard matches */ if(sub[spos] == '+'){ /* Check for bad "+foo" or "a/+foo" subscription */ if(spos > 0 && sub[spos-1] != '/'){ @@ -198,10 +198,11 @@ int mosquitto_topic_matches_sub2(const char *sub, size_t sublen, const char *top return MOSQ_ERR_SUCCESS; } }else if(sub[spos] == '#'){ + /* Check for bad "foo#" subscription */ if(spos > 0 && sub[spos-1] != '/'){ return MOSQ_ERR_INVAL; } - multilevel_wildcard = true; + /* Check for # not the final character of the sub, e.g. "#foo" */ if(spos+1 != sublen){ return MOSQ_ERR_INVAL; }else{ @@ -221,9 +222,19 @@ int mosquitto_topic_matches_sub2(const char *sub, size_t sublen, const char *top multilevel_wildcard = true; return MOSQ_ERR_SUCCESS; } + + /* There is no match at this point, but is the sub invalid? */ + for(int i=spos; i