From 96833b8b140ec0ad8f8915bea85845edded793f3 Mon Sep 17 00:00:00 2001 From: Tony Crisci Date: Thu, 6 Feb 2020 13:45:07 -0500 Subject: [PATCH] add support for big endian fixes #36 --- lib/dbus-buffer.js | 34 ++++++++++++++++++++++++++++------ lib/message.js | 23 ++++++++++++++++------- lib/unmarshall.js | 9 --------- 3 files changed, 44 insertions(+), 22 deletions(-) delete mode 100644 lib/unmarshall.js diff --git a/lib/dbus-buffer.js b/lib/dbus-buffer.js index 058e068..abfca17 100644 --- a/lib/dbus-buffer.js +++ b/lib/dbus-buffer.js @@ -2,9 +2,10 @@ const {parseSignature} = require('./signature'); const { getBigIntCompat } = require('./library-options'); const JSBI = require('jsbi'); const Long = require('long'); +const LE = require('./constants').endianness.le; // Buffer + position + global start position ( used in alignment ) -function DBusBuffer(buffer, startPos, options) { +function DBusBuffer(buffer, startPos, endian, options) { if (typeof options !== 'object') { options = { ayBuffer: true }; } else if (options.ayBuffer === undefined) { @@ -13,6 +14,7 @@ function DBusBuffer(buffer, startPos, options) { } this.options = options; this.buffer = buffer; + this.endian = endian; (this.startPos = startPos ? startPos : 0), (this.pos = 0); } @@ -29,35 +31,55 @@ DBusBuffer.prototype.readInt8 = function() { DBusBuffer.prototype.readSInt16 = function() { this.align(1); - var res = this.buffer.readInt16LE(this.pos); + + var res = (this.endian === LE ? + this.buffer.readInt16LE(this.pos) : + this.buffer.readInt16BE(this.pos)); + this.pos += 2; return res; }; DBusBuffer.prototype.readInt16 = function() { this.align(1); - var res = this.buffer.readUInt16LE(this.pos); + + var res = (this.endian === LE ? + this.buffer.readUInt16LE(this.pos) : + this.buffer.readUInt16BE(this.pos)); + this.pos += 2; return res; }; DBusBuffer.prototype.readSInt32 = function() { this.align(2); - var res = this.buffer.readInt32LE(this.pos); + + var res = (this.endian === LE ? + this.buffer.readInt32LE(this.pos) : + this.buffer.readInt32BE(this.pos)); + this.pos += 4; return res; }; DBusBuffer.prototype.readInt32 = function() { this.align(2); - var res = this.buffer.readUInt32LE(this.pos); + + var res = (this.endian === LE ? + this.buffer.readUInt32LE(this.pos) : + this.buffer.readUInt32BE(this.pos)); + this.pos += 4; return res; }; DBusBuffer.prototype.readDouble = function() { this.align(3); - var res = this.buffer.readDoubleLE(this.pos); + + var res = (this.endian === LE ? + this.buffer.readDoubleLE(this.pos) : + this.buffer.readDoubleBE(this.pos)); + this.pos += 8; return res; }; diff --git a/lib/message.js b/lib/message.js index b208034..57dd89f 100644 --- a/lib/message.js +++ b/lib/message.js @@ -15,23 +15,31 @@ module.exports.unmarshalMessages = function messageParser( var fieldsLength, fieldsLengthPadded; var fieldsAndBodyLength = 0; var bodyLength = 0; + var endian = 0; + const LE = constants.endianness.le; stream.on('readable', function() { while (1) { if (state === 0) { header = stream.read(16); - if (!header) break; + if (!header) { + break; + } state = 1; - fieldsLength = header.readUInt32LE(12); + endian = header.readUInt8(); + + fieldsLength = (endian === LE ? header.readUInt32LE(12) : header.readUInt32BE(12)); fieldsLengthPadded = ((fieldsLength + 7) >> 3) << 3; - bodyLength = header.readUInt32LE(4); + bodyLength = (endian === LE ? header.readUInt32LE(4) : header.readUInt32BE(4)); fieldsAndBodyLength = fieldsLengthPadded + bodyLength; } else { fieldsAndBody = stream.read(fieldsAndBodyLength); - if (!fieldsAndBody) break; + if (!fieldsAndBody) { + break; + } state = 0; - var messageBuffer = new DBusBuffer(fieldsAndBody, undefined, opts); + var messageBuffer = new DBusBuffer(fieldsAndBody, 0, endian, opts); var unmarshalledHeader = messageBuffer.readArray( headerSignature[0].child[0], fieldsLength @@ -39,7 +47,7 @@ module.exports.unmarshalMessages = function messageParser( messageBuffer.align(3); var headerName; var message = {}; - message.serial = header.readUInt32LE(8); + message.serial = (endian === LE ? header.readUInt32LE(8) : header.readUInt32BE(8)); for (var i = 0; i < unmarshalledHeader.length; ++i) { headerName = constants.headerTypeName[unmarshalledHeader[i][0]]; @@ -61,7 +69,8 @@ module.exports.unmarshalMessages = function messageParser( // given buffer which contains entire message deserialise it // TODO: factor out common code module.exports.unmarshall = function unmarshall(buff, opts) { - var msgBuf = new DBusBuffer(buff, undefined, opts); + var endian = buff.readUInt8(); + var msgBuf = new DBusBuffer(buff, 0, endian, opts); var headers = msgBuf.read('yyyyuua(yv)'); var message = {}; for (var i = 0; i < headers[6].length; ++i) { diff --git a/lib/unmarshall.js b/lib/unmarshall.js deleted file mode 100644 index dfe7de1..0000000 --- a/lib/unmarshall.js +++ /dev/null @@ -1,9 +0,0 @@ -const Buffer = require('safe-buffer').Buffer; -const DBusBuffer = require('./dbus-buffer'); - -module.exports = function unmarshall(buffer, signature, startPos, options) { - if (!startPos) startPos = 0; - if (signature === '') return Buffer.from(''); - var dbuff = new DBusBuffer(buffer, startPos, options); - return dbuff.read(signature); -};