From 10c2f72720628c952138bc87dffd6505576fdcd0 Mon Sep 17 00:00:00 2001 From: webzwo0i Date: Thu, 4 Dec 2014 16:01:39 +0100 Subject: [PATCH 1/4] dont remove more lines than exist in the whole text --- src/static/js/Changeset.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/static/js/Changeset.js b/src/static/js/Changeset.js index 355bef4a9..366ad15f9 100644 --- a/src/static/js/Changeset.js +++ b/src/static/js/Changeset.js @@ -903,6 +903,8 @@ exports.pack = function (oldLen, newLen, opsStr, bank) { * @params str {string} String to which a Changeset should be applied */ exports.applyToText = function (cs, str) { + var totalNrOfLines = str.split("\n").length; + var removedLines = 0; var unpacked = exports.unpack(cs); exports.assert(str.length == unpacked.oldLen, "mismatched apply: ", str.length, " / ", unpacked.oldLen); var csIter = exports.opIterator(unpacked.ops); @@ -916,6 +918,7 @@ exports.applyToText = function (cs, str) { assem.append(bankIter.take(op.chars)); break; case '-': + removedLines += op.lines; strIter.skip(op.chars); break; case '=': @@ -923,6 +926,7 @@ exports.applyToText = function (cs, str) { break; } } + exports.assert(totalNrOfLines >= removedLines,"cannot remove ", removedLines, " lines from text with ", totalNrOfLines, " lines"); assem.append(strIter.take(strIter.remaining())); return assem.toString(); }; From 5306f0c98af051b790bcf8344077e781b10f3eb7 Mon Sep 17 00:00:00 2001 From: webzwo0i Date: Thu, 4 Dec 2014 16:05:02 +0100 Subject: [PATCH 2/4] wrap appendRevision in try-catch block --- src/node/handler/PadMessageHandler.js | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/node/handler/PadMessageHandler.js b/src/node/handler/PadMessageHandler.js index bc8f5d629..1d89288cf 100644 --- a/src/node/handler/PadMessageHandler.js +++ b/src/node/handler/PadMessageHandler.js @@ -742,7 +742,16 @@ function handleUserChanges(data, cb) return callback(new Error("Can't apply USER_CHANGES "+changeset+" with oldLen " + Changeset.oldLen(changeset) + " to document of length " + prevText.length)); } - pad.appendRevision(changeset, thisSession.author); + try + { + pad.appendRevision(changeset, thisSession.author); + } + catch(e) + { + client.json.send({disconnect:"badChangeset"}); + stats.meter('failedChangesets').mark(); + return callback(e) + } var correctionChangeset = _correctMarkersInPad(pad.atext, pad.pool); if (correctionChangeset) { From 22803da42f4f8c6aeccc15d0a916bae6332a8652 Mon Sep 17 00:00:00 2001 From: webzwo0i Date: Thu, 4 Dec 2014 16:12:13 +0100 Subject: [PATCH 3/4] be more strict in checkRep --- src/static/js/Changeset.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/static/js/Changeset.js b/src/static/js/Changeset.js index 366ad15f9..4d5487f82 100644 --- a/src/static/js/Changeset.js +++ b/src/static/js/Changeset.js @@ -255,20 +255,20 @@ exports.checkRep = function (cs) { var o = iter.next(); switch (o.opcode) { case '=': + exports.assert(o.chars >= o.lines, o.chars, " chars and ", o.lines, " lines in op ",cs); oldPos += o.chars; calcNewLen += o.chars; break; case '-': + exports.assert(o.chars >= o.lines, o.chars, " chars and ", o.lines, " lines in op ",cs); oldPos += o.chars; exports.assert(oldPos < oldLen, oldPos, " >= ", oldLen, " in ", cs); break; case '+': - { - calcNewLen += o.chars; - numInserted += o.chars; - exports.assert(calcNewLen < newLen, calcNewLen, " >= ", newLen, " in ", cs); - break; - } + exports.assert(o.chars >= o.lines, o.chars, " chars and ", o.lines, " lines in op ",cs); + calcNewLen += o.chars; + exports.assert(calcNewLen < newLen, calcNewLen, " >= ", newLen, " in ", cs); + break; } assem.append(o); } From 07a6702363a2b3cb195422cbc618de221a83b278 Mon Sep 17 00:00:00 2001 From: webzwo0i Date: Sat, 27 Dec 2014 17:56:20 +0100 Subject: [PATCH 4/4] Revert "be more strict in checkRep" This reverts commit 22803da42f4f8c6aeccc15d0a916bae6332a8652. --- src/static/js/Changeset.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/static/js/Changeset.js b/src/static/js/Changeset.js index 4d5487f82..366ad15f9 100644 --- a/src/static/js/Changeset.js +++ b/src/static/js/Changeset.js @@ -255,20 +255,20 @@ exports.checkRep = function (cs) { var o = iter.next(); switch (o.opcode) { case '=': - exports.assert(o.chars >= o.lines, o.chars, " chars and ", o.lines, " lines in op ",cs); oldPos += o.chars; calcNewLen += o.chars; break; case '-': - exports.assert(o.chars >= o.lines, o.chars, " chars and ", o.lines, " lines in op ",cs); oldPos += o.chars; exports.assert(oldPos < oldLen, oldPos, " >= ", oldLen, " in ", cs); break; case '+': - exports.assert(o.chars >= o.lines, o.chars, " chars and ", o.lines, " lines in op ",cs); - calcNewLen += o.chars; - exports.assert(calcNewLen < newLen, calcNewLen, " >= ", newLen, " in ", cs); - break; + { + calcNewLen += o.chars; + numInserted += o.chars; + exports.assert(calcNewLen < newLen, calcNewLen, " >= ", newLen, " in ", cs); + break; + } } assem.append(o); }