Fixed bug with aqm queues, check nullref queueAtFrontOfList before use, delete NSM connection before return

This commit is contained in:
germanaizek 2022-05-30 13:44:37 +03:00 committed by Sean OMeara
commit eea440cb0c
4 changed files with 55 additions and 48 deletions

View file

@ -626,11 +626,11 @@ void Switch::aqm_enqueue(void *tPtr, const SharedPtr<Network> &network, Packet &
if (nqcb->oldQueues[i]->id == qosBucket) { if (nqcb->oldQueues[i]->id == qosBucket) {
selectedQueue = nqcb->oldQueues[i]; selectedQueue = nqcb->oldQueues[i];
} }
} if (i < nqcb->newQueues.size()) { // search new queues (this would imply not often-used queues) } else if (i < nqcb->newQueues.size()) { // search new queues (this would imply not often-used queues)
if (nqcb->newQueues[i]->id == qosBucket) { if (nqcb->newQueues[i]->id == qosBucket) {
selectedQueue = nqcb->newQueues[i]; selectedQueue = nqcb->newQueues[i];
} }
} if (i < nqcb->inactiveQueues.size()) { // search inactive queues } else if (i < nqcb->inactiveQueues.size()) { // search inactive queues
if (nqcb->inactiveQueues[i]->id == qosBucket) { if (nqcb->inactiveQueues[i]->id == qosBucket) {
selectedQueue = nqcb->inactiveQueues[i]; selectedQueue = nqcb->inactiveQueues[i];
// move queue to end of NEW queue list // move queue to end of NEW queue list
@ -663,12 +663,12 @@ void Switch::aqm_enqueue(void *tPtr, const SharedPtr<Network> &network, Packet &
maxQueueLength = nqcb->oldQueues[i]->byteLength; maxQueueLength = nqcb->oldQueues[i]->byteLength;
selectedQueueToDropFrom = nqcb->oldQueues[i]; selectedQueueToDropFrom = nqcb->oldQueues[i];
} }
} if (i < nqcb->newQueues.size()) { } else if (i < nqcb->newQueues.size()) {
if (nqcb->newQueues[i]->byteLength > maxQueueLength) { if (nqcb->newQueues[i]->byteLength > maxQueueLength) {
maxQueueLength = nqcb->newQueues[i]->byteLength; maxQueueLength = nqcb->newQueues[i]->byteLength;
selectedQueueToDropFrom = nqcb->newQueues[i]; selectedQueueToDropFrom = nqcb->newQueues[i];
} }
} if (i < nqcb->inactiveQueues.size()) { } else if (i < nqcb->inactiveQueues.size()) {
if (nqcb->inactiveQueues[i]->byteLength > maxQueueLength) { if (nqcb->inactiveQueues[i]->byteLength > maxQueueLength) {
maxQueueLength = nqcb->inactiveQueues[i]->byteLength; maxQueueLength = nqcb->inactiveQueues[i]->byteLength;
selectedQueueToDropFrom = nqcb->inactiveQueues[i]; selectedQueueToDropFrom = nqcb->inactiveQueues[i];
@ -770,13 +770,15 @@ void Switch::aqm_dequeue(void *tPtr)
bool examiningNewQueues = true; bool examiningNewQueues = true;
while (currQueues->size()) { while (currQueues->size()) {
ManagedQueue *queueAtFrontOfList = currQueues->front(); ManagedQueue *queueAtFrontOfList = currQueues->front();
if (queueAtFrontOfList) {
if (queueAtFrontOfList->byteCredit < 0) { if (queueAtFrontOfList->byteCredit < 0) {
queueAtFrontOfList->byteCredit += ZT_AQM_QUANTUM; queueAtFrontOfList->byteCredit += ZT_AQM_QUANTUM;
// Move to list of OLD queues // Move to list of OLD queues
// DEBUG_INFO("moving q=%p from NEW to OLD list", queueAtFrontOfList); // DEBUG_INFO("moving q=%p from NEW to OLD list", queueAtFrontOfList);
oldQueues->push_back(queueAtFrontOfList); oldQueues->push_back(queueAtFrontOfList);
currQueues->erase(currQueues->begin()); currQueues->erase(currQueues->begin());
} else { }
else {
entryToEmit = CoDelDequeue(queueAtFrontOfList, examiningNewQueues, now); entryToEmit = CoDelDequeue(queueAtFrontOfList, examiningNewQueues, now);
if (! entryToEmit) { if (! entryToEmit) {
// Move to end of list of OLD queues // Move to end of list of OLD queues
@ -793,23 +795,25 @@ void Switch::aqm_dequeue(void *tPtr)
send(tPtr, entryToEmit->packet, entryToEmit->encrypt, entryToEmit->flowId); send(tPtr, entryToEmit->packet, entryToEmit->encrypt, entryToEmit->flowId);
(*nqcb).second->_currEnqueuedPackets--; (*nqcb).second->_currEnqueuedPackets--;
} }
if (queueAtFrontOfList) {
// DEBUG_INFO("dequeuing from q=%p, len=%lu in NEW list (byteCredit=%d)", queueAtFrontOfList, queueAtFrontOfList->q.size(), queueAtFrontOfList->byteCredit); // DEBUG_INFO("dequeuing from q=%p, len=%lu in NEW list (byteCredit=%d)", queueAtFrontOfList, queueAtFrontOfList->q.size(), queueAtFrontOfList->byteCredit);
}
break; break;
} }
} }
}
// Attempt dequeue from queues in OLD list // Attempt dequeue from queues in OLD list
examiningNewQueues = false; examiningNewQueues = false;
currQueues = &((*nqcb).second->oldQueues); currQueues = &((*nqcb).second->oldQueues);
while (currQueues->size()) { while (currQueues->size()) {
ManagedQueue *queueAtFrontOfList = currQueues->front(); ManagedQueue *queueAtFrontOfList = currQueues->front();
if (queueAtFrontOfList) {
if (queueAtFrontOfList->byteCredit < 0) { if (queueAtFrontOfList->byteCredit < 0) {
queueAtFrontOfList->byteCredit += ZT_AQM_QUANTUM; queueAtFrontOfList->byteCredit += ZT_AQM_QUANTUM;
oldQueues->push_back(queueAtFrontOfList); oldQueues->push_back(queueAtFrontOfList);
currQueues->erase(currQueues->begin()); currQueues->erase(currQueues->begin());
} else { }
else {
entryToEmit = CoDelDequeue(queueAtFrontOfList, examiningNewQueues, now); entryToEmit = CoDelDequeue(queueAtFrontOfList, examiningNewQueues, now);
if (! entryToEmit) { if (! entryToEmit) {
// DEBUG_INFO("moving q=%p from OLD to INACTIVE list", queueAtFrontOfList); // DEBUG_INFO("moving q=%p from OLD to INACTIVE list", queueAtFrontOfList);
@ -825,12 +829,12 @@ void Switch::aqm_dequeue(void *tPtr)
send(tPtr, entryToEmit->packet, entryToEmit->encrypt, entryToEmit->flowId); send(tPtr, entryToEmit->packet, entryToEmit->encrypt, entryToEmit->flowId);
(*nqcb).second->_currEnqueuedPackets--; (*nqcb).second->_currEnqueuedPackets--;
} }
if (queueAtFrontOfList) {
// DEBUG_INFO("dequeuing from q=%p, len=%lu in OLD list (byteCredit=%d)", queueAtFrontOfList, queueAtFrontOfList->q.size(), queueAtFrontOfList->byteCredit); // DEBUG_INFO("dequeuing from q=%p, len=%lu in OLD list (byteCredit=%d)", queueAtFrontOfList, queueAtFrontOfList->q.size(), queueAtFrontOfList->byteCredit);
}
break; break;
} }
} }
}
nqcb++; nqcb++;
_aqm_m.unlock(); _aqm_m.unlock();
} }

View file

@ -1955,8 +1955,10 @@ static BOOL IsCurrentUserLocalAdministrator(void)
if (!SetSecurityDescriptorDacl(psdAdmin, TRUE, pACL, FALSE)) if (!SetSecurityDescriptorDacl(psdAdmin, TRUE, pACL, FALSE))
__leave; __leave;
SetSecurityDescriptorGroup(psdAdmin, psidAdmin, FALSE); if (!SetSecurityDescriptorGroup(psdAdmin, psidAdmin, FALSE))
SetSecurityDescriptorOwner(psdAdmin, psidAdmin, FALSE); __leave;
if (!SetSecurityDescriptorOwner(psdAdmin, psidAdmin, FALSE))
__leave;
if (!IsValidSecurityDescriptor(psdAdmin)) if (!IsValidSecurityDescriptor(psdAdmin))
__leave; __leave;

View file

@ -828,6 +828,7 @@ void WindowsEthernetTap::setFriendlyName(const char *dn)
hr = nsm->get_EnumEveryConnection(&nsecc); hr = nsm->get_EnumEveryConnection(&nsecc);
if (!nsecc) { if (!nsecc) {
fprintf(stderr, "Failed to get NSM connections"); fprintf(stderr, "Failed to get NSM connections");
delete nsm;
return; return;
} }

View file

@ -2039,7 +2039,7 @@ public:
fprintf(stderr, "error: custom policy (%s) is invalid, unknown base policy (%s).\n", fprintf(stderr, "error: custom policy (%s) is invalid, unknown base policy (%s).\n",
customPolicyStr.c_str(), basePolicyStr.c_str()); customPolicyStr.c_str(), basePolicyStr.c_str());
continue; continue;
} if (_node->bondController()->getPolicyCodeByStr(customPolicyStr) != ZT_BOND_POLICY_NONE) { } else if (_node->bondController()->getPolicyCodeByStr(customPolicyStr) != ZT_BOND_POLICY_NONE) {
fprintf(stderr, "error: custom policy (%s) will be ignored, cannot use standard policy names for custom policies.\n", fprintf(stderr, "error: custom policy (%s) will be ignored, cannot use standard policy names for custom policies.\n",
customPolicyStr.c_str()); customPolicyStr.c_str());
continue; continue;