summaryrefslogtreecommitdiff
path: root/sql/sql_load.cc
diff options
context:
space:
mode:
authorAlexander Barkov <bar@mariadb.org>2016-04-06 09:13:49 +0400
committerAlexander Barkov <bar@mariadb.org>2016-04-06 09:13:49 +0400
commitd516a2ae0cbd09d3b5b1667ec62b421330ab9902 (patch)
tree8180665f03dcf47a233a56346f2724cfa141a93f /sql/sql_load.cc
parentbddd63cfbaa5dba96e934166a2a234e13e20db4b (diff)
downloadmariadb-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.cc48
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