From badf820523730175b27abec7ecb167037e412135 Mon Sep 17 00:00:00 2001
From: John Johnston <john.johnston@aquera.com>
Date: Thu, 29 Jul 2021 08:53:40 -0700
Subject: [PATCH 1/2] fix: modifyDn length fix

---
 lib/messages/moddn_request.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lib/messages/moddn_request.js b/lib/messages/moddn_request.js
index 580e7a0..0f54823 100644
--- a/lib/messages/moddn_request.js
+++ b/lib/messages/moddn_request.js
@@ -60,7 +60,7 @@ ModifyDNRequest.prototype._toBer = function (ber) {
     const len = Buffer.byteLength(s)
 
     ber.writeByte(0x80) // MODIFY_DN_REQUEST_NEW_SUPERIOR_TAG
-    ber.writeByte(len)
+    ber.writeLength(len)
     ber._ensure(len)
     ber._buf.write(s, ber._offset)
     ber._offset += len

From 4c75096c80773ed4ffde69a60b949e8e4250226b Mon Sep 17 00:00:00 2001
From: John Johnston <john.johnston@aquera.com>
Date: Sat, 31 Jul 2021 11:33:43 -0700
Subject: [PATCH 2/2] chore: add 'modify DN excessive superior length' unit
 test

---
 test/client.test.js | 28 ++++++++++++++++++++++++++++
 1 file changed, 28 insertions(+)

diff --git a/test/client.test.js b/test/client.test.js
index 7d27a86..04e4b10 100644
--- a/test/client.test.js
+++ b/test/client.test.js
@@ -694,6 +694,34 @@ tap.test('modify DN excessive length (GH-480)', function (t) {
   })
 })
 
+tap.test('modify DN excessive superior length', function (t) {
+  const { BerReader, BerWriter } = require('asn1')
+  const ModifyDNRequest = require('../lib/messages/moddn_request')
+  const ber = new BerWriter()
+  const entry = 'cn=Test     User,ou=A Long OU                  ,ou=Another Long OU                ,ou=Another Long OU              ,dc=acompany,DC=io'
+  const newSuperior = 'ou=A New Long OU              , ou=Another New Long OU                                   , ou=An OU               , dc=acompany, dc=io'
+  const newRdn = entry.replace(/(.*?),.*/, '$1')
+  const deleteOldRdn = true
+  const req = new ModifyDNRequest({
+    entry: entry,
+    deleteOldRdn: deleteOldRdn,
+    controls: []
+  })
+  req.newRdn = newRdn
+  req.newSuperior = newSuperior
+  req._toBer(ber)
+  const reader = new BerReader(ber.buffer)
+  t.equal(reader.readString(), entry)
+  t.equal(reader.readString(), newRdn)
+  t.equal(reader.readBoolean(), deleteOldRdn)
+  t.equal(reader.readByte(), 0x80)
+  reader.readLength()
+  t.equal(reader._len, newSuperior.length)
+  reader._buf[--reader._offset] = 0x4
+  t.equal(reader.readString(), newSuperior)
+  t.end()
+})
+
 tap.test('search basic', function (t) {
   t.context.client.search('cn=test, ' + SUFFIX, '(objectclass=*)', function (err, res) {
     t.error(err)