diff options
author | Alexander Barkov <bar@mariadb.org> | 2016-04-06 09:13:49 +0400 |
---|---|---|
committer | Alexander Barkov <bar@mariadb.org> | 2016-04-06 09:13:49 +0400 |
commit | d516a2ae0cbd09d3b5b1667ec62b421330ab9902 (patch) | |
tree | 8180665f03dcf47a233a56346f2724cfa141a93f /sql/sql_load.cc | |
parent | bddd63cfbaa5dba96e934166a2a234e13e20db4b (diff) | |
download | mariadb-git-d516a2ae0cbd09d3b5b1667ec62b421330ab9902.tar.gz |
MDEV-9823 LOAD DATA INFILE silently truncates incomplete byte sequences
Diffstat (limited to 'sql/sql_load.cc')
-rw-r--r-- | sql/sql_load.cc | 48 |
1 files changed, 22 insertions, 26 deletions
diff --git a/sql/sql_load.cc b/sql/sql_load.cc index e2d579bac2c..a1bb84cf328 100644 --- a/sql/sql_load.cc +++ b/sql/sql_load.cc @@ -1589,38 +1589,34 @@ int READ_INFO::read_field() return 0; } } -#ifdef USE_MB - if (my_mbcharlen(read_charset, chr) > 1) + data.append(chr); + if (use_mb(read_charset)) { - uint32 length0= data.length(); - int ml= my_mbcharlen(read_charset, chr); - data.append(chr); - - for (int i= 1; i < ml; i++) + int chlen; + if ((chlen= my_charlen(read_charset, data.end() - 1, + data.end())) != 1) { - chr= GET; - if (chr == my_b_EOF) + for (uint32 length0= data.length() - 1 ; MY_CS_IS_TOOSMALL(chlen); ) { - /* - Need to back up the bytes already ready from illformed - multi-byte char - */ - data.length(length0); - goto found_eof; + chr= GET; + if (chr == my_b_EOF) + goto found_eof; + data.append(chr); + chlen= my_charlen(read_charset, data.ptr() + length0, data.end()); + if (chlen == MY_CS_ILSEQ) + { + /** + It has been an incomplete (but a valid) sequence so far, + but the last byte turned it into a bad byte sequence. + Unget the very last byte. + */ + data.length(data.length() - 1); + PUSH(chr); + break; + } } - data.append(chr); } - if (my_ismbchar(read_charset, - (const char *) data.ptr() + length0, - (const char *) data.end())) - continue; - for (int i= 0; i < ml; i++) - PUSH(data.end()[-1 - i]); - data.length(length0); - chr= GET; } -#endif - data.append(chr); } /* ** We come here if buffer is too small. Enlarge it and continue |