You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
This is not the correct way of sorting dictionary entries. The encoder is producing specification-incompliant octets that’ll be floating around in the wild, polluting the network.
When you say “strings” in the context of Bencoding, you mean “binary strings,” or more specifically, “8-bit byte sequences.”
Note that, in the context of bencoding, strings, including dictionary keys, are arbitrary byte sequences (uint8_t[]).
And Array.prototype.sort compares 16-bit units by default.
If compareFn is not supplied, all non-undefined array elements are sorted by converting them to strings and comparing strings in UTF-16 code units order.
The simple .sort() results in a different order (sorted_in_utf16) than the correct one (sorted_in_utf8). Observe:
const A = String.fromCodePoint(0xFF61);
const B = String.fromCodePoint(0x10002);
const sorted_in_utf8 = [A, B].sort((a, b) => Buffer.compare(Buffer.from(a), Buffer.from(b))); // [A, B]
const sorted_in_utf16 = [A, B].sort(); // [B, A]
Bug
bencode-js/src/encode.coffee
Lines 9 to 10 in 3ca25e4
This is not the correct way of sorting dictionary entries. The encoder is producing specification-incompliant octets that’ll be floating around in the wild, polluting the network.
When you say “strings” in the context of Bencoding, you mean “binary strings,” or more specifically, “8-bit byte sequences.”
And
Array.prototype.sort
compares 16-bit units by default.The simple
.sort()
results in a different order (sorted_in_utf16
) than the correct one (sorted_in_utf8
). Observe:The related issue
The text was updated successfully, but these errors were encountered: