From 5da16269d1e533851a764ee05675a51eb7123c3f Mon Sep 17 00:00:00 2001 From: YuriDLL Date: Fri, 7 Mar 2025 13:10:32 +0300 Subject: [PATCH 1/2] fix too short defect in the test --- tests/tests.cpp | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/tests/tests.cpp b/tests/tests.cpp index b482c5a..65aa31a 100644 --- a/tests/tests.cpp +++ b/tests/tests.cpp @@ -61,15 +61,18 @@ TEST_CASE( "Test handle failures when Encoding/Decoding", "[snmp]"){ SECTION( "Should fail to parse a corrupt buffer "){ SNMPPacket* readPacket = new SNMPPacket(); - for(int i = 25; i < 133; i+= 10){ - char old[10] = {0}; - memcpy(old, &buffer[i], 10); - long randomLong = random(); - memcpy(&buffer[i], &randomLong, 10); + uint8_t random_arr[] = {35, 147, 95, 195, 124, 200, 244, 76, 255, 241, 35, 147, 95, 255, 241, 35}; + uint8_t old[sizeof(random_arr)] = {0}; + for(int i = 25; i < 133; i+= sizeof(random_arr)){ + memcpy(old, &buffer[i], sizeof(random_arr)); + + memcpy(&buffer[i], &random_arr, sizeof(random_arr)); + // This may SOMETIMES fail if the random gets lucky and makes something valid + INFO("The number is " << i); REQUIRE( readPacket->parseFrom(buffer, 200) != SNMP_ERROR_OK ); - memcpy(&buffer[i], old, 10); + memcpy(&buffer[i], old, sizeof(random_arr)); REQUIRE( readPacket->parseFrom(buffer, 200) == SNMP_ERROR_OK ); } } From 2dc55303b495d21cca716addf26a7f8b5a33a085 Mon Sep 17 00:00:00 2001 From: YuriDLL Date: Fri, 7 Mar 2025 18:08:12 +0300 Subject: [PATCH 2/2] add handle IPAddress set/get --- src/BERDecode.cpp | 8 +------- src/SNMP_Agent.cpp | 4 ++-- tests/tests.cpp | 44 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 47 insertions(+), 9 deletions(-) diff --git a/src/BERDecode.cpp b/src/BERDecode.cpp index 9ecfe28..2c46a72 100644 --- a/src/BERDecode.cpp +++ b/src/BERDecode.cpp @@ -55,14 +55,8 @@ int NetworkAddress::fromBuffer(const uint8_t *buf, size_t max_len){ int i = BER_CONTAINER::fromBuffer(buf, max_len); CHECK_DECODE_ERR(i); const uint8_t* ptr = buf + i; - - // byte tempAddress[4]; - // tempAddress[0] = *ptr++; - // tempAddress[1] = *ptr++; - // tempAddress[2] = *ptr++; - // tempAddress[3] = *ptr++; - _value = IPAddress(ptr); + ptr += 4; return ptr - buf; } diff --git a/src/SNMP_Agent.cpp b/src/SNMP_Agent.cpp index 6b9a627..f8ef2d7 100644 --- a/src/SNMP_Agent.cpp +++ b/src/SNMP_Agent.cpp @@ -190,12 +190,12 @@ ValueCallback* SNMPAgent::addGaugeHandler(const char *oid, uint32_t* value, bool return addHandler(new Gauge32Callback(oidType, value), false); } -ValueCallback* addIPAddressHandler(const char *oid, IPAddress* value, bool isSettable, bool overwritePrefix){ +ValueCallback* SNMPAgent::addIPAddressHandler(const char *oid, IPAddress* value, bool isSettable, bool overwritePrefix){ if(!value) return nullptr; SortableOIDType* oidType = buildOIDWithPrefix(oid, overwritePrefix); if(!oidType) return nullptr; - return addHandler(new NetworkAddressCallback(oidType, value), false); + return addHandler(new NetworkAddressCallback(oidType, value), isSettable); } ValueCallback * SNMPAgent::addHandler(ValueCallback *callback, bool isSettable) { diff --git a/tests/tests.cpp b/tests/tests.cpp index 65aa31a..4be5050 100644 --- a/tests/tests.cpp +++ b/tests/tests.cpp @@ -126,6 +126,29 @@ TEST_CASE( "Test Encoding/Decoding packet", "[snmp]" ) { REQUIRE( std::static_pointer_cast(packet->varbindList[4].value)->_value == -420000 ); } +TEST_CASE( "Test Get IpAdress value", "[snmp]" ) { + std::deque callbacks; + IPAddress ip_addr = IPAddress(1,2,3,4); + ValueCallback* ip_addr_callback = new NetworkAddressCallback(new SortableOIDType(".1.3.6.1.4.1.5.1"), &ip_addr); + callbacks.push_back(ip_addr_callback); + + SNMPPacket* requestPacket = new SNMPPacket(); + requestPacket->setPDUType(GetRequestPDU); + requestPacket->setCommunityString("public"); + requestPacket->setRequestID(random()); + requestPacket->setVersion(SNMP_VERSION_1); + requestPacket->varbindList.push_back(VarBind(std::make_shared(".1.3.6.1.4.1.5.1"), std::make_shared(IPAddress(0,0,0,0)))); + uint8_t buffer[500]; + int requestLength = requestPacket->serialiseInto(buffer, 500); + REQUIRE( requestLength > 0 ); + int responseLength; + REQUIRE( handlePacket(buffer, requestLength, &responseLength, 500, callbacks, (char*)"public", (char*)"private") == SNMP_GET_OCCURRED ); + SNMPPacket* responsePacket = new SNMPPacket(); + REQUIRE( responsePacket->parseFrom(buffer, responseLength) == SNMP_ERROR_OK ); + REQUIRE( responsePacket->varbindList.at(0).type == NETWORK_ADDRESS ); + REQUIRE( std::static_pointer_cast(responsePacket->varbindList.at(0).value)->_value == ip_addr ); +} + TEST_CASE( "Test GetRequestPDU", "[snmp]" ){ std::deque callbacks; @@ -263,6 +286,27 @@ TEST_CASE( "Test SetRequestPDU", "[snmp]" ){ } +TEST_CASE( "Test Set IpAdress value", "[snmp]" ) { + std::deque callbacks; + IPAddress ip_addr = IPAddress(1,2,3,4); + ValueCallback* ip_addr_callback = new NetworkAddressCallback(new SortableOIDType(".1.3.6.1.4.1.5.1"), &ip_addr); + ip_addr_callback->isSettable = true; + callbacks.push_back(ip_addr_callback); + + SNMPPacket* requestPacket = new SNMPPacket(); + requestPacket->setPDUType(SetRequestPDU); + requestPacket->setCommunityString("public"); + requestPacket->setRequestID(random()); + requestPacket->setVersion(SNMP_VERSION_1); + IPAddress set_ip_addr = IPAddress(5,6,7,8); + requestPacket->varbindList.push_back(VarBind(std::make_shared(".1.3.6.1.4.1.5.1"), std::make_shared(set_ip_addr))); + uint8_t buffer[500]; + int requestLength = requestPacket->serialiseInto(buffer, 500); + REQUIRE( requestLength > 0 ); + int responseLength; + REQUIRE( handlePacket(buffer, requestLength, &responseLength, 500, callbacks, (char*)"public", (char*)"public") == SNMP_SET_OCCURRED ); + REQUIRE( ip_addr == set_ip_addr ); +} TEST_CASE( "sort/remove handlers ", "[snmp]"){ std::deque callbacks;