diff --git a/controller/SqliteNetworkController.cpp b/controller/SqliteNetworkController.cpp index 378d7d5ca..48a55f68a 100644 --- a/controller/SqliteNetworkController.cpp +++ b/controller/SqliteNetworkController.cpp @@ -168,6 +168,15 @@ struct MemberRecord bool activeBridge; uint64_t lastRequestTime; MemberRecentHistory recentHistory; + + MemberRecord() : + rowid(0), + authorized(false), + activeBridge(false), + lastRequestTime(0) + { + nodeId[0] = (char)0; + } }; struct NetworkRecord @@ -182,6 +191,20 @@ struct NetworkRecord uint64_t creationTime; uint64_t revision; uint64_t memberRevisionCounter; + + NetworkRecord() : + name((const char *)0), + flags(0), + isPrivate(true), + enableBroadcast(false), + allowPassiveBridging(false), + multicastLimit(0), + creationTime(0), + revision(0), + memberRevisionCounter(0) + { + id[0] = (char)0; + } }; } // anonymous namespace @@ -469,11 +492,9 @@ NetworkController::ResultCode SqliteNetworkController::doNetworkConfigRequest(co const uint64_t now = OSUtils::now(); NetworkRecord network; - memset(&network,0,sizeof(network)); Utils::snprintf(network.id,sizeof(network.id),"%.16llx",(unsigned long long)nwid); MemberRecord member; - memset(&member,0,sizeof(member)); Utils::snprintf(member.nodeId,sizeof(member.nodeId),"%.10llx",(unsigned long long)identity.address().toInt()); { // begin lock @@ -567,41 +588,38 @@ NetworkController::ResultCode SqliteNetworkController::doNetworkConfigRequest(co } // Update Member.history + { - std::string fastr; - if (fromAddr) { - fastr.push_back('"'); - fastr.append(_jsonEscape(fromAddr.toString())); - fastr.push_back('"'); - } - char mh[4096]; + char mh[1024]; Utils::snprintf(mh,sizeof(mh), - "{" - "\"ts\":%llu," - "\"authorized\":%s," - "\"clientMajorVersion\":%u," - "\"clientMinorVersion\":%u," - "\"clientRevision\":%u," - "\"fromAddr\":%s" - "}", + "{\"ts\":%llu,\"authorized\":%s,\"clientMajorVersion\":%u,\"clientMinorVersion\":%u,\"clientRevision\":%u,\"fromAddr\":", (unsigned long long)now, - (member.authorized) ? "true" : "false", + ((member.authorized) ? "true" : "false"), metaData.getUI(ZT_NETWORKCONFIG_REQUEST_METADATA_KEY_NODE_MAJOR_VERSION,0), metaData.getUI(ZT_NETWORKCONFIG_REQUEST_METADATA_KEY_NODE_MINOR_VERSION,0), - metaData.getUI(ZT_NETWORKCONFIG_REQUEST_METADATA_KEY_NODE_REVISION,0), - (fastr.length() > 0) ? fastr.c_str() : "null"); + metaData.getUI(ZT_NETWORKCONFIG_REQUEST_METADATA_KEY_NODE_REVISION,0)); member.recentHistory.push_front(std::string(mh)); + if (fromAddr) { + member.recentHistory.front().push_back('"'); + member.recentHistory.front().append(_jsonEscape(fromAddr.toString())); + member.recentHistory.front().append("\"}"); + } else { + member.recentHistory.front().append("null}"); + } while (member.recentHistory.size() > ZT_NETCONF_DB_MEMBER_HISTORY_LENGTH) member.recentHistory.pop_back(); std::string rhblob(member.recentHistory.toBlob()); sqlite3_reset(_sUpdateMemberHistory); - sqlite3_bind_int64(_sUpdateMemberHistory,1,(int64_t)now); - sqlite3_bind_blob(_sUpdateMemberHistory,2,(const void *)rhblob.data(),rhblob.length(),SQLITE_STATIC); + sqlite3_bind_int64(_sUpdateMemberHistory,1,(sqlite3_int64)now); + sqlite3_bind_blob(_sUpdateMemberHistory,2,(const void *)rhblob.data(),(int)rhblob.length(),SQLITE_STATIC); sqlite3_bind_int64(_sUpdateMemberHistory,3,member.rowid); - sqlite3_step(_sUpdateMemberHistory); + if (sqlite3_step(_sUpdateMemberHistory) != SQLITE_DONE) { + printf("!!! %s\n",sqlite3_errmsg(_db)); + } } - // Don't proceed if member is not authorized + // Don't proceed if member is not authorized! --------------------------- + if (!member.authorized) return NetworkController::NETCONF_QUERY_ACCESS_DENIED;