<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
{font-family:"Cambria Math";
panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
{font-family:DengXian;
panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
{font-family:Calibri;
panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
{font-family:Consolas;
panose-1:2 11 6 9 2 2 4 3 2 4;}
@font-face
{font-family:"\@DengXian";
panose-1:2 1 6 0 3 1 1 1 1 1;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{margin:0in;
font-size:11.0pt;
font-family:"Calibri",sans-serif;}
span.EmailStyle17
{mso-style-type:personal-compose;
font-family:"Calibri",sans-serif;
color:windowtext;}
.MsoChpDefault
{mso-style-type:export-only;
font-family:"Calibri",sans-serif;}
@page WordSection1
{size:8.5in 11.0in;
margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
{page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-US" link="#0563C1" vlink="#954F72" style="word-wrap:break-word">
<div class="WordSection1">
<p class="MsoNormal">Hi,<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">There may be another similar overflow bug about the fd_set in BasicUsageEnvironment/BasicTaskScheduler.cpp:115<o:p></o:p></p>
<p class="MsoNormal">----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------<o:p></o:p></p>
<p class="MsoNormal" style="line-height:14.25pt;background:#EBEEF5"><span style="font-size:10.5pt;font-family:Consolas;color:#5D5D5F"> </span><span style="font-size:10.5pt;font-family:Consolas;color:#C838C6">for</span><span style="font-size:10.5pt;font-family:Consolas;color:#5D5D5F"> (</span><span style="font-size:10.5pt;font-family:Consolas;color:#EF8ED8">int</span><span style="font-size:10.5pt;font-family:Consolas;color:#5D5D5F"> i = </span><span style="font-size:10.5pt;font-family:Consolas;color:#FF6D12">0</span><span style="font-size:10.5pt;font-family:Consolas;color:#A9A9AA">;</span><span style="font-size:10.5pt;font-family:Consolas;color:#5D5D5F"> i </span><span style="font-size:10.5pt;font-family:Consolas;color:#C838C6"><</span><span style="font-size:10.5pt;font-family:Consolas;color:#5D5D5F"> </span><span style="font-size:10.5pt;font-family:Consolas;color:#FF6D12">10000</span><span style="font-size:10.5pt;font-family:Consolas;color:#A9A9AA">;</span><span style="font-size:10.5pt;font-family:Consolas;color:#5D5D5F"> </span><span style="font-size:10.5pt;font-family:Consolas;color:#00BEC4">++</span><span style="font-size:10.5pt;font-family:Consolas;color:#5D5D5F">i) {<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height:14.25pt;background:#EBEEF5"><span style="font-size:10.5pt;font-family:Consolas;color:#5D5D5F"> </span><span style="font-size:10.5pt;font-family:Consolas;color:#C838C6">if</span><span style="font-size:10.5pt;font-family:Consolas;color:#5D5D5F"> (FD_ISSET(i</span><span style="font-size:10.5pt;font-family:Consolas;color:#A0A1A7">,</span><span style="font-size:10.5pt;font-family:Consolas;color:#5D5D5F"> </span><span style="font-size:10.5pt;font-family:Consolas;color:#00BEC4">&</span><span style="font-size:10.5pt;font-family:Consolas;color:#CD6069">fReadSet</span><span style="font-size:10.5pt;font-family:Consolas;color:#5D5D5F">) </span><span style="font-size:10.5pt;font-family:Consolas;color:#C838C6">||</span><span style="font-size:10.5pt;font-family:Consolas;color:#5D5D5F"> FD_ISSET(i</span><span style="font-size:10.5pt;font-family:Consolas;color:#A0A1A7">,</span><span style="font-size:10.5pt;font-family:Consolas;color:#5D5D5F"> </span><span style="font-size:10.5pt;font-family:Consolas;color:#00BEC4">&</span><span style="font-size:10.5pt;font-family:Consolas;color:#CD6069">fWriteSet</span><span style="font-size:10.5pt;font-family:Consolas;color:#5D5D5F">) </span><span style="font-size:10.5pt;font-family:Consolas;color:#C838C6">||</span><span style="font-size:10.5pt;font-family:Consolas;color:#5D5D5F"> FD_ISSET(i</span><span style="font-size:10.5pt;font-family:Consolas;color:#A0A1A7">,</span><span style="font-size:10.5pt;font-family:Consolas;color:#5D5D5F"> </span><span style="font-size:10.5pt;font-family:Consolas;color:#00BEC4">&</span><span style="font-size:10.5pt;font-family:Consolas;color:#CD6069">fExceptionSet</span><span style="font-size:10.5pt;font-family:Consolas;color:#5D5D5F">)) {<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height:14.25pt;background:#EBEEF5"><span style="font-size:10.5pt;font-family:Consolas;color:#5D5D5F"> </span><span style="font-size:10.5pt;font-family:Consolas;color:#437AED">fprintf</span><span style="font-size:10.5pt;font-family:Consolas;color:#5D5D5F">(stderr</span><span style="font-size:10.5pt;font-family:Consolas;color:#A0A1A7">,</span><span style="font-size:10.5pt;font-family:Consolas;color:#5D5D5F"> </span><span style="font-size:10.5pt;font-family:Consolas;color:#53A053">" </span><span style="font-size:10.5pt;font-family:Consolas;color:#FF6D12">%d</span><span style="font-size:10.5pt;font-family:Consolas;color:#53A053">("</span><span style="font-size:10.5pt;font-family:Consolas;color:#A0A1A7">,</span><span style="font-size:10.5pt;font-family:Consolas;color:#5D5D5F"> i)</span><span style="font-size:10.5pt;font-family:Consolas;color:#A9A9AA">;</span><span style="font-size:10.5pt;font-family:Consolas;color:#5D5D5F"><o:p></o:p></span></p>
<p class="MsoNormal" style="line-height:14.25pt;background:#EBEEF5"><span style="font-size:10.5pt;font-family:Consolas;color:#5D5D5F"> </span><span style="font-size:10.5pt;font-family:Consolas;color:#C838C6">if</span><span style="font-size:10.5pt;font-family:Consolas;color:#5D5D5F"> (FD_ISSET(i</span><span style="font-size:10.5pt;font-family:Consolas;color:#A0A1A7">,</span><span style="font-size:10.5pt;font-family:Consolas;color:#5D5D5F"> </span><span style="font-size:10.5pt;font-family:Consolas;color:#00BEC4">&</span><span style="font-size:10.5pt;font-family:Consolas;color:#CD6069">fReadSet</span><span style="font-size:10.5pt;font-family:Consolas;color:#5D5D5F">)) </span><span style="font-size:10.5pt;font-family:Consolas;color:#437AED">fprintf</span><span style="font-size:10.5pt;font-family:Consolas;color:#5D5D5F">(stderr</span><span style="font-size:10.5pt;font-family:Consolas;color:#A0A1A7">,</span><span style="font-size:10.5pt;font-family:Consolas;color:#5D5D5F"> </span><span style="font-size:10.5pt;font-family:Consolas;color:#53A053">"r"</span><span style="font-size:10.5pt;font-family:Consolas;color:#5D5D5F">)</span><span style="font-size:10.5pt;font-family:Consolas;color:#A9A9AA">;</span><span style="font-size:10.5pt;font-family:Consolas;color:#5D5D5F"><o:p></o:p></span></p>
<p class="MsoNormal" style="line-height:14.25pt;background:#EBEEF5"><span style="font-size:10.5pt;font-family:Consolas;color:#5D5D5F"> </span><span style="font-size:10.5pt;font-family:Consolas;color:#C838C6">if</span><span style="font-size:10.5pt;font-family:Consolas;color:#5D5D5F"> (FD_ISSET(i</span><span style="font-size:10.5pt;font-family:Consolas;color:#A0A1A7">,</span><span style="font-size:10.5pt;font-family:Consolas;color:#5D5D5F"> </span><span style="font-size:10.5pt;font-family:Consolas;color:#00BEC4">&</span><span style="font-size:10.5pt;font-family:Consolas;color:#CD6069">fWriteSet</span><span style="font-size:10.5pt;font-family:Consolas;color:#5D5D5F">)) </span><span style="font-size:10.5pt;font-family:Consolas;color:#437AED">fprintf</span><span style="font-size:10.5pt;font-family:Consolas;color:#5D5D5F">(stderr</span><span style="font-size:10.5pt;font-family:Consolas;color:#A0A1A7">,</span><span style="font-size:10.5pt;font-family:Consolas;color:#5D5D5F"> </span><span style="font-size:10.5pt;font-family:Consolas;color:#53A053">"w"</span><span style="font-size:10.5pt;font-family:Consolas;color:#5D5D5F">)</span><span style="font-size:10.5pt;font-family:Consolas;color:#A9A9AA">;</span><span style="font-size:10.5pt;font-family:Consolas;color:#5D5D5F"><o:p></o:p></span></p>
<p class="MsoNormal" style="line-height:14.25pt;background:#EBEEF5"><span style="font-size:10.5pt;font-family:Consolas;color:#5D5D5F"> </span><span style="font-size:10.5pt;font-family:Consolas;color:#C838C6">if</span><span style="font-size:10.5pt;font-family:Consolas;color:#5D5D5F"> (FD_ISSET(i</span><span style="font-size:10.5pt;font-family:Consolas;color:#A0A1A7">,</span><span style="font-size:10.5pt;font-family:Consolas;color:#5D5D5F"> </span><span style="font-size:10.5pt;font-family:Consolas;color:#00BEC4">&</span><span style="font-size:10.5pt;font-family:Consolas;color:#CD6069">fExceptionSet</span><span style="font-size:10.5pt;font-family:Consolas;color:#5D5D5F">)) </span><span style="font-size:10.5pt;font-family:Consolas;color:#437AED">fprintf</span><span style="font-size:10.5pt;font-family:Consolas;color:#5D5D5F">(stderr</span><span style="font-size:10.5pt;font-family:Consolas;color:#A0A1A7">,</span><span style="font-size:10.5pt;font-family:Consolas;color:#5D5D5F"> </span><span style="font-size:10.5pt;font-family:Consolas;color:#53A053">"e"</span><span style="font-size:10.5pt;font-family:Consolas;color:#5D5D5F">)</span><span style="font-size:10.5pt;font-family:Consolas;color:#A9A9AA">;</span><span style="font-size:10.5pt;font-family:Consolas;color:#5D5D5F"><o:p></o:p></span></p>
<p class="MsoNormal" style="line-height:14.25pt;background:#EBEEF5"><span style="font-size:10.5pt;font-family:Consolas;color:#5D5D5F"> </span><span style="font-size:10.5pt;font-family:Consolas;color:#437AED">fprintf</span><span style="font-size:10.5pt;font-family:Consolas;color:#5D5D5F">(stderr</span><span style="font-size:10.5pt;font-family:Consolas;color:#A0A1A7">,</span><span style="font-size:10.5pt;font-family:Consolas;color:#5D5D5F"> </span><span style="font-size:10.5pt;font-family:Consolas;color:#53A053">")"</span><span style="font-size:10.5pt;font-family:Consolas;color:#5D5D5F">)</span><span style="font-size:10.5pt;font-family:Consolas;color:#A9A9AA">;</span><span style="font-size:10.5pt;font-family:Consolas;color:#5D5D5F"><o:p></o:p></span></p>
<p class="MsoNormal" style="line-height:14.25pt;background:#EBEEF5"><span style="font-size:10.5pt;font-family:Consolas;color:#5D5D5F"> }<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height:14.25pt;background:#EBEEF5"><span style="font-size:10.5pt;font-family:Consolas;color:#5D5D5F"> }<o:p></o:p></span></p>
<p class="MsoNormal">--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------<o:p></o:p></p>
<p class="MsoNormal">In default, the fd_set should only support 1024 fds.<o:p></o:p></p>
<p class="MsoNormal">Sometimes, it incur the overflow as follow:<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">==13==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x619000000470 at pc 0x000000647338 bp 0x7ffff34b50d0 sp 0x7ffff34b50c8<o:p></o:p></p>
<p class="MsoNormal">READ of size 8 at 0x619000000470 thread T1<o:p></o:p></p>
<p class="MsoNormal"> #0 0x647337 in BasicTaskScheduler::SingleStep(unsigned int) /home/ubuntu/experiments/live555/BasicUsageEnvironment/BasicTaskScheduler.cpp:115:61<o:p></o:p></p>
<p class="MsoNormal"> #1 0x64ef1a in BasicTaskScheduler0::doEventLoop(char volatile*) /home/ubuntu/experiments/live555/BasicUsageEnvironment/BasicTaskScheduler0.cpp:80:5<o:p></o:p></p>
<p class="MsoNormal"> #2 0x59bf95 in AC3AudioStreamParser::readAndSaveAFrame() /home/ubuntu/experiments/live555/liveMedia/AC3AudioStreamFramer.cpp:314:41<o:p></o:p></p>
<p class="MsoNormal"> #3 0x59bf95 in AC3AudioStreamFramer::samplingRate() /home/ubuntu/experiments/live555/liveMedia/AC3AudioStreamFramer.cpp:112:14<o:p></o:p></p>
<p class="MsoNormal"> #4 0x52b7f6 in AC3AudioFileServerMediaSubsession::createNewRTPSink(Groupsock*, unsigned char, FramedSource*) /home/ubuntu/experiments/live555/liveMedia/AC3AudioFileServerMediaSubsession.cpp:60:22<o:p></o:p></p>
<p class="MsoNormal"> #5 0x5e744e in OnDemandServerMediaSubsession::getStreamParameters(unsigned int, sockaddr_storage const&, Port const&, Port const&, int, unsigned char, unsigned char, sockaddr_storage&, unsigned char&, unsigned char&, Port&, Port&, void*&)
/home/ubuntu/experiments/live555/liveMedia/OnDemandServerMediaSubsession.cpp:168:6<o:p></o:p></p>
<p class="MsoNormal"> #6 0x4e412f in RTSPServer::RTSPClientSession::handleCmd_SETUP_afterLookup2(ServerMediaSession*) /home/ubuntu/experiments/live555/liveMedia/RTSPServer.cpp:1514:17<o:p></o:p></p>
<p class="MsoNormal"> #7 0x4e0235 in RTSPServer::RTSPClientConnection::handleRequestBytes(int) /home/ubuntu/experiments/live555/liveMedia/RTSPServer.cpp:831:19<o:p></o:p></p>
<p class="MsoNormal"> #8 0x4d22be in GenericMediaServer::ClientConnection::incomingRequestHandler() /home/ubuntu/experiments/live555/liveMedia/GenericMediaServer.cpp:291:3<o:p></o:p></p>
<p class="MsoNormal"> #9 0x4d22be in GenericMediaServer::ClientConnection::incomingRequestHandler(void*, int) /home/ubuntu/experiments/live555/liveMedia/GenericMediaServer.cpp:284:15<o:p></o:p></p>
<p class="MsoNormal"> #10 0x6469f5 in BasicTaskScheduler::SingleStep(unsigned int) /home/ubuntu/experiments/live555/BasicUsageEnvironment/BasicTaskScheduler.cpp:171:2<o:p></o:p></p>
<p class="MsoNormal"> #11 0x64ef1a in BasicTaskScheduler0::doEventLoop(char volatile*) /home/ubuntu/experiments/live555/BasicUsageEnvironment/BasicTaskScheduler0.cpp:80:5<o:p></o:p></p>
<p class="MsoNormal"> #12 0x59bf95 in AC3AudioStreamParser::readAndSaveAFrame() /home/ubuntu/experiments/live555/liveMedia/AC3AudioStreamFramer.cpp:314:41<o:p></o:p></p>
<p class="MsoNormal"> #13 0x59bf95 in AC3AudioStreamFramer::samplingRate() /home/ubuntu/experiments/live555/liveMedia/AC3AudioStreamFramer.cpp:112:14<o:p></o:p></p>
<p class="MsoNormal"> #14 0x52b7f6 in AC3AudioFileServerMediaSubsession::createNewRTPSink(Groupsock*, unsigned char, FramedSource*) /home/ubuntu/experiments/live555/liveMedia/AC3AudioFileServerMediaSubsession.cpp:60:22<o:p></o:p></p>
<p class="MsoNormal"> #15 0x5e744e in OnDemandServerMediaSubsession::getStreamParameters(unsigned int, sockaddr_storage const&, Port const&, Port const&, int, unsigned char, unsigned char, sockaddr_storage&, unsigned char&, unsigned char&, Port&, Port&,
void*&) /home/ubuntu/experiments/live555/liveMedia/OnDemandServerMediaSubsession.cpp:168:6<o:p></o:p></p>
<p class="MsoNormal"> #16 0x4e412f in RTSPServer::RTSPClientSession::handleCmd_SETUP_afterLookup2(ServerMediaSession*) /home/ubuntu/experiments/live555/liveMedia/RTSPServer.cpp:1514:17<o:p></o:p></p>
<p class="MsoNormal"> #17 0x4e0235 in RTSPServer::RTSPClientConnection::handleRequestBytes(int) /home/ubuntu/experiments/live555/liveMedia/RTSPServer.cpp:831:19<o:p></o:p></p>
<p class="MsoNormal"> #18 0x4d22be in GenericMediaServer::ClientConnection::incomingRequestHandler() /home/ubuntu/experiments/live555/liveMedia/GenericMediaServer.cpp:291:3<o:p></o:p></p>
<p class="MsoNormal"> #19 0x4d22be in GenericMediaServer::ClientConnection::incomingRequestHandler(void*, int) /home/ubuntu/experiments/live555/liveMedia/GenericMediaServer.cpp:284:15<o:p></o:p></p>
<p class="MsoNormal"> #20 0x6469f5 in BasicTaskScheduler::SingleStep(unsigned int) /home/ubuntu/experiments/live555/BasicUsageEnvironment/BasicTaskScheduler.cpp:171:2<o:p></o:p></p>
<p class="MsoNormal"> #21 0x64ef1a in BasicTaskScheduler0::doEventLoop(char volatile*) /home/ubuntu/experiments/live555/BasicUsageEnvironment/BasicTaskScheduler0.cpp:80:5<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">0x619000000470 is located 0 bytes to the right of 1008-byte region [0x619000000080,0x619000000470)<o:p></o:p></p>
<p class="MsoNormal">allocated by thread T1 here:<o:p></o:p></p>
<p class="MsoNormal"> #0 0x4c789d in operator new(unsigned long) (/home/ubuntu/experiments/live555/testProgs/testOnDemandRTSPServer+0x4c789d)<o:p></o:p></p>
<p class="MsoNormal"> #1 0x645882 in BasicTaskScheduler::createNew(unsigned int) /home/ubuntu/experiments/live555/BasicUsageEnvironment/BasicTaskScheduler.cpp:32:9<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">SUMMARY: AddressSanitizer: heap-buffer-overflow /home/ubuntu/experiments/live555/BasicUsageEnvironment/BasicTaskScheduler.cpp:115:61 in BasicTaskScheduler::SingleStep(unsigned int)<o:p></o:p></p>
<p class="MsoNormal">Shadow bytes around the buggy address:<o:p></o:p></p>
<p class="MsoNormal"> 0x0c327fff8030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00<o:p></o:p></p>
<p class="MsoNormal"> 0x0c327fff8040: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00<o:p></o:p></p>
<p class="MsoNormal"> 0x0c327fff8050: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00<o:p></o:p></p>
<p class="MsoNormal"> 0x0c327fff8060: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00<o:p></o:p></p>
<p class="MsoNormal"> 0x0c327fff8070: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00<o:p></o:p></p>
<p class="MsoNormal">=>0x0c327fff8080: 00 00 00 00 00 00 00 00 00 00 00 00 00 00[fa]fa<o:p></o:p></p>
<p class="MsoNormal"> 0x0c327fff8090: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa<o:p></o:p></p>
<p class="MsoNormal"> 0x0c327fff80a0: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa<o:p></o:p></p>
<p class="MsoNormal"> 0x0c327fff80b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00<o:p></o:p></p>
<p class="MsoNormal"> 0x0c327fff80c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00<o:p></o:p></p>
<p class="MsoNormal"> 0x0c327fff80d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00<o:p></o:p></p>
<p class="MsoNormal">Shadow byte legend (one shadow byte represents 8 application bytes):<o:p></o:p></p>
<p class="MsoNormal"> Addressable: 00<o:p></o:p></p>
<p class="MsoNormal"> Partially addressable: 01 02 03 04 05 06 07 <o:p></o:p></p>
<p class="MsoNormal"> Heap left redzone: fa<o:p></o:p></p>
<p class="MsoNormal"> Freed heap region: fd<o:p></o:p></p>
<p class="MsoNormal"> Stack left redzone: f1<o:p></o:p></p>
<p class="MsoNormal"> Stack mid redzone: f2<o:p></o:p></p>
<p class="MsoNormal"> Stack right redzone: f3<o:p></o:p></p>
<p class="MsoNormal"> Stack after return: f5<o:p></o:p></p>
<p class="MsoNormal"> Stack use after scope: f8<o:p></o:p></p>
<p class="MsoNormal"> Global redzone: f9<o:p></o:p></p>
<p class="MsoNormal"> Global init order: f6<o:p></o:p></p>
<p class="MsoNormal"> Poisoned by user: f7<o:p></o:p></p>
<p class="MsoNormal"> Container overflow: fc<o:p></o:p></p>
<p class="MsoNormal"> Array cookie: ac<o:p></o:p></p>
<p class="MsoNormal"> Intra object redzone: bb<o:p></o:p></p>
<p class="MsoNormal"> ASan internal: fe<o:p></o:p></p>
<p class="MsoNormal"> Left alloca redzone: ca<o:p></o:p></p>
<p class="MsoNormal"> Right alloca redzone: cb<o:p></o:p></p>
<p class="MsoNormal"> Shadow gap: cc<o:p></o:p></p>
<p class="MsoNormal">==13==ABORTING<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Best regards,<o:p></o:p></p>
<p class="MsoNormal">Jinsheng Ba<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
</body>
</html>