@@ -1413,8 +1413,8 @@ READ_INFO::READ_INFO(File file_par, uint tot_length, const CHARSET_INFO *cs,
14131413 set_if_bigger (length,line_start.length ());
14141414 stack=stack_pos=(int *) sql_alloc (sizeof (int )*length);
14151415
1416- if (!(buffer=(uchar*) my_malloc (buff_length+1 ,MYF (0 ))))
1417- error=1 ; /* purecov: inspected */
1416+ if (!(buffer=(uchar*) my_malloc (buff_length+1 ,MYF (MY_WME ))))
1417+ error= true ; /* purecov: inspected */
14181418 else
14191419 {
14201420 end_of_buff=buffer+buff_length;
@@ -1607,37 +1607,50 @@ int READ_INFO::read_field()
16071607 }
16081608 }
16091609#ifdef USE_MB
1610- if (my_mbcharlen (read_charset, chr) > 1 &&
1611- to + my_mbcharlen (read_charset, chr) <= end_of_buff)
1612- {
1613- uchar* p= to;
1614- int ml, i;
1615- *to++ = chr;
1616-
1617- ml= my_mbcharlen (read_charset, chr);
1610+ uint ml= my_mbcharlen (read_charset, chr);
1611+ if (ml == 0 )
1612+ {
1613+ *to= ' \0 ' ;
1614+ my_error (ER_INVALID_CHARACTER_STRING, MYF (0 ),
1615+ read_charset->csname , buffer);
1616+ error= true ;
1617+ return 1 ;
1618+ }
16181619
1619- for (i= 1 ; i < ml; i++)
1620+ if (ml > 1 &&
1621+ to + ml <= end_of_buff)
16201622 {
1621- chr= GET;
1622- if (chr == my_b_EOF)
1623+ uchar* p= to;
1624+ *to++ = chr;
1625+
1626+ for (uint i= 1 ; i < ml; i++)
16231627 {
1624- /*
1625- Need to back up the bytes already ready from illformed
1626- multi-byte char
1627- */
1628- to-= i;
1629- goto found_eof;
1628+ chr= GET;
1629+ if (chr == my_b_EOF)
1630+ {
1631+ /*
1632+ Need to back up the bytes already ready from illformed
1633+ multi-byte char
1634+ */
1635+ to-= i;
1636+ goto found_eof;
1637+ }
1638+ *to++ = chr;
16301639 }
1631- *to++ = chr;
1632- }
1633- if (my_ismbchar (read_charset,
1640+ if (my_ismbchar (read_charset,
16341641 (const char *)p,
16351642 (const char *)to))
1636- continue ;
1637- for (i= 0 ; i < ml; i++)
1638- PUSH (*--to);
1639- chr= GET;
1640- }
1643+ continue ;
1644+ for (uint i= 0 ; i < ml; i++)
1645+ PUSH (*--to);
1646+ chr= GET;
1647+ }
1648+ else if (ml > 1 )
1649+ {
1650+ // Buffer is too small, exit while loop, and reallocate.
1651+ PUSH (chr);
1652+ break ;
1653+ }
16411654#endif
16421655 *to++ = (uchar) chr;
16431656 }
@@ -1886,7 +1899,15 @@ int READ_INFO::read_value(int delim, String *val)
18861899 for (chr= GET; my_tospace (chr) != delim && chr != my_b_EOF;)
18871900 {
18881901#ifdef USE_MB
1889- if (my_mbcharlen (read_charset, chr) > 1 )
1902+ uint ml= my_mbcharlen (read_charset, chr);
1903+ if (ml == 0 )
1904+ {
1905+ chr= my_b_EOF;
1906+ val->length (0 );
1907+ return chr;
1908+ }
1909+
1910+ if (ml > 1 )
18901911 {
18911912 DBUG_PRINT (" read_xml" ,(" multi byte" ));
18921913 int i, ml= my_mbcharlen (read_charset, chr);
0 commit comments