net-snmp 3.7.1 → 3.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/.travis.yml CHANGED
@@ -1,7 +1,7 @@
1
1
  language: node_js
2
2
  node_js:
3
- - node
4
3
  - lts/*
4
+ - 14
5
5
  - 12
6
6
  - 10
7
7
  - 8
@@ -40,6 +40,24 @@
40
40
  "1.3.6.1.2.1.1.1.0"
41
41
  ]
42
42
  },
43
+ {
44
+ "type": "node",
45
+ "request": "launch",
46
+ "name": "SNMP community get bulk",
47
+ "skipFiles": [
48
+ "<node_internals>/**"
49
+ ],
50
+ "program": "${workspaceFolder}/example/snmp-get-bulk.js",
51
+ "args": [
52
+ "-v", "2c",
53
+ "-c", "public",
54
+ "-o", "1",
55
+ "-r", "20",
56
+ "127.0.0.1",
57
+ "1.3.6.1.2.1.1.9",
58
+ "1.3.6.1.2.1.2"
59
+ ]
60
+ },
43
61
  {
44
62
  "type": "node",
45
63
  "request": "launch",
package/README.md CHANGED
@@ -315,7 +315,7 @@ Actions
315
315
  - `4 - ECouldNotDecrypt`
316
316
  - `5 - EAuthFailure`
317
317
  - `6 - EReqResOidNoMatch`
318
- - `7 - ENonRepeaterCountMismatch`
318
+ - `7 - (no longer used)
319
319
  - `8 - EOutOfOrder`
320
320
  - `9 - EVersionNoMatch`
321
321
  - `10 - ECommunityNoMatch`
@@ -3207,6 +3207,18 @@ Example programs are included under the module's `example` directory.
3207
3207
 
3208
3208
  * Fix DES decrypt corruption issue
3209
3209
 
3210
+ ## Version 3.7.2 - 05/06/2022
3211
+
3212
+ * Improve getBulk response handling
3213
+
3214
+ ## Version 3.8.0 - 07/06/2022
3215
+
3216
+ * Fix 32-bit unsigned integer writing and add integer range checking
3217
+
3218
+ ## Version 3.8.1 - 07/06/2022
3219
+
3220
+ * Add bit string type to varbind reading
3221
+
3210
3222
  # License
3211
3223
 
3212
3224
  Copyright (c) 2020 Mark Abrahams <mark@abrahams.co.nz>
package/index.js CHANGED
@@ -11,7 +11,10 @@ var crypto = require ("crypto");
11
11
  var mibparser = require ("./lib/mib");
12
12
  var DEBUG = false;
13
13
 
14
- var MAX_INT32 = 2147483647;
14
+ var MIN_SIGNED_INT32 = -2147483648;
15
+ var MAX_SIGNED_INT32 = 2147483647;
16
+ var MIN_UNSIGNED_INT32 = 0;
17
+ var MAX_UNSIGNED_INT32 = 4294967295;
15
18
 
16
19
  function debug (line) {
17
20
  if ( DEBUG ) {
@@ -59,6 +62,7 @@ _expandConstantObject (ErrorStatus);
59
62
  var ObjectType = {
60
63
  1: "Boolean",
61
64
  2: "Integer",
65
+ 3: "BitString",
62
66
  4: "OctetString",
63
67
  5: "Null",
64
68
  6: "OID",
@@ -265,7 +269,7 @@ var ResponseInvalidCode = {
265
269
  4: "ECouldNotDecrypt",
266
270
  5: "EAuthFailure",
267
271
  6: "EReqResOidNoMatch",
268
- 7: "ENonRepeaterCountMismatch",
272
+ // 7: "ENonRepeaterCountMismatch", // no longer used
269
273
  8: "EOutOfOrder",
270
274
  9: "EVersionNoMatch",
271
275
  10: "ECommunityNoMatch",
@@ -378,71 +382,26 @@ function oidInSubtree (oidString, nextString) {
378
382
  return true;
379
383
  }
380
384
 
381
- /**
382
- ** Some SNMP agents produce integers on the wire such as 00 ff ff ff ff.
383
- ** The ASN.1 BER parser we use throws an error when parsing this, which we
384
- ** believe is correct. So, we decided not to bother the "asn1" developer(s)
385
- ** with this, instead opting to work around it here.
386
- **
387
- ** If an integer is 5 bytes in length we check if the first byte is 0, and if so
388
- ** simply drop it and parse it like it was a 4 byte integer, otherwise throw
389
- ** an error since the integer is too large.
390
- **/
391
-
392
- function readInt (buffer) {
393
- return readUint (buffer, true);
394
- }
395
-
396
- function readIpAddress (buffer) {
397
- var bytes = buffer.readString (ObjectType.IpAddress, true);
398
- if (bytes.length != 4)
399
- throw new ResponseInvalidError ("Length '" + bytes.length
400
- + "' of IP address '" + bytes.toString ("hex")
401
- + "' is not 4", ResponseInvalidCode.EIp4AddressSize);
402
- var value = bytes[0] + "." + bytes[1] + "." + bytes[2] + "." + bytes[3];
403
- return value;
404
- }
405
-
406
- function readUint (buffer, isSigned) {
407
- buffer.readByte ();
408
- var length = buffer.readByte ();
409
- var value = 0;
410
- var signedBitSet = false;
411
-
412
- // Handle BER long-form length encoding
413
- if ((length & 0x80) == 0x80) {
414
- var lengthOctets = (length & 0x7f);
415
- length = 0;
416
- for (var lengthOctet = 0; lengthOctet < lengthOctets; lengthOctet++) {
417
- length *= 256;
418
- length += buffer.readByte ();
419
- }
385
+ function readInt32 (buffer) {
386
+ var parsedInt = buffer.readInt ();
387
+ if ( ! Number.isInteger(parsedInt) ) {
388
+ throw new TypeError('Value read as integer ' + parsedInt + ' is not an integer');
420
389
  }
421
-
422
- if (length > 5) {
423
- throw new RangeError ("Integer too long '" + length + "'");
424
- } else if (length == 5) {
425
- if (buffer.readByte () !== 0)
426
- throw new RangeError ("Integer too long '" + length + "'");
427
- length = 4;
390
+ if ( parsedInt < MIN_SIGNED_INT32 || parsedInt > MAX_SIGNED_INT32 ) {
391
+ throw new RangeError('Read integer ' + parsedInt + ' is outside the signed 32-bit range');
428
392
  }
393
+ return parsedInt;
394
+ }
429
395
 
430
- for (var i = 0; i < length; i++) {
431
- value *= 256;
432
- value += buffer.readByte ();
433
-
434
- if (isSigned && i <= 0) {
435
- if ((value & 0x80) == 0x80) {
436
- signedBitSet = true;
437
- }
438
- }
396
+ function readUint32 (buffer) {
397
+ var parsedInt = buffer.readInt ();
398
+ if ( ! Number.isInteger(parsedInt) ) {
399
+ throw new TypeError('Value read as integer ' + parsedInt + ' is not an integer');
439
400
  }
440
-
441
- if (signedBitSet) {
442
- value -= 2 ** (i * 8);
401
+ if ( parsedInt < MIN_UNSIGNED_INT32 || parsedInt > MAX_UNSIGNED_INT32 ) {
402
+ throw new RangeError('Read integer ' + parsedInt + ' is outside the unsigned 32-bit range');
443
403
  }
444
-
445
- return value;
404
+ return parsedInt;
446
405
  }
447
406
 
448
407
  function readUint64 (buffer) {
@@ -451,12 +410,24 @@ function readUint64 (buffer) {
451
410
  return value;
452
411
  }
453
412
 
413
+ function readIpAddress (buffer) {
414
+ var bytes = buffer.readString (ObjectType.IpAddress, true);
415
+ if (bytes.length != 4)
416
+ throw new ResponseInvalidError ("Length '" + bytes.length
417
+ + "' of IP address '" + bytes.toString ("hex")
418
+ + "' is not 4", ResponseInvalidCode.EIp4AddressSize);
419
+ var value = bytes[0] + "." + bytes[1] + "." + bytes[2] + "." + bytes[3];
420
+ return value;
421
+ }
422
+
454
423
  function readVarbindValue (buffer, type) {
455
424
  var value;
456
425
  if (type == ObjectType.Boolean) {
457
426
  value = buffer.readBoolean ();
458
427
  } else if (type == ObjectType.Integer) {
459
- value = readInt (buffer);
428
+ value = readInt32 (buffer);
429
+ } else if (type == ObjectType.BitString) {
430
+ value = buffer.readBitString();
460
431
  } else if (type == ObjectType.OctetString) {
461
432
  value = buffer.readString (null, true);
462
433
  } else if (type == ObjectType.Null) {
@@ -468,11 +439,11 @@ function readVarbindValue (buffer, type) {
468
439
  } else if (type == ObjectType.IpAddress) {
469
440
  value = readIpAddress (buffer);
470
441
  } else if (type == ObjectType.Counter) {
471
- value = readUint (buffer);
442
+ value = readUint32 (buffer);
472
443
  } else if (type == ObjectType.Gauge) {
473
- value = readUint (buffer);
444
+ value = readUint32 (buffer);
474
445
  } else if (type == ObjectType.TimeTicks) {
475
- value = readUint (buffer);
446
+ value = readUint32 (buffer);
476
447
  } else if (type == ObjectType.Opaque) {
477
448
  value = buffer.readString (ObjectType.Opaque, true);
478
449
  } else if (type == ObjectType.Counter64) {
@@ -519,10 +490,24 @@ function readVarbinds (buffer, varbinds) {
519
490
  }
520
491
  }
521
492
 
522
- function writeUint (buffer, type, value) {
523
- var b = Buffer.alloc (4);
524
- b.writeUInt32BE (value, 0);
525
- buffer.writeBuffer (b, type);
493
+ function writeInt32 (buffer, type, value) {
494
+ if ( ! Number.isInteger(value) ) {
495
+ throw new TypeError('Value to write as integer ' + value + ' is not an integer');
496
+ }
497
+ if ( value < MIN_SIGNED_INT32 || value > MAX_SIGNED_INT32 ) {
498
+ throw new RangeError('Integer to write ' + value + ' is outside the signed 32-bit range');
499
+ }
500
+ buffer.writeInt(value, type);
501
+ }
502
+
503
+ function writeUint32 (buffer, type, value) {
504
+ if ( ! Number.isInteger(value) ) {
505
+ throw new TypeError('Value to write as integer ' + value + ' is not an integer');
506
+ }
507
+ if ( value < MIN_UNSIGNED_INT32 || value > MAX_UNSIGNED_INT32 ) {
508
+ throw new RangeError('Integer to write ' + value + ' is outside the unsigned 32-bit range');
509
+ }
510
+ buffer.writeInt(value, type);
526
511
  }
527
512
 
528
513
  function writeUint64 (buffer, value) {
@@ -544,7 +529,7 @@ function writeVarbinds (buffer, varbinds) {
544
529
  buffer.writeBoolean (value ? true : false);
545
530
  break;
546
531
  case ObjectType.Integer: // also Integer32
547
- buffer.writeInt (value);
532
+ writeInt32 (buffer, ObjectType.Integer, value);
548
533
  break;
549
534
  case ObjectType.OctetString:
550
535
  if (typeof value == "string")
@@ -566,13 +551,13 @@ function writeVarbinds (buffer, varbinds) {
566
551
  buffer.writeBuffer (Buffer.from (bytes), 64);
567
552
  break;
568
553
  case ObjectType.Counter: // also Counter32
569
- writeUint (buffer, ObjectType.Counter, value);
554
+ writeUint32 (buffer, ObjectType.Counter, value);
570
555
  break;
571
556
  case ObjectType.Gauge: // also Gauge32 & Unsigned32
572
- writeUint (buffer, ObjectType.Gauge, value);
557
+ writeUint32 (buffer, ObjectType.Gauge, value);
573
558
  break;
574
559
  case ObjectType.TimeTicks:
575
- writeUint (buffer, ObjectType.TimeTicks, value);
560
+ writeUint32 (buffer, ObjectType.TimeTicks, value);
576
561
  break;
577
562
  case ObjectType.Opaque:
578
563
  buffer.writeBuffer (value, ObjectType.Opaque);
@@ -609,11 +594,13 @@ var SimplePdu = function () {
609
594
  SimplePdu.prototype.toBuffer = function (buffer) {
610
595
  buffer.startSequence (this.type);
611
596
 
612
- buffer.writeInt (this.id);
613
- buffer.writeInt ((this.type == PduType.GetBulkRequest)
597
+ writeInt32 (buffer, ObjectType.Integer, this.id);
598
+ writeInt32 (buffer, ObjectType.Integer,
599
+ (this.type == PduType.GetBulkRequest)
614
600
  ? (this.options.nonRepeaters || 0)
615
601
  : 0);
616
- buffer.writeInt ((this.type == PduType.GetBulkRequest)
602
+ writeInt32 (buffer, ObjectType.Integer,
603
+ (this.type == PduType.GetBulkRequest)
617
604
  ? (this.options.maxRepetitions || 0)
618
605
  : 0);
619
606
 
@@ -633,9 +620,9 @@ SimplePdu.prototype.initializeFromBuffer = function (reader) {
633
620
  this.type = reader.peek ();
634
621
  reader.readSequence ();
635
622
 
636
- this.id = reader.readInt ();
637
- this.nonRepeaters = reader.readInt ();
638
- this.maxRepetitions = reader.readInt ();
623
+ this.id = readInt32 (reader);
624
+ this.nonRepeaters = readInt32 (reader);
625
+ this.maxRepetitions = readInt32 (reader);
639
626
 
640
627
  this.varbinds = [];
641
628
  readVarbinds (reader, this.varbinds);
@@ -740,9 +727,9 @@ TrapPdu.prototype.toBuffer = function (buffer) {
740
727
  buffer.writeOID (this.enterprise);
741
728
  buffer.writeBuffer (Buffer.from (this.agentAddr.split (".")),
742
729
  ObjectType.IpAddress);
743
- buffer.writeInt (this.generic);
744
- buffer.writeInt (this.specific);
745
- writeUint (buffer, ObjectType.TimeTicks,
730
+ writeInt32 (buffer, ObjectType.Integer, this.generic);
731
+ writeInt32 (buffer, ObjectType.Integer, this.specific);
732
+ writeUint32 (buffer, ObjectType.TimeTicks,
746
733
  this.upTime || Math.floor (process.uptime () * 100));
747
734
 
748
735
  writeVarbinds (buffer, this.varbinds);
@@ -756,9 +743,9 @@ TrapPdu.createFromBuffer = function (reader) {
756
743
 
757
744
  pdu.enterprise = reader.readOID ();
758
745
  pdu.agentAddr = readIpAddress (reader);
759
- pdu.generic = reader.readInt ();
760
- pdu.specific = reader.readInt ();
761
- pdu.upTime = readUint (reader);
746
+ pdu.generic = readInt32 (reader);
747
+ pdu.specific = readInt32 (reader);
748
+ pdu.upTime = readUint32 (reader);
762
749
 
763
750
  pdu.varbinds = [];
764
751
  readVarbinds (reader, pdu.varbinds);
@@ -811,9 +798,9 @@ var SimpleResponsePdu = function() {
811
798
  SimpleResponsePdu.prototype.toBuffer = function (writer) {
812
799
  writer.startSequence (this.type);
813
800
 
814
- writer.writeInt (this.id);
815
- writer.writeInt (this.errorStatus || 0);
816
- writer.writeInt (this.errorIndex || 0);
801
+ writeInt32 (writer, ObjectType.Integer, this.id);
802
+ writeInt32 (writer, this.errorStatus || 0);
803
+ writeInt32 (writer, ObjectType.Integer, this.errorIndex || 0);
817
804
  writeVarbinds (writer, this.varbinds);
818
805
  writer.endSequence ();
819
806
 
@@ -822,9 +809,9 @@ SimpleResponsePdu.prototype.toBuffer = function (writer) {
822
809
  SimpleResponsePdu.prototype.initializeFromBuffer = function (reader) {
823
810
  reader.readSequence (this.type);
824
811
 
825
- this.id = reader.readInt ();
826
- this.errorStatus = reader.readInt ();
827
- this.errorIndex = reader.readInt ();
812
+ this.id = readInt32 (reader);
813
+ this.errorStatus = readInt32 (reader);
814
+ this.errorIndex = readInt32 (reader);
828
815
 
829
816
  this.varbinds = [];
830
817
  readVarbinds (reader, this.varbinds);
@@ -1335,7 +1322,7 @@ Message.prototype.toBufferCommunity = function () {
1335
1322
 
1336
1323
  writer.startSequence ();
1337
1324
 
1338
- writer.writeInt (this.version);
1325
+ writeInt32 (writer, ObjectType.Integer, this.version);
1339
1326
  writer.writeString (this.community);
1340
1327
 
1341
1328
  this.pdu.toBuffer (writer);
@@ -1380,16 +1367,16 @@ Message.prototype.toBufferV3 = function () {
1380
1367
 
1381
1368
  writer.startSequence ();
1382
1369
 
1383
- writer.writeInt (this.version);
1370
+ writeInt32 (writer, ObjectType.Integer, this.version);
1384
1371
 
1385
1372
  // HeaderData
1386
1373
  writer.startSequence ();
1387
- writer.writeInt (this.msgGlobalData.msgID);
1388
- writer.writeInt (this.msgGlobalData.msgMaxSize);
1374
+ writeInt32 (writer, ObjectType.Integer, this.msgGlobalData.msgID);
1375
+ writeInt32 (writer, ObjectType.Integer, this.msgGlobalData.msgMaxSize);
1389
1376
  writer.writeByte (ber.OctetString);
1390
1377
  writer.writeByte (1);
1391
1378
  writer.writeByte (this.msgGlobalData.msgFlags);
1392
- writer.writeInt (this.msgGlobalData.msgSecurityModel);
1379
+ writeInt32 (writer, ObjectType.Integer, this.msgGlobalData.msgSecurityModel);
1393
1380
  writer.endSequence ();
1394
1381
 
1395
1382
  // msgSecurityParameters
@@ -1402,8 +1389,8 @@ Message.prototype.toBufferV3 = function () {
1402
1389
  } else {
1403
1390
  writer.writeBuffer (this.msgSecurityParameters.msgAuthoritativeEngineID, ber.OctetString);
1404
1391
  }
1405
- writer.writeInt (this.msgSecurityParameters.msgAuthoritativeEngineBoots);
1406
- writer.writeInt (this.msgSecurityParameters.msgAuthoritativeEngineTime);
1392
+ writeInt32 (writer, ObjectType.Integer, this.msgSecurityParameters.msgAuthoritativeEngineBoots);
1393
+ writeInt32 (writer, ObjectType.Integer, this.msgSecurityParameters.msgAuthoritativeEngineTime);
1407
1394
  writer.writeString (this.msgSecurityParameters.msgUserName);
1408
1395
 
1409
1396
  var msgAuthenticationParameters = '';
@@ -1663,7 +1650,7 @@ Message.createFromBuffer = function (buffer, user) {
1663
1650
 
1664
1651
  reader.readSequence ();
1665
1652
 
1666
- message.version = reader.readInt ();
1653
+ message.version = readInt32 (reader);
1667
1654
 
1668
1655
  if (message.version != 3) {
1669
1656
  message.community = reader.readString ();
@@ -1672,18 +1659,18 @@ Message.createFromBuffer = function (buffer, user) {
1672
1659
  // HeaderData
1673
1660
  message.msgGlobalData = {};
1674
1661
  reader.readSequence ();
1675
- message.msgGlobalData.msgID = reader.readInt ();
1676
- message.msgGlobalData.msgMaxSize = reader.readInt ();
1662
+ message.msgGlobalData.msgID = readInt32 (reader);
1663
+ message.msgGlobalData.msgMaxSize = readInt32 (reader);
1677
1664
  message.msgGlobalData.msgFlags = reader.readString (ber.OctetString, true)[0];
1678
- message.msgGlobalData.msgSecurityModel = reader.readInt ();
1665
+ message.msgGlobalData.msgSecurityModel = readInt32 (reader);
1679
1666
 
1680
1667
  // msgSecurityParameters
1681
1668
  message.msgSecurityParameters = {};
1682
1669
  var msgSecurityParametersReader = new ber.Reader (reader.readString (ber.OctetString, true));
1683
1670
  msgSecurityParametersReader.readSequence ();
1684
1671
  message.msgSecurityParameters.msgAuthoritativeEngineID = msgSecurityParametersReader.readString (ber.OctetString, true);
1685
- message.msgSecurityParameters.msgAuthoritativeEngineBoots = msgSecurityParametersReader.readInt ();
1686
- message.msgSecurityParameters.msgAuthoritativeEngineTime = msgSecurityParametersReader.readInt ();
1672
+ message.msgSecurityParameters.msgAuthoritativeEngineBoots = readInt32 (msgSecurityParametersReader);
1673
+ message.msgSecurityParameters.msgAuthoritativeEngineTime = readInt32 (msgSecurityParametersReader);
1687
1674
  message.msgSecurityParameters.msgUserName = msgSecurityParametersReader.readString ();
1688
1675
  message.msgSecurityParameters.msgAuthenticationParameters = msgSecurityParametersReader.readString (ber.OctetString, true);
1689
1676
  message.msgSecurityParameters.msgPrivacyParameters = Buffer.from(msgSecurityParametersReader.readString (ber.OctetString, true));
@@ -1868,6 +1855,7 @@ Session.prototype.get = function (oids, responseCb) {
1868
1855
 
1869
1856
  Session.prototype.getBulk = function () {
1870
1857
  var oids, nonRepeaters, maxRepetitions, responseCb;
1858
+ var reportOidMismatchErrors = this.reportOidMismatchErrors;
1871
1859
  var backwardsGetNexts = this.backwardsGetNexts;
1872
1860
 
1873
1861
  if (arguments.length >= 4) {
@@ -1889,71 +1877,59 @@ Session.prototype.getBulk = function () {
1889
1877
 
1890
1878
  function feedCb (req, message) {
1891
1879
  var pdu = message.pdu;
1880
+ var reqVarbinds = req.message.pdu.varbinds;
1892
1881
  var varbinds = [];
1893
1882
  var i = 0;
1894
1883
 
1895
- // first walk through and grab non-repeaters
1896
- if (pdu.varbinds.length < nonRepeaters) {
1897
- req.responseCb (new ResponseInvalidError ("Varbind count in "
1898
- + "response '" + pdu.varbinds.length + "' is less than "
1899
- + "non-repeaters '" + nonRepeaters + "' in request",
1900
- ResponseInvalidCode.ENonRepeaterCountMismatch));
1901
- return;
1902
- } else {
1903
- for ( ; i < nonRepeaters; i++) {
1904
- if (isVarbindError (pdu.varbinds[i])) {
1905
- varbinds.push (pdu.varbinds[i]);
1906
- } else if (! oidFollowsOid (req.message.pdu.varbinds[i].oid,
1907
- pdu.varbinds[i].oid)) {
1908
- req.responseCb (new ResponseInvalidError ("OID '"
1909
- + req.message.pdu.varbinds[i].oid + "' in request at "
1910
- + "positiion '" + i + "' does not precede "
1911
- + "OID '" + pdu.varbinds[i].oid + "' in response "
1884
+ for ( ; i < reqVarbinds.length && i < pdu.varbinds.length; i++) {
1885
+ if (isVarbindError (pdu.varbinds[i])) {
1886
+ if ( reportOidMismatchErrors && reqVarbinds[i].oid != pdu.varbinds[i].oid ) {
1887
+ req.responseCb (new ResponseInvalidError ("OID '" + reqVarbinds[i].oid
1888
+ + "' in request at position '" + i + "' does not "
1889
+ + "match OID '" + pdu.varbinds[i].oid + "' in response "
1890
+ + "at position '" + i + "'", ResponseInvalidCode.EReqResOidNoMatch));
1891
+ return;
1892
+ }
1893
+ } else {
1894
+ if ( ! backwardsGetNexts && ! oidFollowsOid (reqVarbinds[i].oid, pdu.varbinds[i].oid)) {
1895
+ req.responseCb (new ResponseInvalidError ("OID '" + reqVarbinds[i].oid
1896
+ + "' in request at positiion '" + i + "' does not "
1897
+ + "precede OID '" + pdu.varbinds[i].oid + "' in response "
1912
1898
  + "at position '" + i + "'", ResponseInvalidCode.EOutOfOrder));
1913
1899
  return;
1914
- } else {
1915
- varbinds.push (pdu.varbinds[i]);
1916
1900
  }
1917
1901
  }
1902
+ if (i < nonRepeaters)
1903
+ varbinds.push (pdu.varbinds[i]);
1904
+ else
1905
+ varbinds.push ([pdu.varbinds[i]]);
1918
1906
  }
1919
1907
 
1920
- var repeaters = req.message.pdu.varbinds.length - nonRepeaters;
1908
+ var repeaters = reqVarbinds.length - nonRepeaters;
1921
1909
 
1922
- // secondly walk through and grab repeaters
1923
- if (pdu.varbinds.length % (repeaters)) {
1924
- req.responseCb (new ResponseInvalidError ("Varbind count in "
1925
- + "response '" + pdu.varbinds.length + "' is not a "
1926
- + "multiple of repeaters '" + repeaters
1927
- + "' plus non-repeaters '" + nonRepeaters + "' in request",
1928
- ResponseInvalidCode.ENonRepeaterCountMismatch));
1929
- } else {
1930
- while (i < pdu.varbinds.length) {
1931
- for (var j = 0; j < repeaters; j++, i++) {
1932
- var reqIndex = nonRepeaters + j;
1933
- var respIndex = i;
1934
-
1935
- if (isVarbindError (pdu.varbinds[respIndex])) {
1936
- if (! varbinds[reqIndex])
1937
- varbinds[reqIndex] = [];
1938
- varbinds[reqIndex].push (pdu.varbinds[respIndex]);
1939
- } else if ( ! backwardsGetNexts && ! oidFollowsOid (
1940
- req.message.pdu.varbinds[reqIndex].oid,
1941
- pdu.varbinds[respIndex].oid)) {
1942
- req.responseCb (new ResponseInvalidError ("OID '"
1943
- + req.message.pdu.varbinds[reqIndex].oid
1944
- + "' in request at position '" + (reqIndex)
1945
- + "' does not precede OID '"
1946
- + pdu.varbinds[respIndex].oid
1947
- + "' in response at position '" + (respIndex) + "'",
1948
- ResponseInvalidCode.EOutOfOrder));
1949
- return;
1950
- } else {
1951
- if (! varbinds[reqIndex])
1952
- varbinds[reqIndex] = [];
1953
- varbinds[reqIndex].push (pdu.varbinds[respIndex]);
1954
- }
1910
+ for ( ; i < pdu.varbinds.length; i++) {
1911
+ var reqIndex = (i - nonRepeaters) % repeaters + nonRepeaters;
1912
+ var prevIndex = i - repeaters;
1913
+ var prevOid = pdu.varbinds[prevIndex].oid;
1914
+
1915
+ if (isVarbindError (pdu.varbinds[i])) {
1916
+ if ( reportOidMismatchErrors && prevOid != pdu.varbinds[i].oid ) {
1917
+ req.responseCb (new ResponseInvalidError ("OID '" + prevOid
1918
+ + "' in response at position '" + prevIndex + "' does not "
1919
+ + "match OID '" + pdu.varbinds[i].oid + "' in response "
1920
+ + "at position '" + i + "'", ResponseInvalidCode.EReqResOidNoMatch));
1921
+ return;
1922
+ }
1923
+ } else {
1924
+ if ( ! backwardsGetNexts && ! oidFollowsOid (prevOid, pdu.varbinds[i].oid)) {
1925
+ req.responseCb (new ResponseInvalidError ("OID '" + prevOid
1926
+ + "' in response at positiion '" + prevIndex + "' does not "
1927
+ + "precede OID '" + pdu.varbinds[i].oid + "' in response "
1928
+ + "at position '" + i + "'", ResponseInvalidCode.EOutOfOrder));
1929
+ return;
1955
1930
  }
1956
1931
  }
1932
+ varbinds[reqIndex].push (pdu.varbinds[i]);
1957
1933
  }
1958
1934
 
1959
1935
  req.responseCb (null, varbinds);
@@ -4427,7 +4403,7 @@ Mib.convertOidToAddress = function (oid) {
4427
4403
  throw new RangeError('object identifier component ' +
4428
4404
  address[i] + ' is negative');
4429
4405
  }
4430
- if (n > MAX_INT32) {
4406
+ if (n > MAX_SIGNED_INT32) {
4431
4407
  throw new RangeError('object identifier component ' +
4432
4408
  address[i] + ' is too large');
4433
4409
  }
@@ -6241,8 +6217,8 @@ exports.RequestTimedOutError = RequestTimedOutError;
6241
6217
  ** Added for testing
6242
6218
  **/
6243
6219
  exports.ObjectParser = {
6244
- readInt: readInt,
6245
- readUint: readUint,
6220
+ readInt32: readInt32,
6221
+ readUint32: readUint32,
6246
6222
  readVarbindValue: readVarbindValue
6247
6223
  };
6248
6224
  exports.Authentication = Authentication;
package/package.json CHANGED
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "name": "net-snmp",
3
- "version": "3.7.1",
3
+ "version": "3.8.1",
4
4
  "description": "JavaScript implementation of the Simple Network Management Protocol (SNMP)",
5
5
  "main": "index.js",
6
6
  "directories": {
7
7
  "example": "example"
8
8
  },
9
9
  "dependencies": {
10
- "asn1-ber": "*",
10
+ "asn1-ber": "^1.2.1",
11
11
  "smart-buffer": "^4.1.0"
12
12
  },
13
13
  "devDependencies": {