mariadb
Version:
fast mariadb or mysql connector.
74 lines (63 loc) • 2.17 kB
JavaScript
// SPDX-License-Identifier: LGPL-2.1-or-later
// Copyright (c) 2015-2026 MariaDB Corporation Ab
;
// Per-charset multibyte recognizers used by PacketOutputStream#writeBufferEscape
// to avoid splitting a valid multibyte character with an inserted escape byte.
//
// Only charsets whose trail-byte range overlaps the ASCII escape character (0x5C)
// are listed here. For them, a naïve byte-wise escape that inserts 0x5C before a
// quote/backslash inside arbitrary binary input can produce a wire sequence where
// the server lexer eats the inserted 0x5C as the trail byte of a multibyte
// character, leaving a bare quote that closes the string literal (SQL injection).
//
// See for the C reference :
// https://github.com/mariadb-corporation/mariadb-connector-c/blob/3.4/libmariadb/ma_charset.c
//
const big5 = {
isHead: (b) => b >= 0xa1 && b <= 0xfe,
length: (buf, i, n) => {
if (i + 1 >= n) return 0;
const t = buf[i + 1];
return (t >= 0x40 && t <= 0x7e) || (t >= 0xa1 && t <= 0xfe) ? 2 : 0;
}
};
const gbk = {
isHead: (b) => b >= 0x81 && b <= 0xfe,
length: (buf, i, n) => {
if (i + 1 >= n) return 0;
const t = buf[i + 1];
return (t >= 0x40 && t <= 0x7e) || (t >= 0x80 && t <= 0xfe) ? 2 : 0;
}
};
const sjis = {
isHead: (b) => (b >= 0x81 && b <= 0x9f) || (b >= 0xe0 && b <= 0xfc),
length: (buf, i, n) => {
if (i + 1 >= n) return 0;
const t = buf[i + 1];
return (t >= 0x40 && t <= 0x7e) || (t >= 0x80 && t <= 0xfc) ? 2 : 0;
}
};
// cp932 shares sjis ranges
const cp932 = sjis;
const gbOdd = (b) => b >= 0x81 && b <= 0xfe;
const gbEven2 = (b) => (b >= 0x40 && b <= 0x7e) || (b >= 0x80 && b <= 0xfe);
const gbEven4 = (b) => b >= 0x30 && b <= 0x39;
const gb18030 = {
isHead: gbOdd,
length: (buf, i, n) => {
if (i + 1 >= n) return 0;
if (gbEven2(buf[i + 1])) return 2;
if (i + 3 < n && gbEven4(buf[i + 1]) && gbOdd(buf[i + 2]) && gbEven4(buf[i + 3])) {
return 4;
}
return 0;
}
};
const recognizers = {
big5: big5,
gbk: gbk,
sjis: sjis,
cp932: cp932,
gb18030: gb18030
};
export const getMbRecognizer = (encoding) => recognizers[encoding] || null;