From a436f17888155f9a3268e650cbf27444397fa585 Mon Sep 17 00:00:00 2001 From: Zaid Abdulla Date: Tue, 31 Oct 2017 12:58:00 -0700 Subject: [PATCH] Replace endless_cycle with more specific faults --- lib/cwmp.coffee | 7 ++++--- lib/session.coffee | 38 +++++++++++++++++++++++++++----------- 2 files changed, 31 insertions(+), 14 deletions(-) diff --git a/lib/cwmp.coffee b/lib/cwmp.coffee index 5dd56e5..c416e36 100644 --- a/lib/cwmp.coffee +++ b/lib/cwmp.coffee @@ -343,12 +343,13 @@ applyPresets = (sessionContext) -> sessionContext.faultsTouched ?= {} sessionContext.faultsTouched[channel] = true - sessionContext.presetCycles = (sessionContext.presetCycles or 0) + 1 + # Don't increment when processing individual channels (e.g. after fault) + sessionContext.presetCycles = (sessionContext.presetCycles or 0) + 1 if not whiteList? if sessionContext.presetCycles > MAX_CYCLES fault = { - code: 'endless_cycle' - message: 'The provision seems to be repeating indefinitely' + code: 'preset_loop' + message: 'The presets are stuck in an endless configuration loop' timestamp: sessionContext.timestamp } recordFault(sessionContext, fault) diff --git a/lib/session.coffee b/lib/session.coffee index 2c3302f..2fc9bea 100644 --- a/lib/session.coffee +++ b/lib/session.coffee @@ -113,7 +113,7 @@ loadParameters = (sessionContext, callback) -> generateRpcId = (sessionContext) -> return sessionContext.timestamp.toString(16) + - sessionContext.cycle.toString(16).slice(-1) + + "0#{sessionContext.cycle.toString(16)}".slice(-2) + "0#{sessionContext.rpcCount.toString(16)}".slice(-2) @@ -641,17 +641,33 @@ rpcRequest = (sessionContext, _declarations, callback) -> return rpcRequest(sessionContext, null, callback) ) - if sessionContext.rpcCount >= 255 or - sessionContext.revisions.length >= 8 or - sessionContext.cycle >= 16 or - sessionContext.iteration >= MAX_ITERATIONS * (sessionContext.cycle + 1) - - fault = { - code: 'endless_cycle' - message: 'The provision seems to be repeating indefinitely' + if sessionContext.rpcCount >= 255 + return callback(null, { + code: 'too_many_rpcs' + message: 'Too many RPC requests' timestamp: sessionContext.timestamp - } - return callback(null, fault) + }) + + if sessionContext.revisions.length >= 8 + return callback(null, { + code: 'deeply_nested_vparams' + message: 'Virtual parameters are referencing other virtual parameters in a deeply nested manner' + timestamp: sessionContext.timestamp + }) + + if sessionContext.cycle >= 255 + return callback(null, { + code: 'too_many_cycles' + message: 'Too many provision cycles' + timestamp: sessionContext.timestamp + }) + + if sessionContext.iteration >= MAX_ITERATIONS * (sessionContext.cycle + 1) + return callback(null, { + code: 'too_many_commits' + message: 'Too many commit iterations' + timestamp: sessionContext.timestamp + }) if (sessionContext.syncState?.virtualParameterDeclarations?.length or 0) < sessionContext.declarations.length inception = sessionContext.syncState?.virtualParameterDeclarations?.length or 0