runtests.c 475 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355435643574358435943604361436243634364436543664367436843694370437143724373437443754376437743784379438043814382438343844385438643874388438943904391439243934394439543964397439843994400440144024403440444054406440744084409441044114412441344144415441644174418441944204421442244234424442544264427442844294430443144324433443444354436443744384439444044414442444344444445444644474448444944504451445244534454445544564457445844594460446144624463446444654466446744684469447044714472447344744475447644774478447944804481448244834484448544864487448844894490449144924493449444954496449744984499450045014502450345044505450645074508450945104511451245134514451545164517451845194520452145224523452445254526452745284529453045314532453345344535453645374538453945404541454245434544454545464547454845494550455145524553455445554556455745584559456045614562456345644565456645674568456945704571457245734574457545764577457845794580458145824583458445854586458745884589459045914592459345944595459645974598459946004601460246034604460546064607460846094610461146124613461446154616461746184619462046214622462346244625462646274628462946304631463246334634463546364637463846394640464146424643464446454646464746484649465046514652465346544655465646574658465946604661466246634664466546664667466846694670467146724673467446754676467746784679468046814682468346844685468646874688468946904691469246934694469546964697469846994700470147024703470447054706470747084709471047114712471347144715471647174718471947204721472247234724472547264727472847294730473147324733473447354736473747384739474047414742474347444745474647474748474947504751475247534754475547564757475847594760476147624763476447654766476747684769477047714772477347744775477647774778477947804781478247834784478547864787478847894790479147924793479447954796479747984799480048014802480348044805480648074808480948104811481248134814481548164817481848194820482148224823482448254826482748284829483048314832483348344835483648374838483948404841484248434844484548464847484848494850485148524853485448554856485748584859486048614862486348644865486648674868486948704871487248734874487548764877487848794880488148824883488448854886488748884889489048914892489348944895489648974898489949004901490249034904490549064907490849094910491149124913491449154916491749184919492049214922492349244925492649274928492949304931493249334934493549364937493849394940494149424943494449454946494749484949495049514952495349544955495649574958495949604961496249634964496549664967496849694970497149724973497449754976497749784979498049814982498349844985498649874988498949904991499249934994499549964997499849995000500150025003500450055006500750085009501050115012501350145015501650175018501950205021502250235024502550265027502850295030503150325033503450355036503750385039504050415042504350445045504650475048504950505051505250535054505550565057505850595060506150625063506450655066506750685069507050715072507350745075507650775078507950805081508250835084508550865087508850895090509150925093509450955096509750985099510051015102510351045105510651075108510951105111511251135114511551165117511851195120512151225123512451255126512751285129513051315132513351345135513651375138513951405141514251435144514551465147514851495150515151525153515451555156515751585159516051615162516351645165516651675168516951705171517251735174517551765177517851795180518151825183518451855186518751885189519051915192519351945195519651975198519952005201520252035204520552065207520852095210521152125213521452155216521752185219522052215222522352245225522652275228522952305231523252335234523552365237523852395240524152425243524452455246524752485249525052515252525352545255525652575258525952605261526252635264526552665267526852695270527152725273527452755276527752785279528052815282528352845285528652875288528952905291529252935294529552965297529852995300530153025303530453055306530753085309531053115312531353145315531653175318531953205321532253235324532553265327532853295330533153325333533453355336533753385339534053415342534353445345534653475348534953505351535253535354535553565357535853595360536153625363536453655366536753685369537053715372537353745375537653775378537953805381538253835384538553865387538853895390539153925393539453955396539753985399540054015402540354045405540654075408540954105411541254135414541554165417541854195420542154225423542454255426542754285429543054315432543354345435543654375438543954405441544254435444544554465447544854495450545154525453545454555456545754585459546054615462546354645465546654675468546954705471547254735474547554765477547854795480548154825483548454855486548754885489549054915492549354945495549654975498549955005501550255035504550555065507550855095510551155125513551455155516551755185519552055215522552355245525552655275528552955305531553255335534553555365537553855395540554155425543554455455546554755485549555055515552555355545555555655575558555955605561556255635564556555665567556855695570557155725573557455755576557755785579558055815582558355845585558655875588558955905591559255935594559555965597559855995600560156025603560456055606560756085609561056115612561356145615561656175618561956205621562256235624562556265627562856295630563156325633563456355636563756385639564056415642564356445645564656475648564956505651565256535654565556565657565856595660566156625663566456655666566756685669567056715672567356745675567656775678567956805681568256835684568556865687568856895690569156925693569456955696569756985699570057015702570357045705570657075708570957105711571257135714571557165717571857195720572157225723572457255726572757285729573057315732573357345735573657375738573957405741574257435744574557465747574857495750575157525753575457555756575757585759576057615762576357645765576657675768576957705771577257735774577557765777577857795780578157825783578457855786578757885789579057915792579357945795579657975798579958005801580258035804580558065807580858095810581158125813581458155816581758185819582058215822582358245825582658275828582958305831583258335834583558365837583858395840584158425843584458455846584758485849585058515852585358545855585658575858585958605861586258635864586558665867586858695870587158725873587458755876587758785879588058815882588358845885588658875888588958905891589258935894589558965897589858995900590159025903590459055906590759085909591059115912591359145915591659175918591959205921592259235924592559265927592859295930593159325933593459355936593759385939594059415942594359445945594659475948594959505951595259535954595559565957595859595960596159625963596459655966596759685969597059715972597359745975597659775978597959805981598259835984598559865987598859895990599159925993599459955996599759985999600060016002600360046005600660076008600960106011601260136014601560166017601860196020602160226023602460256026602760286029603060316032603360346035603660376038603960406041604260436044604560466047604860496050605160526053605460556056605760586059606060616062606360646065606660676068606960706071607260736074607560766077607860796080608160826083608460856086608760886089609060916092609360946095609660976098609961006101610261036104610561066107610861096110611161126113611461156116611761186119612061216122612361246125612661276128612961306131613261336134613561366137613861396140614161426143614461456146614761486149615061516152615361546155615661576158615961606161616261636164616561666167616861696170617161726173617461756176617761786179618061816182618361846185618661876188618961906191619261936194619561966197619861996200620162026203620462056206620762086209621062116212621362146215621662176218621962206221622262236224622562266227622862296230623162326233623462356236623762386239624062416242624362446245624662476248624962506251625262536254625562566257625862596260626162626263626462656266626762686269627062716272627362746275627662776278627962806281628262836284628562866287628862896290629162926293629462956296629762986299630063016302630363046305630663076308630963106311631263136314631563166317631863196320632163226323632463256326632763286329633063316332633363346335633663376338633963406341634263436344634563466347634863496350635163526353635463556356635763586359636063616362636363646365636663676368636963706371637263736374637563766377637863796380638163826383638463856386638763886389639063916392639363946395639663976398639964006401640264036404640564066407640864096410641164126413641464156416641764186419642064216422642364246425642664276428642964306431643264336434643564366437643864396440644164426443644464456446644764486449645064516452645364546455645664576458645964606461646264636464646564666467646864696470647164726473647464756476647764786479648064816482648364846485648664876488648964906491649264936494649564966497649864996500650165026503650465056506650765086509651065116512651365146515651665176518651965206521652265236524652565266527652865296530653165326533653465356536653765386539654065416542654365446545654665476548654965506551655265536554655565566557655865596560656165626563656465656566656765686569657065716572657365746575657665776578657965806581658265836584658565866587658865896590659165926593659465956596659765986599660066016602660366046605660666076608660966106611661266136614661566166617661866196620662166226623662466256626662766286629663066316632663366346635663666376638663966406641664266436644664566466647664866496650665166526653665466556656665766586659666066616662666366646665666666676668666966706671667266736674667566766677667866796680668166826683668466856686668766886689669066916692669366946695669666976698669967006701670267036704670567066707670867096710671167126713671467156716671767186719672067216722672367246725672667276728672967306731673267336734673567366737673867396740674167426743674467456746674767486749675067516752675367546755675667576758675967606761676267636764676567666767676867696770677167726773677467756776677767786779678067816782678367846785678667876788678967906791679267936794679567966797679867996800680168026803680468056806680768086809681068116812681368146815681668176818681968206821682268236824682568266827682868296830683168326833683468356836683768386839684068416842684368446845684668476848684968506851685268536854685568566857685868596860686168626863686468656866686768686869687068716872687368746875687668776878687968806881688268836884688568866887688868896890689168926893689468956896689768986899690069016902690369046905690669076908690969106911691269136914691569166917691869196920692169226923692469256926692769286929693069316932693369346935693669376938693969406941694269436944694569466947694869496950695169526953695469556956695769586959696069616962696369646965696669676968696969706971697269736974697569766977697869796980698169826983698469856986698769886989699069916992699369946995699669976998699970007001700270037004700570067007700870097010701170127013701470157016701770187019702070217022702370247025702670277028702970307031703270337034703570367037703870397040704170427043704470457046704770487049705070517052705370547055705670577058705970607061706270637064706570667067706870697070707170727073707470757076707770787079708070817082708370847085708670877088708970907091709270937094709570967097709870997100710171027103710471057106710771087109711071117112711371147115711671177118711971207121712271237124712571267127712871297130713171327133713471357136713771387139714071417142714371447145714671477148714971507151715271537154715571567157715871597160716171627163716471657166716771687169717071717172717371747175717671777178717971807181718271837184718571867187718871897190719171927193719471957196719771987199720072017202720372047205720672077208720972107211721272137214721572167217721872197220722172227223722472257226722772287229723072317232723372347235723672377238723972407241724272437244724572467247724872497250725172527253725472557256725772587259726072617262726372647265726672677268726972707271727272737274727572767277727872797280728172827283728472857286728772887289729072917292729372947295729672977298729973007301730273037304730573067307730873097310731173127313731473157316731773187319732073217322732373247325732673277328732973307331733273337334733573367337733873397340734173427343734473457346734773487349735073517352735373547355735673577358735973607361736273637364736573667367736873697370737173727373737473757376737773787379738073817382738373847385738673877388738973907391739273937394739573967397739873997400740174027403740474057406740774087409741074117412741374147415741674177418741974207421742274237424742574267427742874297430743174327433743474357436743774387439744074417442744374447445744674477448744974507451745274537454745574567457745874597460746174627463746474657466746774687469747074717472747374747475747674777478747974807481748274837484748574867487748874897490749174927493749474957496749774987499750075017502750375047505750675077508750975107511751275137514751575167517751875197520752175227523752475257526752775287529753075317532753375347535753675377538753975407541754275437544754575467547754875497550755175527553755475557556755775587559756075617562756375647565756675677568756975707571757275737574757575767577757875797580758175827583758475857586758775887589759075917592759375947595759675977598759976007601760276037604760576067607760876097610761176127613761476157616761776187619762076217622762376247625762676277628762976307631763276337634763576367637763876397640764176427643764476457646764776487649765076517652765376547655765676577658765976607661766276637664766576667667766876697670767176727673767476757676767776787679768076817682768376847685768676877688768976907691769276937694769576967697769876997700770177027703770477057706770777087709771077117712771377147715771677177718771977207721772277237724772577267727772877297730773177327733773477357736773777387739774077417742774377447745774677477748774977507751775277537754775577567757775877597760776177627763776477657766776777687769777077717772777377747775777677777778777977807781778277837784778577867787778877897790779177927793779477957796779777987799780078017802780378047805780678077808780978107811781278137814781578167817781878197820782178227823782478257826782778287829783078317832783378347835783678377838783978407841784278437844784578467847784878497850785178527853785478557856785778587859786078617862786378647865786678677868786978707871787278737874787578767877787878797880788178827883788478857886788778887889789078917892789378947895789678977898789979007901790279037904790579067907790879097910791179127913791479157916791779187919792079217922792379247925792679277928792979307931793279337934793579367937793879397940794179427943794479457946794779487949795079517952795379547955795679577958795979607961796279637964796579667967796879697970797179727973797479757976797779787979798079817982798379847985798679877988798979907991799279937994799579967997799879998000800180028003800480058006800780088009801080118012801380148015801680178018801980208021802280238024802580268027802880298030803180328033803480358036803780388039804080418042804380448045804680478048804980508051805280538054805580568057805880598060806180628063806480658066806780688069807080718072807380748075807680778078807980808081808280838084808580868087808880898090809180928093809480958096809780988099810081018102810381048105810681078108810981108111811281138114811581168117811881198120812181228123812481258126812781288129813081318132813381348135813681378138813981408141814281438144814581468147814881498150815181528153815481558156815781588159816081618162816381648165816681678168816981708171817281738174817581768177817881798180818181828183818481858186818781888189819081918192819381948195819681978198819982008201820282038204820582068207820882098210821182128213821482158216821782188219822082218222822382248225822682278228822982308231823282338234823582368237823882398240824182428243824482458246824782488249825082518252825382548255825682578258825982608261826282638264826582668267826882698270827182728273827482758276827782788279828082818282828382848285828682878288828982908291829282938294829582968297829882998300830183028303830483058306830783088309831083118312831383148315831683178318831983208321832283238324832583268327832883298330833183328333833483358336833783388339834083418342834383448345834683478348834983508351835283538354835583568357835883598360836183628363836483658366836783688369837083718372837383748375837683778378837983808381838283838384838583868387838883898390839183928393839483958396839783988399840084018402840384048405840684078408840984108411841284138414841584168417841884198420842184228423842484258426842784288429843084318432843384348435843684378438843984408441844284438444844584468447844884498450845184528453845484558456845784588459846084618462846384648465846684678468846984708471847284738474847584768477847884798480848184828483848484858486848784888489849084918492849384948495849684978498849985008501850285038504850585068507850885098510851185128513851485158516851785188519852085218522852385248525852685278528852985308531853285338534853585368537853885398540854185428543854485458546854785488549855085518552855385548555855685578558855985608561856285638564856585668567856885698570857185728573857485758576857785788579858085818582858385848585858685878588858985908591859285938594859585968597859885998600860186028603860486058606860786088609861086118612861386148615861686178618861986208621862286238624862586268627862886298630863186328633863486358636863786388639864086418642864386448645864686478648864986508651865286538654865586568657865886598660866186628663866486658666866786688669867086718672867386748675867686778678867986808681868286838684868586868687868886898690869186928693869486958696869786988699870087018702870387048705870687078708870987108711871287138714871587168717871887198720872187228723872487258726872787288729873087318732873387348735873687378738873987408741874287438744874587468747874887498750875187528753875487558756875787588759876087618762876387648765876687678768876987708771877287738774877587768777877887798780878187828783878487858786878787888789879087918792879387948795879687978798879988008801880288038804880588068807880888098810881188128813881488158816881788188819882088218822882388248825882688278828882988308831883288338834883588368837883888398840884188428843884488458846884788488849885088518852885388548855885688578858885988608861886288638864886588668867886888698870887188728873887488758876887788788879888088818882888388848885888688878888888988908891889288938894889588968897889888998900890189028903890489058906890789088909891089118912891389148915891689178918891989208921892289238924892589268927892889298930893189328933893489358936893789388939894089418942894389448945894689478948894989508951895289538954895589568957895889598960896189628963896489658966896789688969897089718972897389748975897689778978897989808981898289838984898589868987898889898990899189928993899489958996899789988999900090019002900390049005900690079008900990109011901290139014901590169017901890199020902190229023902490259026902790289029903090319032903390349035903690379038903990409041904290439044904590469047904890499050905190529053905490559056905790589059906090619062906390649065906690679068906990709071907290739074907590769077907890799080908190829083908490859086908790889089909090919092909390949095909690979098909991009101910291039104910591069107910891099110911191129113911491159116911791189119912091219122912391249125912691279128912991309131913291339134913591369137913891399140914191429143914491459146914791489149915091519152915391549155915691579158915991609161916291639164916591669167916891699170917191729173917491759176917791789179918091819182918391849185918691879188918991909191919291939194919591969197919891999200920192029203920492059206920792089209921092119212921392149215921692179218921992209221922292239224922592269227922892299230923192329233923492359236923792389239924092419242924392449245924692479248924992509251925292539254925592569257925892599260926192629263926492659266926792689269927092719272927392749275927692779278927992809281928292839284928592869287928892899290929192929293929492959296929792989299930093019302930393049305930693079308930993109311931293139314931593169317931893199320932193229323932493259326932793289329933093319332933393349335933693379338933993409341934293439344934593469347934893499350935193529353935493559356935793589359936093619362936393649365936693679368936993709371937293739374937593769377937893799380938193829383938493859386938793889389939093919392939393949395939693979398939994009401940294039404940594069407940894099410941194129413941494159416941794189419942094219422942394249425942694279428942994309431943294339434943594369437943894399440944194429443944494459446944794489449945094519452945394549455945694579458945994609461946294639464946594669467946894699470947194729473947494759476947794789479948094819482948394849485948694879488948994909491949294939494949594969497949894999500950195029503950495059506950795089509951095119512951395149515951695179518951995209521952295239524952595269527952895299530953195329533953495359536953795389539954095419542954395449545954695479548954995509551955295539554955595569557955895599560956195629563956495659566956795689569957095719572957395749575957695779578957995809581958295839584958595869587958895899590959195929593959495959596959795989599960096019602960396049605960696079608960996109611961296139614961596169617961896199620962196229623962496259626962796289629963096319632963396349635963696379638963996409641964296439644964596469647964896499650965196529653965496559656965796589659966096619662966396649665966696679668966996709671967296739674967596769677967896799680968196829683968496859686968796889689969096919692969396949695969696979698969997009701970297039704970597069707970897099710971197129713971497159716971797189719972097219722972397249725972697279728972997309731973297339734973597369737973897399740974197429743974497459746974797489749975097519752975397549755975697579758975997609761976297639764976597669767976897699770977197729773977497759776977797789779978097819782978397849785978697879788978997909791979297939794979597969797979897999800980198029803980498059806980798089809981098119812981398149815981698179818981998209821982298239824982598269827982898299830983198329833983498359836983798389839984098419842984398449845984698479848984998509851985298539854985598569857985898599860986198629863986498659866986798689869987098719872987398749875987698779878987998809881988298839884988598869887988898899890989198929893989498959896989798989899990099019902990399049905990699079908990999109911991299139914991599169917991899199920992199229923992499259926992799289929993099319932993399349935993699379938993999409941994299439944994599469947994899499950995199529953995499559956995799589959996099619962996399649965996699679968996999709971997299739974997599769977997899799980998199829983998499859986998799889989999099919992999399949995999699979998999910000100011000210003100041000510006100071000810009100101001110012100131001410015100161001710018100191002010021100221002310024100251002610027100281002910030100311003210033100341003510036100371003810039100401004110042100431004410045100461004710048100491005010051100521005310054100551005610057100581005910060100611006210063100641006510066100671006810069100701007110072100731007410075100761007710078100791008010081100821008310084100851008610087100881008910090100911009210093100941009510096100971009810099101001010110102101031010410105101061010710108101091011010111101121011310114101151011610117101181011910120101211012210123101241012510126101271012810129101301013110132101331013410135101361013710138101391014010141101421014310144101451014610147101481014910150101511015210153101541015510156101571015810159101601016110162101631016410165101661016710168101691017010171101721017310174101751017610177101781017910180101811018210183101841018510186101871018810189101901019110192101931019410195101961019710198101991020010201102021020310204102051020610207102081020910210102111021210213102141021510216102171021810219102201022110222102231022410225102261022710228102291023010231102321023310234102351023610237102381023910240102411024210243102441024510246102471024810249102501025110252102531025410255102561025710258102591026010261102621026310264102651026610267102681026910270102711027210273102741027510276102771027810279102801028110282102831028410285102861028710288102891029010291102921029310294102951029610297102981029910300103011030210303103041030510306103071030810309103101031110312103131031410315103161031710318103191032010321103221032310324103251032610327103281032910330103311033210333103341033510336103371033810339103401034110342103431034410345103461034710348103491035010351103521035310354103551035610357103581035910360103611036210363103641036510366103671036810369103701037110372103731037410375103761037710378103791038010381103821038310384103851038610387103881038910390103911039210393103941039510396103971039810399104001040110402104031040410405104061040710408104091041010411104121041310414104151041610417104181041910420104211042210423104241042510426104271042810429104301043110432104331043410435104361043710438104391044010441104421044310444104451044610447104481044910450104511045210453104541045510456104571045810459104601046110462104631046410465104661046710468104691047010471104721047310474104751047610477104781047910480104811048210483104841048510486104871048810489104901049110492104931049410495104961049710498104991050010501105021050310504105051050610507105081050910510105111051210513105141051510516105171051810519105201052110522105231052410525105261052710528105291053010531105321053310534105351053610537105381053910540105411054210543105441054510546105471054810549105501055110552105531055410555105561055710558105591056010561105621056310564105651056610567105681056910570105711057210573105741057510576105771057810579105801058110582105831058410585105861058710588105891059010591105921059310594105951059610597105981059910600106011060210603106041060510606106071060810609106101061110612106131061410615106161061710618106191062010621106221062310624106251062610627106281062910630106311063210633106341063510636106371063810639106401064110642106431064410645106461064710648106491065010651106521065310654106551065610657106581065910660106611066210663106641066510666106671066810669106701067110672106731067410675106761067710678106791068010681106821068310684106851068610687106881068910690106911069210693106941069510696106971069810699107001070110702107031070410705107061070710708107091071010711107121071310714107151071610717107181071910720107211072210723107241072510726107271072810729107301073110732107331073410735107361073710738107391074010741107421074310744107451074610747107481074910750107511075210753107541075510756107571075810759107601076110762107631076410765107661076710768107691077010771107721077310774107751077610777107781077910780107811078210783107841078510786107871078810789107901079110792107931079410795107961079710798107991080010801108021080310804108051080610807108081080910810108111081210813108141081510816108171081810819108201082110822108231082410825108261082710828108291083010831108321083310834108351083610837108381083910840108411084210843108441084510846108471084810849108501085110852108531085410855108561085710858108591086010861108621086310864108651086610867108681086910870108711087210873108741087510876108771087810879108801088110882108831088410885108861088710888108891089010891108921089310894108951089610897108981089910900109011090210903109041090510906109071090810909109101091110912109131091410915109161091710918109191092010921109221092310924109251092610927109281092910930109311093210933109341093510936109371093810939109401094110942109431094410945109461094710948109491095010951109521095310954109551095610957109581095910960109611096210963109641096510966109671096810969109701097110972109731097410975109761097710978109791098010981109821098310984109851098610987109881098910990109911099210993109941099510996109971099810999110001100111002110031100411005110061100711008110091101011011110121101311014110151101611017110181101911020110211102211023110241102511026110271102811029110301103111032110331103411035110361103711038110391104011041110421104311044110451104611047110481104911050110511105211053110541105511056110571105811059110601106111062110631106411065110661106711068110691107011071110721107311074110751107611077110781107911080110811108211083110841108511086110871108811089110901109111092110931109411095110961109711098110991110011101111021110311104111051110611107111081110911110111111111211113111141111511116111171111811119111201112111122111231112411125111261112711128111291113011131111321113311134111351113611137111381113911140111411114211143111441114511146111471114811149111501115111152111531115411155111561115711158111591116011161111621116311164111651116611167111681116911170111711117211173111741117511176111771117811179111801118111182111831118411185111861118711188111891119011191111921119311194111951119611197111981119911200112011120211203112041120511206112071120811209112101121111212112131121411215112161121711218112191122011221112221122311224112251122611227112281122911230112311123211233112341123511236112371123811239112401124111242112431124411245112461124711248112491125011251112521125311254112551125611257112581125911260112611126211263112641126511266112671126811269112701127111272112731127411275112761127711278112791128011281112821128311284112851128611287112881128911290112911129211293112941129511296112971129811299113001130111302113031130411305113061130711308113091131011311113121131311314113151131611317113181131911320113211132211323113241132511326113271132811329113301133111332113331133411335113361133711338113391134011341113421134311344113451134611347113481134911350113511135211353113541135511356113571135811359113601136111362113631136411365113661136711368113691137011371113721137311374113751137611377113781137911380113811138211383113841138511386113871138811389113901139111392113931139411395113961139711398113991140011401114021140311404114051140611407114081140911410114111141211413114141141511416114171141811419114201142111422114231142411425114261142711428114291143011431114321143311434114351143611437114381143911440114411144211443114441144511446114471144811449114501145111452114531145411455114561145711458114591146011461114621146311464114651146611467114681146911470114711147211473114741147511476114771147811479114801148111482114831148411485114861148711488114891149011491114921149311494114951149611497114981149911500115011150211503115041150511506115071150811509115101151111512115131151411515115161151711518115191152011521115221152311524115251152611527115281152911530115311153211533115341153511536115371153811539115401154111542115431154411545115461154711548115491155011551115521155311554115551155611557115581155911560115611156211563115641156511566115671156811569115701157111572115731157411575115761157711578115791158011581115821158311584115851158611587115881158911590115911159211593115941159511596115971159811599116001160111602116031160411605116061160711608116091161011611116121161311614116151161611617116181161911620116211162211623116241162511626116271162811629116301163111632116331163411635116361163711638116391164011641116421164311644116451164611647116481164911650116511165211653116541165511656116571165811659116601166111662116631166411665116661166711668116691167011671116721167311674116751167611677116781167911680116811168211683116841168511686116871168811689116901169111692116931169411695116961169711698116991170011701117021170311704117051170611707117081170911710117111171211713117141171511716117171171811719117201172111722117231172411725117261172711728117291173011731117321173311734117351173611737117381173911740117411174211743117441174511746117471174811749117501175111752117531175411755117561175711758117591176011761117621176311764117651176611767117681176911770117711177211773117741177511776117771177811779117801178111782117831178411785117861178711788117891179011791117921179311794117951179611797117981179911800118011180211803118041180511806118071180811809118101181111812118131181411815118161181711818118191182011821118221182311824118251182611827118281182911830118311183211833118341183511836118371183811839118401184111842118431184411845118461184711848118491185011851118521185311854118551185611857118581185911860118611186211863118641186511866118671186811869118701187111872118731187411875118761187711878118791188011881118821188311884118851188611887118881188911890118911189211893118941189511896118971189811899119001190111902119031190411905119061190711908119091191011911119121191311914119151191611917119181191911920119211192211923119241192511926119271192811929119301193111932119331193411935119361193711938119391194011941119421194311944119451194611947119481194911950119511195211953119541195511956119571195811959119601196111962119631196411965119661196711968119691197011971119721197311974119751197611977119781197911980119811198211983119841198511986119871198811989119901199111992119931199411995119961199711998119991200012001120021200312004120051200612007120081200912010120111201212013120141201512016120171201812019120201202112022120231202412025120261202712028120291203012031120321203312034120351203612037120381203912040120411204212043120441204512046120471204812049120501205112052120531205412055120561205712058120591206012061120621206312064120651206612067120681206912070120711207212073120741207512076120771207812079120801208112082120831208412085120861208712088120891209012091120921209312094120951209612097120981209912100121011210212103121041210512106121071210812109121101211112112121131211412115121161211712118121191212012121121221212312124121251212612127121281212912130121311213212133121341213512136121371213812139121401214112142121431214412145121461214712148121491215012151121521215312154121551215612157121581215912160121611216212163121641216512166121671216812169121701217112172121731217412175121761217712178121791218012181121821218312184121851218612187121881218912190121911219212193121941219512196121971219812199122001220112202122031220412205122061220712208122091221012211122121221312214122151221612217122181221912220122211222212223122241222512226122271222812229122301223112232122331223412235122361223712238122391224012241122421224312244122451224612247122481224912250122511225212253122541225512256122571225812259122601226112262122631226412265
  1. /* Run the Expat test suite
  2. __ __ _
  3. ___\ \/ /_ __ __ _| |_
  4. / _ \\ /| '_ \ / _` | __|
  5. | __// \| |_) | (_| | |_
  6. \___/_/\_\ .__/ \__,_|\__|
  7. |_| XML parser
  8. Copyright (c) 2001-2006 Fred L. Drake, Jr. <[email protected]>
  9. Copyright (c) 2003 Greg Stein <[email protected]>
  10. Copyright (c) 2005-2007 Steven Solie <[email protected]>
  11. Copyright (c) 2005-2012 Karl Waclawek <[email protected]>
  12. Copyright (c) 2016-2022 Sebastian Pipping <[email protected]>
  13. Copyright (c) 2017-2018 Rhodri James <[email protected]>
  14. Copyright (c) 2017 Joe Orton <[email protected]>
  15. Copyright (c) 2017 José Gutiérrez de la Concha <[email protected]>
  16. Copyright (c) 2018 Marco Maggi <[email protected]>
  17. Copyright (c) 2019 David Loffredo <[email protected]>
  18. Copyright (c) 2020 Tim Gates <[email protected]>
  19. Copyright (c) 2021 Dong-hee Na <[email protected]>
  20. Licensed under the MIT license:
  21. Permission is hereby granted, free of charge, to any person obtaining
  22. a copy of this software and associated documentation files (the
  23. "Software"), to deal in the Software without restriction, including
  24. without limitation the rights to use, copy, modify, merge, publish,
  25. distribute, sublicense, and/or sell copies of the Software, and to permit
  26. persons to whom the Software is furnished to do so, subject to the
  27. following conditions:
  28. The above copyright notice and this permission notice shall be included
  29. in all copies or substantial portions of the Software.
  30. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  31. EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  32. MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
  33. NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
  34. DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
  35. OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
  36. USE OR OTHER DEALINGS IN THE SOFTWARE.
  37. */
  38. #include <expat_config.h>
  39. #if defined(NDEBUG)
  40. # undef NDEBUG /* because test suite relies on assert(...) at the moment */
  41. #endif
  42. #include <assert.h>
  43. #include <stdlib.h>
  44. #include <stdio.h>
  45. #include <string.h>
  46. #include <stddef.h> /* ptrdiff_t */
  47. #include <ctype.h>
  48. #include <limits.h>
  49. #include <stdint.h> /* intptr_t uint64_t */
  50. #include <math.h> /* NAN, INFINITY, isnan */
  51. #if ! defined(__cplusplus)
  52. # include <stdbool.h>
  53. #endif
  54. #include "expat.h"
  55. #include "chardata.h"
  56. #include "structdata.h"
  57. #include "internal.h"
  58. #include "minicheck.h"
  59. #include "memcheck.h"
  60. #include "siphash.h"
  61. #include "ascii.h" /* for ASCII_xxx */
  62. #ifdef XML_LARGE_SIZE
  63. # define XML_FMT_INT_MOD "ll"
  64. #else
  65. # define XML_FMT_INT_MOD "l"
  66. #endif
  67. #ifdef XML_UNICODE_WCHAR_T
  68. # define XML_FMT_CHAR "lc"
  69. # define XML_FMT_STR "ls"
  70. # include <wchar.h>
  71. # define xcstrlen(s) wcslen(s)
  72. # define xcstrcmp(s, t) wcscmp((s), (t))
  73. # define xcstrncmp(s, t, n) wcsncmp((s), (t), (n))
  74. # define XCS(s) _XCS(s)
  75. # define _XCS(s) L##s
  76. #else
  77. # ifdef XML_UNICODE
  78. # error "No support for UTF-16 character without wchar_t in tests"
  79. # else
  80. # define XML_FMT_CHAR "c"
  81. # define XML_FMT_STR "s"
  82. # define xcstrlen(s) strlen(s)
  83. # define xcstrcmp(s, t) strcmp((s), (t))
  84. # define xcstrncmp(s, t, n) strncmp((s), (t), (n))
  85. # define XCS(s) s
  86. # endif /* XML_UNICODE */
  87. #endif /* XML_UNICODE_WCHAR_T */
  88. static XML_Parser g_parser = NULL;
  89. static void
  90. tcase_add_test__ifdef_xml_dtd(TCase *tc, tcase_test_function test) {
  91. #ifdef XML_DTD
  92. tcase_add_test(tc, test);
  93. #else
  94. UNUSED_P(tc);
  95. UNUSED_P(test);
  96. #endif
  97. }
  98. static void
  99. basic_setup(void) {
  100. g_parser = XML_ParserCreate(NULL);
  101. if (g_parser == NULL)
  102. fail("Parser not created.");
  103. }
  104. static void
  105. basic_teardown(void) {
  106. if (g_parser != NULL) {
  107. XML_ParserFree(g_parser);
  108. g_parser = NULL;
  109. }
  110. }
  111. /* Generate a failure using the parser state to create an error message;
  112. this should be used when the parser reports an error we weren't
  113. expecting.
  114. */
  115. static void
  116. _xml_failure(XML_Parser parser, const char *file, int line) {
  117. char buffer[1024];
  118. enum XML_Error err = XML_GetErrorCode(parser);
  119. sprintf(buffer,
  120. " %d: %" XML_FMT_STR " (line %" XML_FMT_INT_MOD
  121. "u, offset %" XML_FMT_INT_MOD "u)\n reported from %s, line %d\n",
  122. err, XML_ErrorString(err), XML_GetCurrentLineNumber(parser),
  123. XML_GetCurrentColumnNumber(parser), file, line);
  124. _fail_unless(0, file, line, buffer);
  125. }
  126. static enum XML_Status
  127. _XML_Parse_SINGLE_BYTES(XML_Parser parser, const char *s, int len,
  128. int isFinal) {
  129. enum XML_Status res = XML_STATUS_ERROR;
  130. int offset = 0;
  131. if (len == 0) {
  132. return XML_Parse(parser, s, len, isFinal);
  133. }
  134. for (; offset < len; offset++) {
  135. const int innerIsFinal = (offset == len - 1) && isFinal;
  136. const char c = s[offset]; /* to help out-of-bounds detection */
  137. res = XML_Parse(parser, &c, sizeof(char), innerIsFinal);
  138. if (res != XML_STATUS_OK) {
  139. return res;
  140. }
  141. }
  142. return res;
  143. }
  144. #define xml_failure(parser) _xml_failure((parser), __FILE__, __LINE__)
  145. static void
  146. _expect_failure(const char *text, enum XML_Error errorCode,
  147. const char *errorMessage, const char *file, int lineno) {
  148. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  149. == XML_STATUS_OK)
  150. /* Hackish use of _fail_unless() macro, but let's us report
  151. the right filename and line number. */
  152. _fail_unless(0, file, lineno, errorMessage);
  153. if (XML_GetErrorCode(g_parser) != errorCode)
  154. _xml_failure(g_parser, file, lineno);
  155. }
  156. #define expect_failure(text, errorCode, errorMessage) \
  157. _expect_failure((text), (errorCode), (errorMessage), __FILE__, __LINE__)
  158. /* Dummy handlers for when we need to set a handler to tickle a bug,
  159. but it doesn't need to do anything.
  160. */
  161. static unsigned long dummy_handler_flags = 0;
  162. #define DUMMY_START_DOCTYPE_HANDLER_FLAG (1UL << 0)
  163. #define DUMMY_END_DOCTYPE_HANDLER_FLAG (1UL << 1)
  164. #define DUMMY_ENTITY_DECL_HANDLER_FLAG (1UL << 2)
  165. #define DUMMY_NOTATION_DECL_HANDLER_FLAG (1UL << 3)
  166. #define DUMMY_ELEMENT_DECL_HANDLER_FLAG (1UL << 4)
  167. #define DUMMY_ATTLIST_DECL_HANDLER_FLAG (1UL << 5)
  168. #define DUMMY_COMMENT_HANDLER_FLAG (1UL << 6)
  169. #define DUMMY_PI_HANDLER_FLAG (1UL << 7)
  170. #define DUMMY_START_ELEMENT_HANDLER_FLAG (1UL << 8)
  171. #define DUMMY_START_CDATA_HANDLER_FLAG (1UL << 9)
  172. #define DUMMY_END_CDATA_HANDLER_FLAG (1UL << 10)
  173. #define DUMMY_UNPARSED_ENTITY_DECL_HANDLER_FLAG (1UL << 11)
  174. #define DUMMY_START_NS_DECL_HANDLER_FLAG (1UL << 12)
  175. #define DUMMY_END_NS_DECL_HANDLER_FLAG (1UL << 13)
  176. #define DUMMY_START_DOCTYPE_DECL_HANDLER_FLAG (1UL << 14)
  177. #define DUMMY_END_DOCTYPE_DECL_HANDLER_FLAG (1UL << 15)
  178. #define DUMMY_SKIP_HANDLER_FLAG (1UL << 16)
  179. #define DUMMY_DEFAULT_HANDLER_FLAG (1UL << 17)
  180. static void XMLCALL
  181. dummy_xdecl_handler(void *userData, const XML_Char *version,
  182. const XML_Char *encoding, int standalone) {
  183. UNUSED_P(userData);
  184. UNUSED_P(version);
  185. UNUSED_P(encoding);
  186. UNUSED_P(standalone);
  187. }
  188. static void XMLCALL
  189. dummy_start_doctype_handler(void *userData, const XML_Char *doctypeName,
  190. const XML_Char *sysid, const XML_Char *pubid,
  191. int has_internal_subset) {
  192. UNUSED_P(userData);
  193. UNUSED_P(doctypeName);
  194. UNUSED_P(sysid);
  195. UNUSED_P(pubid);
  196. UNUSED_P(has_internal_subset);
  197. dummy_handler_flags |= DUMMY_START_DOCTYPE_HANDLER_FLAG;
  198. }
  199. static void XMLCALL
  200. dummy_end_doctype_handler(void *userData) {
  201. UNUSED_P(userData);
  202. dummy_handler_flags |= DUMMY_END_DOCTYPE_HANDLER_FLAG;
  203. }
  204. static void XMLCALL
  205. dummy_entity_decl_handler(void *userData, const XML_Char *entityName,
  206. int is_parameter_entity, const XML_Char *value,
  207. int value_length, const XML_Char *base,
  208. const XML_Char *systemId, const XML_Char *publicId,
  209. const XML_Char *notationName) {
  210. UNUSED_P(userData);
  211. UNUSED_P(entityName);
  212. UNUSED_P(is_parameter_entity);
  213. UNUSED_P(value);
  214. UNUSED_P(value_length);
  215. UNUSED_P(base);
  216. UNUSED_P(systemId);
  217. UNUSED_P(publicId);
  218. UNUSED_P(notationName);
  219. dummy_handler_flags |= DUMMY_ENTITY_DECL_HANDLER_FLAG;
  220. }
  221. static void XMLCALL
  222. dummy_notation_decl_handler(void *userData, const XML_Char *notationName,
  223. const XML_Char *base, const XML_Char *systemId,
  224. const XML_Char *publicId) {
  225. UNUSED_P(userData);
  226. UNUSED_P(notationName);
  227. UNUSED_P(base);
  228. UNUSED_P(systemId);
  229. UNUSED_P(publicId);
  230. dummy_handler_flags |= DUMMY_NOTATION_DECL_HANDLER_FLAG;
  231. }
  232. static void XMLCALL
  233. dummy_element_decl_handler(void *userData, const XML_Char *name,
  234. XML_Content *model) {
  235. UNUSED_P(userData);
  236. UNUSED_P(name);
  237. /* The content model must be freed by the handler. Unfortunately
  238. * we cannot pass the parser as the userData because this is used
  239. * with other handlers that require other userData.
  240. */
  241. XML_FreeContentModel(g_parser, model);
  242. dummy_handler_flags |= DUMMY_ELEMENT_DECL_HANDLER_FLAG;
  243. }
  244. static void XMLCALL
  245. dummy_attlist_decl_handler(void *userData, const XML_Char *elname,
  246. const XML_Char *attname, const XML_Char *att_type,
  247. const XML_Char *dflt, int isrequired) {
  248. UNUSED_P(userData);
  249. UNUSED_P(elname);
  250. UNUSED_P(attname);
  251. UNUSED_P(att_type);
  252. UNUSED_P(dflt);
  253. UNUSED_P(isrequired);
  254. dummy_handler_flags |= DUMMY_ATTLIST_DECL_HANDLER_FLAG;
  255. }
  256. static void XMLCALL
  257. dummy_comment_handler(void *userData, const XML_Char *data) {
  258. UNUSED_P(userData);
  259. UNUSED_P(data);
  260. dummy_handler_flags |= DUMMY_COMMENT_HANDLER_FLAG;
  261. }
  262. static void XMLCALL
  263. dummy_pi_handler(void *userData, const XML_Char *target, const XML_Char *data) {
  264. UNUSED_P(userData);
  265. UNUSED_P(target);
  266. UNUSED_P(data);
  267. dummy_handler_flags |= DUMMY_PI_HANDLER_FLAG;
  268. }
  269. static void XMLCALL
  270. dummy_start_element(void *userData, const XML_Char *name,
  271. const XML_Char **atts) {
  272. UNUSED_P(userData);
  273. UNUSED_P(name);
  274. UNUSED_P(atts);
  275. dummy_handler_flags |= DUMMY_START_ELEMENT_HANDLER_FLAG;
  276. }
  277. static void XMLCALL
  278. dummy_end_element(void *userData, const XML_Char *name) {
  279. UNUSED_P(userData);
  280. UNUSED_P(name);
  281. }
  282. static void XMLCALL
  283. dummy_start_cdata_handler(void *userData) {
  284. UNUSED_P(userData);
  285. dummy_handler_flags |= DUMMY_START_CDATA_HANDLER_FLAG;
  286. }
  287. static void XMLCALL
  288. dummy_end_cdata_handler(void *userData) {
  289. UNUSED_P(userData);
  290. dummy_handler_flags |= DUMMY_END_CDATA_HANDLER_FLAG;
  291. }
  292. static void XMLCALL
  293. dummy_cdata_handler(void *userData, const XML_Char *s, int len) {
  294. UNUSED_P(userData);
  295. UNUSED_P(s);
  296. UNUSED_P(len);
  297. }
  298. static void XMLCALL
  299. dummy_start_namespace_decl_handler(void *userData, const XML_Char *prefix,
  300. const XML_Char *uri) {
  301. UNUSED_P(userData);
  302. UNUSED_P(prefix);
  303. UNUSED_P(uri);
  304. dummy_handler_flags |= DUMMY_START_NS_DECL_HANDLER_FLAG;
  305. }
  306. static void XMLCALL
  307. dummy_end_namespace_decl_handler(void *userData, const XML_Char *prefix) {
  308. UNUSED_P(userData);
  309. UNUSED_P(prefix);
  310. dummy_handler_flags |= DUMMY_END_NS_DECL_HANDLER_FLAG;
  311. }
  312. /* This handler is obsolete, but while the code exists we should
  313. * ensure that dealing with the handler is covered by tests.
  314. */
  315. static void XMLCALL
  316. dummy_unparsed_entity_decl_handler(void *userData, const XML_Char *entityName,
  317. const XML_Char *base,
  318. const XML_Char *systemId,
  319. const XML_Char *publicId,
  320. const XML_Char *notationName) {
  321. UNUSED_P(userData);
  322. UNUSED_P(entityName);
  323. UNUSED_P(base);
  324. UNUSED_P(systemId);
  325. UNUSED_P(publicId);
  326. UNUSED_P(notationName);
  327. dummy_handler_flags |= DUMMY_UNPARSED_ENTITY_DECL_HANDLER_FLAG;
  328. }
  329. static void XMLCALL
  330. dummy_default_handler(void *userData, const XML_Char *s, int len) {
  331. UNUSED_P(userData);
  332. UNUSED_P(s);
  333. UNUSED_P(len);
  334. }
  335. static void XMLCALL
  336. dummy_start_doctype_decl_handler(void *userData, const XML_Char *doctypeName,
  337. const XML_Char *sysid, const XML_Char *pubid,
  338. int has_internal_subset) {
  339. UNUSED_P(userData);
  340. UNUSED_P(doctypeName);
  341. UNUSED_P(sysid);
  342. UNUSED_P(pubid);
  343. UNUSED_P(has_internal_subset);
  344. dummy_handler_flags |= DUMMY_START_DOCTYPE_DECL_HANDLER_FLAG;
  345. }
  346. static void XMLCALL
  347. dummy_end_doctype_decl_handler(void *userData) {
  348. UNUSED_P(userData);
  349. dummy_handler_flags |= DUMMY_END_DOCTYPE_DECL_HANDLER_FLAG;
  350. }
  351. static void XMLCALL
  352. dummy_skip_handler(void *userData, const XML_Char *entityName,
  353. int is_parameter_entity) {
  354. UNUSED_P(userData);
  355. UNUSED_P(entityName);
  356. UNUSED_P(is_parameter_entity);
  357. dummy_handler_flags |= DUMMY_SKIP_HANDLER_FLAG;
  358. }
  359. /* Useful external entity handler */
  360. typedef struct ExtOption {
  361. const XML_Char *system_id;
  362. const char *parse_text;
  363. } ExtOption;
  364. static int XMLCALL
  365. external_entity_optioner(XML_Parser parser, const XML_Char *context,
  366. const XML_Char *base, const XML_Char *systemId,
  367. const XML_Char *publicId) {
  368. ExtOption *options = (ExtOption *)XML_GetUserData(parser);
  369. XML_Parser ext_parser;
  370. UNUSED_P(base);
  371. UNUSED_P(publicId);
  372. while (options->parse_text != NULL) {
  373. if (! xcstrcmp(systemId, options->system_id)) {
  374. enum XML_Status rc;
  375. ext_parser = XML_ExternalEntityParserCreate(parser, context, NULL);
  376. if (ext_parser == NULL)
  377. return XML_STATUS_ERROR;
  378. rc = _XML_Parse_SINGLE_BYTES(ext_parser, options->parse_text,
  379. (int)strlen(options->parse_text), XML_TRUE);
  380. XML_ParserFree(ext_parser);
  381. return rc;
  382. }
  383. options++;
  384. }
  385. fail("No suitable option found");
  386. return XML_STATUS_ERROR;
  387. }
  388. /*
  389. * Parameter entity evaluation support.
  390. */
  391. #define ENTITY_MATCH_FAIL (-1)
  392. #define ENTITY_MATCH_NOT_FOUND (0)
  393. #define ENTITY_MATCH_SUCCESS (1)
  394. static const XML_Char *entity_name_to_match = NULL;
  395. static const XML_Char *entity_value_to_match = NULL;
  396. static int entity_match_flag = ENTITY_MATCH_NOT_FOUND;
  397. static void XMLCALL
  398. param_entity_match_handler(void *userData, const XML_Char *entityName,
  399. int is_parameter_entity, const XML_Char *value,
  400. int value_length, const XML_Char *base,
  401. const XML_Char *systemId, const XML_Char *publicId,
  402. const XML_Char *notationName) {
  403. UNUSED_P(userData);
  404. UNUSED_P(base);
  405. UNUSED_P(systemId);
  406. UNUSED_P(publicId);
  407. UNUSED_P(notationName);
  408. if (! is_parameter_entity || entity_name_to_match == NULL
  409. || entity_value_to_match == NULL) {
  410. return;
  411. }
  412. if (! xcstrcmp(entityName, entity_name_to_match)) {
  413. /* The cast here is safe because we control the horizontal and
  414. * the vertical, and we therefore know our strings are never
  415. * going to overflow an int.
  416. */
  417. if (value_length != (int)xcstrlen(entity_value_to_match)
  418. || xcstrncmp(value, entity_value_to_match, value_length)) {
  419. entity_match_flag = ENTITY_MATCH_FAIL;
  420. } else {
  421. entity_match_flag = ENTITY_MATCH_SUCCESS;
  422. }
  423. }
  424. /* Else leave the match flag alone */
  425. }
  426. /*
  427. * Character & encoding tests.
  428. */
  429. START_TEST(test_nul_byte) {
  430. char text[] = "<doc>\0</doc>";
  431. /* test that a NUL byte (in US-ASCII data) is an error */
  432. if (_XML_Parse_SINGLE_BYTES(g_parser, text, sizeof(text) - 1, XML_TRUE)
  433. == XML_STATUS_OK)
  434. fail("Parser did not report error on NUL-byte.");
  435. if (XML_GetErrorCode(g_parser) != XML_ERROR_INVALID_TOKEN)
  436. xml_failure(g_parser);
  437. }
  438. END_TEST
  439. START_TEST(test_u0000_char) {
  440. /* test that a NUL byte (in US-ASCII data) is an error */
  441. expect_failure("<doc>&#0;</doc>", XML_ERROR_BAD_CHAR_REF,
  442. "Parser did not report error on NUL-byte.");
  443. }
  444. END_TEST
  445. START_TEST(test_siphash_self) {
  446. if (! sip24_valid())
  447. fail("SipHash self-test failed");
  448. }
  449. END_TEST
  450. START_TEST(test_siphash_spec) {
  451. /* https://131002.net/siphash/siphash.pdf (page 19, "Test values") */
  452. const char message[] = "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09"
  453. "\x0a\x0b\x0c\x0d\x0e";
  454. const size_t len = sizeof(message) - 1;
  455. const uint64_t expected = _SIP_ULL(0xa129ca61U, 0x49be45e5U);
  456. struct siphash state;
  457. struct sipkey key;
  458. sip_tokey(&key, "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09"
  459. "\x0a\x0b\x0c\x0d\x0e\x0f");
  460. sip24_init(&state, &key);
  461. /* Cover spread across calls */
  462. sip24_update(&state, message, 4);
  463. sip24_update(&state, message + 4, len - 4);
  464. /* Cover null length */
  465. sip24_update(&state, message, 0);
  466. if (sip24_final(&state) != expected)
  467. fail("sip24_final failed spec test\n");
  468. /* Cover wrapper */
  469. if (siphash24(message, len, &key) != expected)
  470. fail("siphash24 failed spec test\n");
  471. }
  472. END_TEST
  473. START_TEST(test_bom_utf8) {
  474. /* This test is really just making sure we don't core on a UTF-8 BOM. */
  475. const char *text = "\357\273\277<e/>";
  476. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  477. == XML_STATUS_ERROR)
  478. xml_failure(g_parser);
  479. }
  480. END_TEST
  481. START_TEST(test_bom_utf16_be) {
  482. char text[] = "\376\377\0<\0e\0/\0>";
  483. if (_XML_Parse_SINGLE_BYTES(g_parser, text, sizeof(text) - 1, XML_TRUE)
  484. == XML_STATUS_ERROR)
  485. xml_failure(g_parser);
  486. }
  487. END_TEST
  488. START_TEST(test_bom_utf16_le) {
  489. char text[] = "\377\376<\0e\0/\0>\0";
  490. if (_XML_Parse_SINGLE_BYTES(g_parser, text, sizeof(text) - 1, XML_TRUE)
  491. == XML_STATUS_ERROR)
  492. xml_failure(g_parser);
  493. }
  494. END_TEST
  495. /* Parse whole buffer at once to exercise a different code path */
  496. START_TEST(test_nobom_utf16_le) {
  497. char text[] = " \0<\0e\0/\0>\0";
  498. if (XML_Parse(g_parser, text, sizeof(text) - 1, XML_TRUE) == XML_STATUS_ERROR)
  499. xml_failure(g_parser);
  500. }
  501. END_TEST
  502. static void XMLCALL
  503. accumulate_characters(void *userData, const XML_Char *s, int len) {
  504. CharData_AppendXMLChars((CharData *)userData, s, len);
  505. }
  506. static void XMLCALL
  507. accumulate_attribute(void *userData, const XML_Char *name,
  508. const XML_Char **atts) {
  509. CharData *storage = (CharData *)userData;
  510. UNUSED_P(name);
  511. /* Check there are attributes to deal with */
  512. if (atts == NULL)
  513. return;
  514. while (storage->count < 0 && atts[0] != NULL) {
  515. /* "accumulate" the value of the first attribute we see */
  516. CharData_AppendXMLChars(storage, atts[1], -1);
  517. atts += 2;
  518. }
  519. }
  520. static void
  521. _run_character_check(const char *text, const XML_Char *expected,
  522. const char *file, int line) {
  523. CharData storage;
  524. CharData_Init(&storage);
  525. XML_SetUserData(g_parser, &storage);
  526. XML_SetCharacterDataHandler(g_parser, accumulate_characters);
  527. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  528. == XML_STATUS_ERROR)
  529. _xml_failure(g_parser, file, line);
  530. CharData_CheckXMLChars(&storage, expected);
  531. }
  532. #define run_character_check(text, expected) \
  533. _run_character_check(text, expected, __FILE__, __LINE__)
  534. static void
  535. _run_attribute_check(const char *text, const XML_Char *expected,
  536. const char *file, int line) {
  537. CharData storage;
  538. CharData_Init(&storage);
  539. XML_SetUserData(g_parser, &storage);
  540. XML_SetStartElementHandler(g_parser, accumulate_attribute);
  541. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  542. == XML_STATUS_ERROR)
  543. _xml_failure(g_parser, file, line);
  544. CharData_CheckXMLChars(&storage, expected);
  545. }
  546. #define run_attribute_check(text, expected) \
  547. _run_attribute_check(text, expected, __FILE__, __LINE__)
  548. typedef struct ExtTest {
  549. const char *parse_text;
  550. const XML_Char *encoding;
  551. CharData *storage;
  552. } ExtTest;
  553. static void XMLCALL
  554. ext_accumulate_characters(void *userData, const XML_Char *s, int len) {
  555. ExtTest *test_data = (ExtTest *)userData;
  556. accumulate_characters(test_data->storage, s, len);
  557. }
  558. static void
  559. _run_ext_character_check(const char *text, ExtTest *test_data,
  560. const XML_Char *expected, const char *file, int line) {
  561. CharData *const storage = (CharData *)malloc(sizeof(CharData));
  562. CharData_Init(storage);
  563. test_data->storage = storage;
  564. XML_SetUserData(g_parser, test_data);
  565. XML_SetCharacterDataHandler(g_parser, ext_accumulate_characters);
  566. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  567. == XML_STATUS_ERROR)
  568. _xml_failure(g_parser, file, line);
  569. CharData_CheckXMLChars(storage, expected);
  570. free(storage);
  571. }
  572. #define run_ext_character_check(text, test_data, expected) \
  573. _run_ext_character_check(text, test_data, expected, __FILE__, __LINE__)
  574. /* Regression test for SF bug #491986. */
  575. START_TEST(test_danish_latin1) {
  576. const char *text = "<?xml version='1.0' encoding='iso-8859-1'?>\n"
  577. "<e>J\xF8rgen \xE6\xF8\xE5\xC6\xD8\xC5</e>";
  578. #ifdef XML_UNICODE
  579. const XML_Char *expected
  580. = XCS("J\x00f8rgen \x00e6\x00f8\x00e5\x00c6\x00d8\x00c5");
  581. #else
  582. const XML_Char *expected
  583. = XCS("J\xC3\xB8rgen \xC3\xA6\xC3\xB8\xC3\xA5\xC3\x86\xC3\x98\xC3\x85");
  584. #endif
  585. run_character_check(text, expected);
  586. }
  587. END_TEST
  588. /* Regression test for SF bug #514281. */
  589. START_TEST(test_french_charref_hexidecimal) {
  590. const char *text = "<?xml version='1.0' encoding='iso-8859-1'?>\n"
  591. "<doc>&#xE9;&#xE8;&#xE0;&#xE7;&#xEA;&#xC8;</doc>";
  592. #ifdef XML_UNICODE
  593. const XML_Char *expected = XCS("\x00e9\x00e8\x00e0\x00e7\x00ea\x00c8");
  594. #else
  595. const XML_Char *expected
  596. = XCS("\xC3\xA9\xC3\xA8\xC3\xA0\xC3\xA7\xC3\xAA\xC3\x88");
  597. #endif
  598. run_character_check(text, expected);
  599. }
  600. END_TEST
  601. START_TEST(test_french_charref_decimal) {
  602. const char *text = "<?xml version='1.0' encoding='iso-8859-1'?>\n"
  603. "<doc>&#233;&#232;&#224;&#231;&#234;&#200;</doc>";
  604. #ifdef XML_UNICODE
  605. const XML_Char *expected = XCS("\x00e9\x00e8\x00e0\x00e7\x00ea\x00c8");
  606. #else
  607. const XML_Char *expected
  608. = XCS("\xC3\xA9\xC3\xA8\xC3\xA0\xC3\xA7\xC3\xAA\xC3\x88");
  609. #endif
  610. run_character_check(text, expected);
  611. }
  612. END_TEST
  613. START_TEST(test_french_latin1) {
  614. const char *text = "<?xml version='1.0' encoding='iso-8859-1'?>\n"
  615. "<doc>\xE9\xE8\xE0\xE7\xEa\xC8</doc>";
  616. #ifdef XML_UNICODE
  617. const XML_Char *expected = XCS("\x00e9\x00e8\x00e0\x00e7\x00ea\x00c8");
  618. #else
  619. const XML_Char *expected
  620. = XCS("\xC3\xA9\xC3\xA8\xC3\xA0\xC3\xA7\xC3\xAA\xC3\x88");
  621. #endif
  622. run_character_check(text, expected);
  623. }
  624. END_TEST
  625. START_TEST(test_french_utf8) {
  626. const char *text = "<?xml version='1.0' encoding='utf-8'?>\n"
  627. "<doc>\xC3\xA9</doc>";
  628. #ifdef XML_UNICODE
  629. const XML_Char *expected = XCS("\x00e9");
  630. #else
  631. const XML_Char *expected = XCS("\xC3\xA9");
  632. #endif
  633. run_character_check(text, expected);
  634. }
  635. END_TEST
  636. /* Regression test for SF bug #600479.
  637. XXX There should be a test that exercises all legal XML Unicode
  638. characters as PCDATA and attribute value content, and XML Name
  639. characters as part of element and attribute names.
  640. */
  641. START_TEST(test_utf8_false_rejection) {
  642. const char *text = "<doc>\xEF\xBA\xBF</doc>";
  643. #ifdef XML_UNICODE
  644. const XML_Char *expected = XCS("\xfebf");
  645. #else
  646. const XML_Char *expected = XCS("\xEF\xBA\xBF");
  647. #endif
  648. run_character_check(text, expected);
  649. }
  650. END_TEST
  651. /* Regression test for SF bug #477667.
  652. This test assures that any 8-bit character followed by a 7-bit
  653. character will not be mistakenly interpreted as a valid UTF-8
  654. sequence.
  655. */
  656. START_TEST(test_illegal_utf8) {
  657. char text[100];
  658. int i;
  659. for (i = 128; i <= 255; ++i) {
  660. sprintf(text, "<e>%ccd</e>", i);
  661. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  662. == XML_STATUS_OK) {
  663. sprintf(text, "expected token error for '%c' (ordinal %d) in UTF-8 text",
  664. i, i);
  665. fail(text);
  666. } else if (XML_GetErrorCode(g_parser) != XML_ERROR_INVALID_TOKEN)
  667. xml_failure(g_parser);
  668. /* Reset the parser since we use the same parser repeatedly. */
  669. XML_ParserReset(g_parser, NULL);
  670. }
  671. }
  672. END_TEST
  673. /* Examples, not masks: */
  674. #define UTF8_LEAD_1 "\x7f" /* 0b01111111 */
  675. #define UTF8_LEAD_2 "\xdf" /* 0b11011111 */
  676. #define UTF8_LEAD_3 "\xef" /* 0b11101111 */
  677. #define UTF8_LEAD_4 "\xf7" /* 0b11110111 */
  678. #define UTF8_FOLLOW "\xbf" /* 0b10111111 */
  679. START_TEST(test_utf8_auto_align) {
  680. struct TestCase {
  681. ptrdiff_t expectedMovementInChars;
  682. const char *input;
  683. };
  684. struct TestCase cases[] = {
  685. {00, ""},
  686. {00, UTF8_LEAD_1},
  687. {-1, UTF8_LEAD_2},
  688. {00, UTF8_LEAD_2 UTF8_FOLLOW},
  689. {-1, UTF8_LEAD_3},
  690. {-2, UTF8_LEAD_3 UTF8_FOLLOW},
  691. {00, UTF8_LEAD_3 UTF8_FOLLOW UTF8_FOLLOW},
  692. {-1, UTF8_LEAD_4},
  693. {-2, UTF8_LEAD_4 UTF8_FOLLOW},
  694. {-3, UTF8_LEAD_4 UTF8_FOLLOW UTF8_FOLLOW},
  695. {00, UTF8_LEAD_4 UTF8_FOLLOW UTF8_FOLLOW UTF8_FOLLOW},
  696. };
  697. size_t i = 0;
  698. bool success = true;
  699. for (; i < sizeof(cases) / sizeof(*cases); i++) {
  700. const char *fromLim = cases[i].input + strlen(cases[i].input);
  701. const char *const fromLimInitially = fromLim;
  702. ptrdiff_t actualMovementInChars;
  703. _INTERNAL_trim_to_complete_utf8_characters(cases[i].input, &fromLim);
  704. actualMovementInChars = (fromLim - fromLimInitially);
  705. if (actualMovementInChars != cases[i].expectedMovementInChars) {
  706. size_t j = 0;
  707. success = false;
  708. printf("[-] UTF-8 case %2u: Expected movement by %2d chars"
  709. ", actually moved by %2d chars: \"",
  710. (unsigned)(i + 1), (int)cases[i].expectedMovementInChars,
  711. (int)actualMovementInChars);
  712. for (; j < strlen(cases[i].input); j++) {
  713. printf("\\x%02x", (unsigned char)cases[i].input[j]);
  714. }
  715. printf("\"\n");
  716. }
  717. }
  718. if (! success) {
  719. fail("UTF-8 auto-alignment is not bullet-proof\n");
  720. }
  721. }
  722. END_TEST
  723. START_TEST(test_utf16) {
  724. /* <?xml version="1.0" encoding="UTF-16"?>
  725. * <doc a='123'>some {A} text</doc>
  726. *
  727. * where {A} is U+FF21, FULLWIDTH LATIN CAPITAL LETTER A
  728. */
  729. char text[]
  730. = "\000<\000?\000x\000m\000\154\000 \000v\000e\000r\000s\000i\000o"
  731. "\000n\000=\000'\0001\000.\000\060\000'\000 \000e\000n\000c\000o"
  732. "\000d\000i\000n\000g\000=\000'\000U\000T\000F\000-\0001\000\066"
  733. "\000'\000?\000>\000\n"
  734. "\000<\000d\000o\000c\000 \000a\000=\000'\0001\0002\0003\000'\000>"
  735. "\000s\000o\000m\000e\000 \xff\x21\000 \000t\000e\000x\000t\000"
  736. "<\000/\000d\000o\000c\000>";
  737. #ifdef XML_UNICODE
  738. const XML_Char *expected = XCS("some \xff21 text");
  739. #else
  740. const XML_Char *expected = XCS("some \357\274\241 text");
  741. #endif
  742. CharData storage;
  743. CharData_Init(&storage);
  744. XML_SetUserData(g_parser, &storage);
  745. XML_SetCharacterDataHandler(g_parser, accumulate_characters);
  746. if (_XML_Parse_SINGLE_BYTES(g_parser, text, sizeof(text) - 1, XML_TRUE)
  747. == XML_STATUS_ERROR)
  748. xml_failure(g_parser);
  749. CharData_CheckXMLChars(&storage, expected);
  750. }
  751. END_TEST
  752. START_TEST(test_utf16_le_epilog_newline) {
  753. unsigned int first_chunk_bytes = 17;
  754. char text[] = "\xFF\xFE" /* BOM */
  755. "<\000e\000/\000>\000" /* document element */
  756. "\r\000\n\000\r\000\n\000"; /* epilog */
  757. if (first_chunk_bytes >= sizeof(text) - 1)
  758. fail("bad value of first_chunk_bytes");
  759. if (_XML_Parse_SINGLE_BYTES(g_parser, text, first_chunk_bytes, XML_FALSE)
  760. == XML_STATUS_ERROR)
  761. xml_failure(g_parser);
  762. else {
  763. enum XML_Status rc;
  764. rc = _XML_Parse_SINGLE_BYTES(g_parser, text + first_chunk_bytes,
  765. sizeof(text) - first_chunk_bytes - 1,
  766. XML_TRUE);
  767. if (rc == XML_STATUS_ERROR)
  768. xml_failure(g_parser);
  769. }
  770. }
  771. END_TEST
  772. /* Test that an outright lie in the encoding is faulted */
  773. START_TEST(test_not_utf16) {
  774. const char *text = "<?xml version='1.0' encoding='utf-16'?>"
  775. "<doc>Hi</doc>";
  776. /* Use a handler to provoke the appropriate code paths */
  777. XML_SetXmlDeclHandler(g_parser, dummy_xdecl_handler);
  778. expect_failure(text, XML_ERROR_INCORRECT_ENCODING,
  779. "UTF-16 declared in UTF-8 not faulted");
  780. }
  781. END_TEST
  782. /* Test that an unknown encoding is rejected */
  783. START_TEST(test_bad_encoding) {
  784. const char *text = "<doc>Hi</doc>";
  785. if (! XML_SetEncoding(g_parser, XCS("unknown-encoding")))
  786. fail("XML_SetEncoding failed");
  787. expect_failure(text, XML_ERROR_UNKNOWN_ENCODING,
  788. "Unknown encoding not faulted");
  789. }
  790. END_TEST
  791. /* Regression test for SF bug #481609, #774028. */
  792. START_TEST(test_latin1_umlauts) {
  793. const char *text
  794. = "<?xml version='1.0' encoding='iso-8859-1'?>\n"
  795. "<e a='\xE4 \xF6 \xFC &#228; &#246; &#252; &#x00E4; &#x0F6; &#xFC; >'\n"
  796. " >\xE4 \xF6 \xFC &#228; &#246; &#252; &#x00E4; &#x0F6; &#xFC; ></e>";
  797. #ifdef XML_UNICODE
  798. /* Expected results in UTF-16 */
  799. const XML_Char *expected = XCS("\x00e4 \x00f6 \x00fc ")
  800. XCS("\x00e4 \x00f6 \x00fc ") XCS("\x00e4 \x00f6 \x00fc >");
  801. #else
  802. /* Expected results in UTF-8 */
  803. const XML_Char *expected = XCS("\xC3\xA4 \xC3\xB6 \xC3\xBC ")
  804. XCS("\xC3\xA4 \xC3\xB6 \xC3\xBC ") XCS("\xC3\xA4 \xC3\xB6 \xC3\xBC >");
  805. #endif
  806. run_character_check(text, expected);
  807. XML_ParserReset(g_parser, NULL);
  808. run_attribute_check(text, expected);
  809. /* Repeat with a default handler */
  810. XML_ParserReset(g_parser, NULL);
  811. XML_SetDefaultHandler(g_parser, dummy_default_handler);
  812. run_character_check(text, expected);
  813. XML_ParserReset(g_parser, NULL);
  814. XML_SetDefaultHandler(g_parser, dummy_default_handler);
  815. run_attribute_check(text, expected);
  816. }
  817. END_TEST
  818. /* Test that an element name with a 4-byte UTF-8 character is rejected */
  819. START_TEST(test_long_utf8_character) {
  820. const char *text
  821. = "<?xml version='1.0' encoding='utf-8'?>\n"
  822. /* 0xf0 0x90 0x80 0x80 = U+10000, the first Linear B character */
  823. "<do\xf0\x90\x80\x80/>";
  824. expect_failure(text, XML_ERROR_INVALID_TOKEN,
  825. "4-byte UTF-8 character in element name not faulted");
  826. }
  827. END_TEST
  828. /* Test that a long latin-1 attribute (too long to convert in one go)
  829. * is correctly converted
  830. */
  831. START_TEST(test_long_latin1_attribute) {
  832. const char *text
  833. = "<?xml version='1.0' encoding='iso-8859-1'?>\n"
  834. "<doc att='"
  835. /* 64 characters per line */
  836. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  837. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  838. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  839. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  840. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  841. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  842. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  843. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  844. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  845. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  846. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  847. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  848. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  849. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  850. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  851. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
  852. /* Last character splits across a buffer boundary */
  853. "\xe4'>\n</doc>";
  854. const XML_Char *expected =
  855. /* 64 characters per line */
  856. /* clang-format off */
  857. XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
  858. XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
  859. XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
  860. XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
  861. XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
  862. XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
  863. XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
  864. XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
  865. XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
  866. XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
  867. XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
  868. XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
  869. XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
  870. XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
  871. XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
  872. XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO")
  873. /* clang-format on */
  874. #ifdef XML_UNICODE
  875. XCS("\x00e4");
  876. #else
  877. XCS("\xc3\xa4");
  878. #endif
  879. run_attribute_check(text, expected);
  880. }
  881. END_TEST
  882. /* Test that a long ASCII attribute (too long to convert in one go)
  883. * is correctly converted
  884. */
  885. START_TEST(test_long_ascii_attribute) {
  886. const char *text
  887. = "<?xml version='1.0' encoding='us-ascii'?>\n"
  888. "<doc att='"
  889. /* 64 characters per line */
  890. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  891. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  892. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  893. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  894. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  895. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  896. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  897. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  898. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  899. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  900. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  901. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  902. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  903. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  904. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  905. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  906. "01234'>\n</doc>";
  907. const XML_Char *expected =
  908. /* 64 characters per line */
  909. /* clang-format off */
  910. XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
  911. XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
  912. XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
  913. XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
  914. XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
  915. XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
  916. XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
  917. XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
  918. XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
  919. XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
  920. XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
  921. XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
  922. XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
  923. XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
  924. XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
  925. XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
  926. XCS("01234");
  927. /* clang-format on */
  928. run_attribute_check(text, expected);
  929. }
  930. END_TEST
  931. /* Regression test #1 for SF bug #653180. */
  932. START_TEST(test_line_number_after_parse) {
  933. const char *text = "<tag>\n"
  934. "\n"
  935. "\n</tag>";
  936. XML_Size lineno;
  937. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_FALSE)
  938. == XML_STATUS_ERROR)
  939. xml_failure(g_parser);
  940. lineno = XML_GetCurrentLineNumber(g_parser);
  941. if (lineno != 4) {
  942. char buffer[100];
  943. sprintf(buffer, "expected 4 lines, saw %" XML_FMT_INT_MOD "u", lineno);
  944. fail(buffer);
  945. }
  946. }
  947. END_TEST
  948. /* Regression test #2 for SF bug #653180. */
  949. START_TEST(test_column_number_after_parse) {
  950. const char *text = "<tag></tag>";
  951. XML_Size colno;
  952. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_FALSE)
  953. == XML_STATUS_ERROR)
  954. xml_failure(g_parser);
  955. colno = XML_GetCurrentColumnNumber(g_parser);
  956. if (colno != 11) {
  957. char buffer[100];
  958. sprintf(buffer, "expected 11 columns, saw %" XML_FMT_INT_MOD "u", colno);
  959. fail(buffer);
  960. }
  961. }
  962. END_TEST
  963. #define STRUCT_START_TAG 0
  964. #define STRUCT_END_TAG 1
  965. static void XMLCALL
  966. start_element_event_handler2(void *userData, const XML_Char *name,
  967. const XML_Char **attr) {
  968. StructData *storage = (StructData *)userData;
  969. UNUSED_P(attr);
  970. StructData_AddItem(storage, name, XML_GetCurrentColumnNumber(g_parser),
  971. XML_GetCurrentLineNumber(g_parser), STRUCT_START_TAG);
  972. }
  973. static void XMLCALL
  974. end_element_event_handler2(void *userData, const XML_Char *name) {
  975. StructData *storage = (StructData *)userData;
  976. StructData_AddItem(storage, name, XML_GetCurrentColumnNumber(g_parser),
  977. XML_GetCurrentLineNumber(g_parser), STRUCT_END_TAG);
  978. }
  979. /* Regression test #3 for SF bug #653180. */
  980. START_TEST(test_line_and_column_numbers_inside_handlers) {
  981. const char *text = "<a>\n" /* Unix end-of-line */
  982. " <b>\r\n" /* Windows end-of-line */
  983. " <c/>\r" /* Mac OS end-of-line */
  984. " </b>\n"
  985. " <d>\n"
  986. " <f/>\n"
  987. " </d>\n"
  988. "</a>";
  989. const StructDataEntry expected[]
  990. = {{XCS("a"), 0, 1, STRUCT_START_TAG}, {XCS("b"), 2, 2, STRUCT_START_TAG},
  991. {XCS("c"), 4, 3, STRUCT_START_TAG}, {XCS("c"), 8, 3, STRUCT_END_TAG},
  992. {XCS("b"), 2, 4, STRUCT_END_TAG}, {XCS("d"), 2, 5, STRUCT_START_TAG},
  993. {XCS("f"), 4, 6, STRUCT_START_TAG}, {XCS("f"), 8, 6, STRUCT_END_TAG},
  994. {XCS("d"), 2, 7, STRUCT_END_TAG}, {XCS("a"), 0, 8, STRUCT_END_TAG}};
  995. const int expected_count = sizeof(expected) / sizeof(StructDataEntry);
  996. StructData storage;
  997. StructData_Init(&storage);
  998. XML_SetUserData(g_parser, &storage);
  999. XML_SetStartElementHandler(g_parser, start_element_event_handler2);
  1000. XML_SetEndElementHandler(g_parser, end_element_event_handler2);
  1001. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  1002. == XML_STATUS_ERROR)
  1003. xml_failure(g_parser);
  1004. StructData_CheckItems(&storage, expected, expected_count);
  1005. StructData_Dispose(&storage);
  1006. }
  1007. END_TEST
  1008. /* Regression test #4 for SF bug #653180. */
  1009. START_TEST(test_line_number_after_error) {
  1010. const char *text = "<a>\n"
  1011. " <b>\n"
  1012. " </a>"; /* missing </b> */
  1013. XML_Size lineno;
  1014. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_FALSE)
  1015. != XML_STATUS_ERROR)
  1016. fail("Expected a parse error");
  1017. lineno = XML_GetCurrentLineNumber(g_parser);
  1018. if (lineno != 3) {
  1019. char buffer[100];
  1020. sprintf(buffer, "expected 3 lines, saw %" XML_FMT_INT_MOD "u", lineno);
  1021. fail(buffer);
  1022. }
  1023. }
  1024. END_TEST
  1025. /* Regression test #5 for SF bug #653180. */
  1026. START_TEST(test_column_number_after_error) {
  1027. const char *text = "<a>\n"
  1028. " <b>\n"
  1029. " </a>"; /* missing </b> */
  1030. XML_Size colno;
  1031. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_FALSE)
  1032. != XML_STATUS_ERROR)
  1033. fail("Expected a parse error");
  1034. colno = XML_GetCurrentColumnNumber(g_parser);
  1035. if (colno != 4) {
  1036. char buffer[100];
  1037. sprintf(buffer, "expected 4 columns, saw %" XML_FMT_INT_MOD "u", colno);
  1038. fail(buffer);
  1039. }
  1040. }
  1041. END_TEST
  1042. /* Regression test for SF bug #478332. */
  1043. START_TEST(test_really_long_lines) {
  1044. /* This parses an input line longer than INIT_DATA_BUF_SIZE
  1045. characters long (defined to be 1024 in xmlparse.c). We take a
  1046. really cheesy approach to building the input buffer, because
  1047. this avoids writing bugs in buffer-filling code.
  1048. */
  1049. const char *text
  1050. = "<e>"
  1051. /* 64 chars */
  1052. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
  1053. /* until we have at least 1024 characters on the line: */
  1054. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
  1055. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
  1056. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
  1057. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
  1058. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
  1059. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
  1060. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
  1061. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
  1062. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
  1063. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
  1064. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
  1065. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
  1066. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
  1067. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
  1068. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
  1069. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
  1070. "</e>";
  1071. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  1072. == XML_STATUS_ERROR)
  1073. xml_failure(g_parser);
  1074. }
  1075. END_TEST
  1076. /* Test cdata processing across a buffer boundary */
  1077. START_TEST(test_really_long_encoded_lines) {
  1078. /* As above, except that we want to provoke an output buffer
  1079. * overflow with a non-trivial encoding. For this we need to pass
  1080. * the whole cdata in one go, not byte-by-byte.
  1081. */
  1082. void *buffer;
  1083. const char *text
  1084. = "<?xml version='1.0' encoding='iso-8859-1'?>"
  1085. "<e>"
  1086. /* 64 chars */
  1087. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
  1088. /* until we have at least 1024 characters on the line: */
  1089. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
  1090. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
  1091. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
  1092. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
  1093. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
  1094. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
  1095. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
  1096. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
  1097. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
  1098. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
  1099. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
  1100. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
  1101. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
  1102. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
  1103. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
  1104. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
  1105. "</e>";
  1106. int parse_len = (int)strlen(text);
  1107. /* Need a cdata handler to provoke the code path we want to test */
  1108. XML_SetCharacterDataHandler(g_parser, dummy_cdata_handler);
  1109. buffer = XML_GetBuffer(g_parser, parse_len);
  1110. if (buffer == NULL)
  1111. fail("Could not allocate parse buffer");
  1112. assert(buffer != NULL);
  1113. memcpy(buffer, text, parse_len);
  1114. if (XML_ParseBuffer(g_parser, parse_len, XML_TRUE) == XML_STATUS_ERROR)
  1115. xml_failure(g_parser);
  1116. }
  1117. END_TEST
  1118. /*
  1119. * Element event tests.
  1120. */
  1121. static void XMLCALL
  1122. start_element_event_handler(void *userData, const XML_Char *name,
  1123. const XML_Char **atts) {
  1124. UNUSED_P(atts);
  1125. CharData_AppendXMLChars((CharData *)userData, name, -1);
  1126. }
  1127. static void XMLCALL
  1128. end_element_event_handler(void *userData, const XML_Char *name) {
  1129. CharData *storage = (CharData *)userData;
  1130. CharData_AppendXMLChars(storage, XCS("/"), 1);
  1131. CharData_AppendXMLChars(storage, name, -1);
  1132. }
  1133. START_TEST(test_end_element_events) {
  1134. const char *text = "<a><b><c/></b><d><f/></d></a>";
  1135. const XML_Char *expected = XCS("/c/b/f/d/a");
  1136. CharData storage;
  1137. CharData_Init(&storage);
  1138. XML_SetUserData(g_parser, &storage);
  1139. XML_SetEndElementHandler(g_parser, end_element_event_handler);
  1140. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  1141. == XML_STATUS_ERROR)
  1142. xml_failure(g_parser);
  1143. CharData_CheckXMLChars(&storage, expected);
  1144. }
  1145. END_TEST
  1146. /*
  1147. * Attribute tests.
  1148. */
  1149. /* Helpers used by the following test; this checks any "attr" and "refs"
  1150. attributes to make sure whitespace has been normalized.
  1151. Return true if whitespace has been normalized in a string, using
  1152. the rules for attribute value normalization. The 'is_cdata' flag
  1153. is needed since CDATA attributes don't need to have multiple
  1154. whitespace characters collapsed to a single space, while other
  1155. attribute data types do. (Section 3.3.3 of the recommendation.)
  1156. */
  1157. static int
  1158. is_whitespace_normalized(const XML_Char *s, int is_cdata) {
  1159. int blanks = 0;
  1160. int at_start = 1;
  1161. while (*s) {
  1162. if (*s == XCS(' '))
  1163. ++blanks;
  1164. else if (*s == XCS('\t') || *s == XCS('\n') || *s == XCS('\r'))
  1165. return 0;
  1166. else {
  1167. if (at_start) {
  1168. at_start = 0;
  1169. if (blanks && ! is_cdata)
  1170. /* illegal leading blanks */
  1171. return 0;
  1172. } else if (blanks > 1 && ! is_cdata)
  1173. return 0;
  1174. blanks = 0;
  1175. }
  1176. ++s;
  1177. }
  1178. if (blanks && ! is_cdata)
  1179. return 0;
  1180. return 1;
  1181. }
  1182. /* Check the attribute whitespace checker: */
  1183. static void
  1184. testhelper_is_whitespace_normalized(void) {
  1185. assert(is_whitespace_normalized(XCS("abc"), 0));
  1186. assert(is_whitespace_normalized(XCS("abc"), 1));
  1187. assert(is_whitespace_normalized(XCS("abc def ghi"), 0));
  1188. assert(is_whitespace_normalized(XCS("abc def ghi"), 1));
  1189. assert(! is_whitespace_normalized(XCS(" abc def ghi"), 0));
  1190. assert(is_whitespace_normalized(XCS(" abc def ghi"), 1));
  1191. assert(! is_whitespace_normalized(XCS("abc def ghi"), 0));
  1192. assert(is_whitespace_normalized(XCS("abc def ghi"), 1));
  1193. assert(! is_whitespace_normalized(XCS("abc def ghi "), 0));
  1194. assert(is_whitespace_normalized(XCS("abc def ghi "), 1));
  1195. assert(! is_whitespace_normalized(XCS(" "), 0));
  1196. assert(is_whitespace_normalized(XCS(" "), 1));
  1197. assert(! is_whitespace_normalized(XCS("\t"), 0));
  1198. assert(! is_whitespace_normalized(XCS("\t"), 1));
  1199. assert(! is_whitespace_normalized(XCS("\n"), 0));
  1200. assert(! is_whitespace_normalized(XCS("\n"), 1));
  1201. assert(! is_whitespace_normalized(XCS("\r"), 0));
  1202. assert(! is_whitespace_normalized(XCS("\r"), 1));
  1203. assert(! is_whitespace_normalized(XCS("abc\t def"), 1));
  1204. }
  1205. static void XMLCALL
  1206. check_attr_contains_normalized_whitespace(void *userData, const XML_Char *name,
  1207. const XML_Char **atts) {
  1208. int i;
  1209. UNUSED_P(userData);
  1210. UNUSED_P(name);
  1211. for (i = 0; atts[i] != NULL; i += 2) {
  1212. const XML_Char *attrname = atts[i];
  1213. const XML_Char *value = atts[i + 1];
  1214. if (xcstrcmp(XCS("attr"), attrname) == 0
  1215. || xcstrcmp(XCS("ents"), attrname) == 0
  1216. || xcstrcmp(XCS("refs"), attrname) == 0) {
  1217. if (! is_whitespace_normalized(value, 0)) {
  1218. char buffer[256];
  1219. sprintf(buffer,
  1220. "attribute value not normalized: %" XML_FMT_STR
  1221. "='%" XML_FMT_STR "'",
  1222. attrname, value);
  1223. fail(buffer);
  1224. }
  1225. }
  1226. }
  1227. }
  1228. START_TEST(test_attr_whitespace_normalization) {
  1229. const char *text
  1230. = "<!DOCTYPE doc [\n"
  1231. " <!ATTLIST doc\n"
  1232. " attr NMTOKENS #REQUIRED\n"
  1233. " ents ENTITIES #REQUIRED\n"
  1234. " refs IDREFS #REQUIRED>\n"
  1235. "]>\n"
  1236. "<doc attr=' a b c\t\td\te\t' refs=' id-1 \t id-2\t\t' \n"
  1237. " ents=' ent-1 \t\r\n"
  1238. " ent-2 ' >\n"
  1239. " <e id='id-1'/>\n"
  1240. " <e id='id-2'/>\n"
  1241. "</doc>";
  1242. XML_SetStartElementHandler(g_parser,
  1243. check_attr_contains_normalized_whitespace);
  1244. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  1245. == XML_STATUS_ERROR)
  1246. xml_failure(g_parser);
  1247. }
  1248. END_TEST
  1249. /*
  1250. * XML declaration tests.
  1251. */
  1252. START_TEST(test_xmldecl_misplaced) {
  1253. expect_failure("\n"
  1254. "<?xml version='1.0'?>\n"
  1255. "<a/>",
  1256. XML_ERROR_MISPLACED_XML_PI,
  1257. "failed to report misplaced XML declaration");
  1258. }
  1259. END_TEST
  1260. START_TEST(test_xmldecl_invalid) {
  1261. expect_failure("<?xml version='1.0' \xc3\xa7?>\n<doc/>", XML_ERROR_XML_DECL,
  1262. "Failed to report invalid XML declaration");
  1263. }
  1264. END_TEST
  1265. START_TEST(test_xmldecl_missing_attr) {
  1266. expect_failure("<?xml ='1.0'?>\n<doc/>\n", XML_ERROR_XML_DECL,
  1267. "Failed to report missing XML declaration attribute");
  1268. }
  1269. END_TEST
  1270. START_TEST(test_xmldecl_missing_value) {
  1271. expect_failure("<?xml version='1.0' encoding='us-ascii' standalone?>\n"
  1272. "<doc/>",
  1273. XML_ERROR_XML_DECL,
  1274. "Failed to report missing attribute value");
  1275. }
  1276. END_TEST
  1277. /* Regression test for SF bug #584832. */
  1278. static int XMLCALL
  1279. UnknownEncodingHandler(void *data, const XML_Char *encoding,
  1280. XML_Encoding *info) {
  1281. UNUSED_P(data);
  1282. if (xcstrcmp(encoding, XCS("unsupported-encoding")) == 0) {
  1283. int i;
  1284. for (i = 0; i < 256; ++i)
  1285. info->map[i] = i;
  1286. info->data = NULL;
  1287. info->convert = NULL;
  1288. info->release = NULL;
  1289. return XML_STATUS_OK;
  1290. }
  1291. return XML_STATUS_ERROR;
  1292. }
  1293. START_TEST(test_unknown_encoding_internal_entity) {
  1294. const char *text = "<?xml version='1.0' encoding='unsupported-encoding'?>\n"
  1295. "<!DOCTYPE test [<!ENTITY foo 'bar'>]>\n"
  1296. "<test a='&foo;'/>";
  1297. XML_SetUnknownEncodingHandler(g_parser, UnknownEncodingHandler, NULL);
  1298. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  1299. == XML_STATUS_ERROR)
  1300. xml_failure(g_parser);
  1301. }
  1302. END_TEST
  1303. /* Test unrecognised encoding handler */
  1304. static void
  1305. dummy_release(void *data) {
  1306. UNUSED_P(data);
  1307. }
  1308. static int XMLCALL
  1309. UnrecognisedEncodingHandler(void *data, const XML_Char *encoding,
  1310. XML_Encoding *info) {
  1311. UNUSED_P(data);
  1312. UNUSED_P(encoding);
  1313. info->data = NULL;
  1314. info->convert = NULL;
  1315. info->release = dummy_release;
  1316. return XML_STATUS_ERROR;
  1317. }
  1318. START_TEST(test_unrecognised_encoding_internal_entity) {
  1319. const char *text = "<?xml version='1.0' encoding='unsupported-encoding'?>\n"
  1320. "<!DOCTYPE test [<!ENTITY foo 'bar'>]>\n"
  1321. "<test a='&foo;'/>";
  1322. XML_SetUnknownEncodingHandler(g_parser, UnrecognisedEncodingHandler, NULL);
  1323. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  1324. != XML_STATUS_ERROR)
  1325. fail("Unrecognised encoding not rejected");
  1326. }
  1327. END_TEST
  1328. /* Regression test for SF bug #620106. */
  1329. static int XMLCALL
  1330. external_entity_loader(XML_Parser parser, const XML_Char *context,
  1331. const XML_Char *base, const XML_Char *systemId,
  1332. const XML_Char *publicId) {
  1333. ExtTest *test_data = (ExtTest *)XML_GetUserData(parser);
  1334. XML_Parser extparser;
  1335. UNUSED_P(base);
  1336. UNUSED_P(systemId);
  1337. UNUSED_P(publicId);
  1338. extparser = XML_ExternalEntityParserCreate(parser, context, NULL);
  1339. if (extparser == NULL)
  1340. fail("Could not create external entity parser.");
  1341. if (test_data->encoding != NULL) {
  1342. if (! XML_SetEncoding(extparser, test_data->encoding))
  1343. fail("XML_SetEncoding() ignored for external entity");
  1344. }
  1345. if (_XML_Parse_SINGLE_BYTES(extparser, test_data->parse_text,
  1346. (int)strlen(test_data->parse_text), XML_TRUE)
  1347. == XML_STATUS_ERROR) {
  1348. xml_failure(extparser);
  1349. return XML_STATUS_ERROR;
  1350. }
  1351. XML_ParserFree(extparser);
  1352. return XML_STATUS_OK;
  1353. }
  1354. START_TEST(test_ext_entity_set_encoding) {
  1355. const char *text = "<!DOCTYPE doc [\n"
  1356. " <!ENTITY en SYSTEM 'http://example.org/dummy.ent'>\n"
  1357. "]>\n"
  1358. "<doc>&en;</doc>";
  1359. ExtTest test_data
  1360. = {/* This text says it's an unsupported encoding, but it's really
  1361. UTF-8, which we tell Expat using XML_SetEncoding().
  1362. */
  1363. "<?xml encoding='iso-8859-3'?>\xC3\xA9", XCS("utf-8"), NULL};
  1364. #ifdef XML_UNICODE
  1365. const XML_Char *expected = XCS("\x00e9");
  1366. #else
  1367. const XML_Char *expected = XCS("\xc3\xa9");
  1368. #endif
  1369. XML_SetExternalEntityRefHandler(g_parser, external_entity_loader);
  1370. run_ext_character_check(text, &test_data, expected);
  1371. }
  1372. END_TEST
  1373. /* Test external entities with no handler */
  1374. START_TEST(test_ext_entity_no_handler) {
  1375. const char *text = "<!DOCTYPE doc [\n"
  1376. " <!ENTITY en SYSTEM 'http://example.org/dummy.ent'>\n"
  1377. "]>\n"
  1378. "<doc>&en;</doc>";
  1379. XML_SetDefaultHandler(g_parser, dummy_default_handler);
  1380. run_character_check(text, XCS(""));
  1381. }
  1382. END_TEST
  1383. /* Test UTF-8 BOM is accepted */
  1384. START_TEST(test_ext_entity_set_bom) {
  1385. const char *text = "<!DOCTYPE doc [\n"
  1386. " <!ENTITY en SYSTEM 'http://example.org/dummy.ent'>\n"
  1387. "]>\n"
  1388. "<doc>&en;</doc>";
  1389. ExtTest test_data = {"\xEF\xBB\xBF" /* BOM */
  1390. "<?xml encoding='iso-8859-3'?>"
  1391. "\xC3\xA9",
  1392. XCS("utf-8"), NULL};
  1393. #ifdef XML_UNICODE
  1394. const XML_Char *expected = XCS("\x00e9");
  1395. #else
  1396. const XML_Char *expected = XCS("\xc3\xa9");
  1397. #endif
  1398. XML_SetExternalEntityRefHandler(g_parser, external_entity_loader);
  1399. run_ext_character_check(text, &test_data, expected);
  1400. }
  1401. END_TEST
  1402. /* Test that bad encodings are faulted */
  1403. typedef struct ext_faults {
  1404. const char *parse_text;
  1405. const char *fail_text;
  1406. const XML_Char *encoding;
  1407. enum XML_Error error;
  1408. } ExtFaults;
  1409. static int XMLCALL
  1410. external_entity_faulter(XML_Parser parser, const XML_Char *context,
  1411. const XML_Char *base, const XML_Char *systemId,
  1412. const XML_Char *publicId) {
  1413. XML_Parser ext_parser;
  1414. ExtFaults *fault = (ExtFaults *)XML_GetUserData(parser);
  1415. UNUSED_P(base);
  1416. UNUSED_P(systemId);
  1417. UNUSED_P(publicId);
  1418. ext_parser = XML_ExternalEntityParserCreate(parser, context, NULL);
  1419. if (ext_parser == NULL)
  1420. fail("Could not create external entity parser");
  1421. if (fault->encoding != NULL) {
  1422. if (! XML_SetEncoding(ext_parser, fault->encoding))
  1423. fail("XML_SetEncoding failed");
  1424. }
  1425. if (_XML_Parse_SINGLE_BYTES(ext_parser, fault->parse_text,
  1426. (int)strlen(fault->parse_text), XML_TRUE)
  1427. != XML_STATUS_ERROR)
  1428. fail(fault->fail_text);
  1429. if (XML_GetErrorCode(ext_parser) != fault->error)
  1430. xml_failure(ext_parser);
  1431. XML_ParserFree(ext_parser);
  1432. return XML_STATUS_ERROR;
  1433. }
  1434. START_TEST(test_ext_entity_bad_encoding) {
  1435. const char *text = "<!DOCTYPE doc [\n"
  1436. " <!ENTITY en SYSTEM 'http://example.org/dummy.ent'>\n"
  1437. "]>\n"
  1438. "<doc>&en;</doc>";
  1439. ExtFaults fault
  1440. = {"<?xml encoding='iso-8859-3'?>u", "Unsupported encoding not faulted",
  1441. XCS("unknown"), XML_ERROR_UNKNOWN_ENCODING};
  1442. XML_SetExternalEntityRefHandler(g_parser, external_entity_faulter);
  1443. XML_SetUserData(g_parser, &fault);
  1444. expect_failure(text, XML_ERROR_EXTERNAL_ENTITY_HANDLING,
  1445. "Bad encoding should not have been accepted");
  1446. }
  1447. END_TEST
  1448. /* Try handing an invalid encoding to an external entity parser */
  1449. START_TEST(test_ext_entity_bad_encoding_2) {
  1450. const char *text = "<?xml version='1.0' encoding='us-ascii'?>\n"
  1451. "<!DOCTYPE doc SYSTEM 'foo'>\n"
  1452. "<doc>&entity;</doc>";
  1453. ExtFaults fault
  1454. = {"<!ELEMENT doc (#PCDATA)*>", "Unknown encoding not faulted",
  1455. XCS("unknown-encoding"), XML_ERROR_UNKNOWN_ENCODING};
  1456. XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
  1457. XML_SetExternalEntityRefHandler(g_parser, external_entity_faulter);
  1458. XML_SetUserData(g_parser, &fault);
  1459. expect_failure(text, XML_ERROR_EXTERNAL_ENTITY_HANDLING,
  1460. "Bad encoding not faulted in external entity handler");
  1461. }
  1462. END_TEST
  1463. /* Test that no error is reported for unknown entities if we don't
  1464. read an external subset. This was fixed in Expat 1.95.5.
  1465. */
  1466. START_TEST(test_wfc_undeclared_entity_unread_external_subset) {
  1467. const char *text = "<!DOCTYPE doc SYSTEM 'foo'>\n"
  1468. "<doc>&entity;</doc>";
  1469. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  1470. == XML_STATUS_ERROR)
  1471. xml_failure(g_parser);
  1472. }
  1473. END_TEST
  1474. /* Test that an error is reported for unknown entities if we don't
  1475. have an external subset.
  1476. */
  1477. START_TEST(test_wfc_undeclared_entity_no_external_subset) {
  1478. expect_failure("<doc>&entity;</doc>", XML_ERROR_UNDEFINED_ENTITY,
  1479. "Parser did not report undefined entity w/out a DTD.");
  1480. }
  1481. END_TEST
  1482. /* Test that an error is reported for unknown entities if we don't
  1483. read an external subset, but have been declared standalone.
  1484. */
  1485. START_TEST(test_wfc_undeclared_entity_standalone) {
  1486. const char *text
  1487. = "<?xml version='1.0' encoding='us-ascii' standalone='yes'?>\n"
  1488. "<!DOCTYPE doc SYSTEM 'foo'>\n"
  1489. "<doc>&entity;</doc>";
  1490. expect_failure(text, XML_ERROR_UNDEFINED_ENTITY,
  1491. "Parser did not report undefined entity (standalone).");
  1492. }
  1493. END_TEST
  1494. /* Test that an error is reported for unknown entities if we have read
  1495. an external subset, and standalone is true.
  1496. */
  1497. START_TEST(test_wfc_undeclared_entity_with_external_subset_standalone) {
  1498. const char *text
  1499. = "<?xml version='1.0' encoding='us-ascii' standalone='yes'?>\n"
  1500. "<!DOCTYPE doc SYSTEM 'foo'>\n"
  1501. "<doc>&entity;</doc>";
  1502. ExtTest test_data = {"<!ELEMENT doc (#PCDATA)*>", NULL, NULL};
  1503. XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
  1504. XML_SetUserData(g_parser, &test_data);
  1505. XML_SetExternalEntityRefHandler(g_parser, external_entity_loader);
  1506. expect_failure(text, XML_ERROR_UNDEFINED_ENTITY,
  1507. "Parser did not report undefined entity (external DTD).");
  1508. }
  1509. END_TEST
  1510. /* Test that external entity handling is not done if the parsing flag
  1511. * is set to UNLESS_STANDALONE
  1512. */
  1513. START_TEST(test_entity_with_external_subset_unless_standalone) {
  1514. const char *text
  1515. = "<?xml version='1.0' encoding='us-ascii' standalone='yes'?>\n"
  1516. "<!DOCTYPE doc SYSTEM 'foo'>\n"
  1517. "<doc>&entity;</doc>";
  1518. ExtTest test_data = {"<!ENTITY entity 'bar'>", NULL, NULL};
  1519. XML_SetParamEntityParsing(g_parser,
  1520. XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONE);
  1521. XML_SetUserData(g_parser, &test_data);
  1522. XML_SetExternalEntityRefHandler(g_parser, external_entity_loader);
  1523. expect_failure(text, XML_ERROR_UNDEFINED_ENTITY,
  1524. "Parser did not report undefined entity");
  1525. }
  1526. END_TEST
  1527. /* Test that no error is reported for unknown entities if we have read
  1528. an external subset, and standalone is false.
  1529. */
  1530. START_TEST(test_wfc_undeclared_entity_with_external_subset) {
  1531. const char *text = "<?xml version='1.0' encoding='us-ascii'?>\n"
  1532. "<!DOCTYPE doc SYSTEM 'foo'>\n"
  1533. "<doc>&entity;</doc>";
  1534. ExtTest test_data = {"<!ELEMENT doc (#PCDATA)*>", NULL, NULL};
  1535. XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
  1536. XML_SetExternalEntityRefHandler(g_parser, external_entity_loader);
  1537. run_ext_character_check(text, &test_data, XCS(""));
  1538. }
  1539. END_TEST
  1540. /* Test that an error is reported if our NotStandalone handler fails */
  1541. static int XMLCALL
  1542. reject_not_standalone_handler(void *userData) {
  1543. UNUSED_P(userData);
  1544. return XML_STATUS_ERROR;
  1545. }
  1546. START_TEST(test_not_standalone_handler_reject) {
  1547. const char *text = "<?xml version='1.0' encoding='us-ascii'?>\n"
  1548. "<!DOCTYPE doc SYSTEM 'foo'>\n"
  1549. "<doc>&entity;</doc>";
  1550. ExtTest test_data = {"<!ELEMENT doc (#PCDATA)*>", NULL, NULL};
  1551. XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
  1552. XML_SetUserData(g_parser, &test_data);
  1553. XML_SetExternalEntityRefHandler(g_parser, external_entity_loader);
  1554. XML_SetNotStandaloneHandler(g_parser, reject_not_standalone_handler);
  1555. expect_failure(text, XML_ERROR_NOT_STANDALONE,
  1556. "NotStandalone handler failed to reject");
  1557. /* Try again but without external entity handling */
  1558. XML_ParserReset(g_parser, NULL);
  1559. XML_SetNotStandaloneHandler(g_parser, reject_not_standalone_handler);
  1560. expect_failure(text, XML_ERROR_NOT_STANDALONE,
  1561. "NotStandalone handler failed to reject");
  1562. }
  1563. END_TEST
  1564. /* Test that no error is reported if our NotStandalone handler succeeds */
  1565. static int XMLCALL
  1566. accept_not_standalone_handler(void *userData) {
  1567. UNUSED_P(userData);
  1568. return XML_STATUS_OK;
  1569. }
  1570. START_TEST(test_not_standalone_handler_accept) {
  1571. const char *text = "<?xml version='1.0' encoding='us-ascii'?>\n"
  1572. "<!DOCTYPE doc SYSTEM 'foo'>\n"
  1573. "<doc>&entity;</doc>";
  1574. ExtTest test_data = {"<!ELEMENT doc (#PCDATA)*>", NULL, NULL};
  1575. XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
  1576. XML_SetExternalEntityRefHandler(g_parser, external_entity_loader);
  1577. XML_SetNotStandaloneHandler(g_parser, accept_not_standalone_handler);
  1578. run_ext_character_check(text, &test_data, XCS(""));
  1579. /* Repeat without the external entity handler */
  1580. XML_ParserReset(g_parser, NULL);
  1581. XML_SetNotStandaloneHandler(g_parser, accept_not_standalone_handler);
  1582. run_character_check(text, XCS(""));
  1583. }
  1584. END_TEST
  1585. START_TEST(test_wfc_no_recursive_entity_refs) {
  1586. const char *text = "<!DOCTYPE doc [\n"
  1587. " <!ENTITY entity '&#38;entity;'>\n"
  1588. "]>\n"
  1589. "<doc>&entity;</doc>";
  1590. expect_failure(text, XML_ERROR_RECURSIVE_ENTITY_REF,
  1591. "Parser did not report recursive entity reference.");
  1592. }
  1593. END_TEST
  1594. /* Test incomplete external entities are faulted */
  1595. START_TEST(test_ext_entity_invalid_parse) {
  1596. const char *text = "<!DOCTYPE doc [\n"
  1597. " <!ENTITY en SYSTEM 'http://example.org/dummy.ent'>\n"
  1598. "]>\n"
  1599. "<doc>&en;</doc>";
  1600. const ExtFaults faults[]
  1601. = {{"<", "Incomplete element declaration not faulted", NULL,
  1602. XML_ERROR_UNCLOSED_TOKEN},
  1603. {"<\xe2\x82", /* First two bytes of a three-byte char */
  1604. "Incomplete character not faulted", NULL, XML_ERROR_PARTIAL_CHAR},
  1605. {"<tag>\xe2\x82", "Incomplete character in CDATA not faulted", NULL,
  1606. XML_ERROR_PARTIAL_CHAR},
  1607. {NULL, NULL, NULL, XML_ERROR_NONE}};
  1608. const ExtFaults *fault = faults;
  1609. for (; fault->parse_text != NULL; fault++) {
  1610. XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
  1611. XML_SetExternalEntityRefHandler(g_parser, external_entity_faulter);
  1612. XML_SetUserData(g_parser, (void *)fault);
  1613. expect_failure(text, XML_ERROR_EXTERNAL_ENTITY_HANDLING,
  1614. "Parser did not report external entity error");
  1615. XML_ParserReset(g_parser, NULL);
  1616. }
  1617. }
  1618. END_TEST
  1619. /* Regression test for SF bug #483514. */
  1620. START_TEST(test_dtd_default_handling) {
  1621. const char *text = "<!DOCTYPE doc [\n"
  1622. "<!ENTITY e SYSTEM 'http://example.org/e'>\n"
  1623. "<!NOTATION n SYSTEM 'http://example.org/n'>\n"
  1624. "<!ELEMENT doc EMPTY>\n"
  1625. "<!ATTLIST doc a CDATA #IMPLIED>\n"
  1626. "<?pi in dtd?>\n"
  1627. "<!--comment in dtd-->\n"
  1628. "]><doc/>";
  1629. XML_SetDefaultHandler(g_parser, accumulate_characters);
  1630. XML_SetStartDoctypeDeclHandler(g_parser, dummy_start_doctype_handler);
  1631. XML_SetEndDoctypeDeclHandler(g_parser, dummy_end_doctype_handler);
  1632. XML_SetEntityDeclHandler(g_parser, dummy_entity_decl_handler);
  1633. XML_SetNotationDeclHandler(g_parser, dummy_notation_decl_handler);
  1634. XML_SetElementDeclHandler(g_parser, dummy_element_decl_handler);
  1635. XML_SetAttlistDeclHandler(g_parser, dummy_attlist_decl_handler);
  1636. XML_SetProcessingInstructionHandler(g_parser, dummy_pi_handler);
  1637. XML_SetCommentHandler(g_parser, dummy_comment_handler);
  1638. XML_SetStartCdataSectionHandler(g_parser, dummy_start_cdata_handler);
  1639. XML_SetEndCdataSectionHandler(g_parser, dummy_end_cdata_handler);
  1640. run_character_check(text, XCS("\n\n\n\n\n\n\n<doc/>"));
  1641. }
  1642. END_TEST
  1643. /* Test handling of attribute declarations */
  1644. typedef struct AttTest {
  1645. const char *definition;
  1646. const XML_Char *element_name;
  1647. const XML_Char *attr_name;
  1648. const XML_Char *attr_type;
  1649. const XML_Char *default_value;
  1650. int is_required;
  1651. } AttTest;
  1652. static void XMLCALL
  1653. verify_attlist_decl_handler(void *userData, const XML_Char *element_name,
  1654. const XML_Char *attr_name,
  1655. const XML_Char *attr_type,
  1656. const XML_Char *default_value, int is_required) {
  1657. AttTest *at = (AttTest *)userData;
  1658. if (xcstrcmp(element_name, at->element_name))
  1659. fail("Unexpected element name in attribute declaration");
  1660. if (xcstrcmp(attr_name, at->attr_name))
  1661. fail("Unexpected attribute name in attribute declaration");
  1662. if (xcstrcmp(attr_type, at->attr_type))
  1663. fail("Unexpected attribute type in attribute declaration");
  1664. if ((default_value == NULL && at->default_value != NULL)
  1665. || (default_value != NULL && at->default_value == NULL)
  1666. || (default_value != NULL && xcstrcmp(default_value, at->default_value)))
  1667. fail("Unexpected default value in attribute declaration");
  1668. if (is_required != at->is_required)
  1669. fail("Requirement mismatch in attribute declaration");
  1670. }
  1671. START_TEST(test_dtd_attr_handling) {
  1672. const char *prolog = "<!DOCTYPE doc [\n"
  1673. "<!ELEMENT doc EMPTY>\n";
  1674. AttTest attr_data[]
  1675. = {{"<!ATTLIST doc a ( one | two | three ) #REQUIRED>\n"
  1676. "]>"
  1677. "<doc a='two'/>",
  1678. XCS("doc"), XCS("a"),
  1679. XCS("(one|two|three)"), /* Extraneous spaces will be removed */
  1680. NULL, XML_TRUE},
  1681. {"<!NOTATION foo SYSTEM 'http://example.org/foo'>\n"
  1682. "<!ATTLIST doc a NOTATION (foo) #IMPLIED>\n"
  1683. "]>"
  1684. "<doc/>",
  1685. XCS("doc"), XCS("a"), XCS("NOTATION(foo)"), NULL, XML_FALSE},
  1686. {"<!ATTLIST doc a NOTATION (foo) 'bar'>\n"
  1687. "]>"
  1688. "<doc/>",
  1689. XCS("doc"), XCS("a"), XCS("NOTATION(foo)"), XCS("bar"), XML_FALSE},
  1690. {"<!ATTLIST doc a CDATA '\xdb\xb2'>\n"
  1691. "]>"
  1692. "<doc/>",
  1693. XCS("doc"), XCS("a"), XCS("CDATA"),
  1694. #ifdef XML_UNICODE
  1695. XCS("\x06f2"),
  1696. #else
  1697. XCS("\xdb\xb2"),
  1698. #endif
  1699. XML_FALSE},
  1700. {NULL, NULL, NULL, NULL, NULL, XML_FALSE}};
  1701. AttTest *test;
  1702. for (test = attr_data; test->definition != NULL; test++) {
  1703. XML_SetAttlistDeclHandler(g_parser, verify_attlist_decl_handler);
  1704. XML_SetUserData(g_parser, test);
  1705. if (_XML_Parse_SINGLE_BYTES(g_parser, prolog, (int)strlen(prolog),
  1706. XML_FALSE)
  1707. == XML_STATUS_ERROR)
  1708. xml_failure(g_parser);
  1709. if (_XML_Parse_SINGLE_BYTES(g_parser, test->definition,
  1710. (int)strlen(test->definition), XML_TRUE)
  1711. == XML_STATUS_ERROR)
  1712. xml_failure(g_parser);
  1713. XML_ParserReset(g_parser, NULL);
  1714. }
  1715. }
  1716. END_TEST
  1717. /* See related SF bug #673791.
  1718. When namespace processing is enabled, setting the namespace URI for
  1719. a prefix is not allowed; this test ensures that it *is* allowed
  1720. when namespace processing is not enabled.
  1721. (See Namespaces in XML, section 2.)
  1722. */
  1723. START_TEST(test_empty_ns_without_namespaces) {
  1724. const char *text = "<doc xmlns:prefix='http://example.org/'>\n"
  1725. " <e xmlns:prefix=''/>\n"
  1726. "</doc>";
  1727. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  1728. == XML_STATUS_ERROR)
  1729. xml_failure(g_parser);
  1730. }
  1731. END_TEST
  1732. /* Regression test for SF bug #824420.
  1733. Checks that an xmlns:prefix attribute set in an attribute's default
  1734. value isn't misinterpreted.
  1735. */
  1736. START_TEST(test_ns_in_attribute_default_without_namespaces) {
  1737. const char *text = "<!DOCTYPE e:element [\n"
  1738. " <!ATTLIST e:element\n"
  1739. " xmlns:e CDATA 'http://example.org/'>\n"
  1740. " ]>\n"
  1741. "<e:element/>";
  1742. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  1743. == XML_STATUS_ERROR)
  1744. xml_failure(g_parser);
  1745. }
  1746. END_TEST
  1747. static const char *long_character_data_text
  1748. = "<?xml version='1.0' encoding='iso-8859-1'?><s>"
  1749. "012345678901234567890123456789012345678901234567890123456789"
  1750. "012345678901234567890123456789012345678901234567890123456789"
  1751. "012345678901234567890123456789012345678901234567890123456789"
  1752. "012345678901234567890123456789012345678901234567890123456789"
  1753. "012345678901234567890123456789012345678901234567890123456789"
  1754. "012345678901234567890123456789012345678901234567890123456789"
  1755. "012345678901234567890123456789012345678901234567890123456789"
  1756. "012345678901234567890123456789012345678901234567890123456789"
  1757. "012345678901234567890123456789012345678901234567890123456789"
  1758. "012345678901234567890123456789012345678901234567890123456789"
  1759. "012345678901234567890123456789012345678901234567890123456789"
  1760. "012345678901234567890123456789012345678901234567890123456789"
  1761. "012345678901234567890123456789012345678901234567890123456789"
  1762. "012345678901234567890123456789012345678901234567890123456789"
  1763. "012345678901234567890123456789012345678901234567890123456789"
  1764. "012345678901234567890123456789012345678901234567890123456789"
  1765. "012345678901234567890123456789012345678901234567890123456789"
  1766. "012345678901234567890123456789012345678901234567890123456789"
  1767. "012345678901234567890123456789012345678901234567890123456789"
  1768. "012345678901234567890123456789012345678901234567890123456789"
  1769. "</s>";
  1770. static XML_Bool resumable = XML_FALSE;
  1771. static void
  1772. clearing_aborting_character_handler(void *userData, const XML_Char *s,
  1773. int len) {
  1774. UNUSED_P(userData);
  1775. UNUSED_P(s);
  1776. UNUSED_P(len);
  1777. XML_StopParser(g_parser, resumable);
  1778. XML_SetCharacterDataHandler(g_parser, NULL);
  1779. }
  1780. /* Regression test for SF bug #1515266: missing check of stopped
  1781. parser in doContext() 'for' loop. */
  1782. START_TEST(test_stop_parser_between_char_data_calls) {
  1783. /* The sample data must be big enough that there are two calls to
  1784. the character data handler from within the inner "for" loop of
  1785. the XML_TOK_DATA_CHARS case in doContent(), and the character
  1786. handler must stop the parser and clear the character data
  1787. handler.
  1788. */
  1789. const char *text = long_character_data_text;
  1790. XML_SetCharacterDataHandler(g_parser, clearing_aborting_character_handler);
  1791. resumable = XML_FALSE;
  1792. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  1793. != XML_STATUS_ERROR)
  1794. xml_failure(g_parser);
  1795. if (XML_GetErrorCode(g_parser) != XML_ERROR_ABORTED)
  1796. xml_failure(g_parser);
  1797. }
  1798. END_TEST
  1799. /* Regression test for SF bug #1515266: missing check of stopped
  1800. parser in doContext() 'for' loop. */
  1801. START_TEST(test_suspend_parser_between_char_data_calls) {
  1802. /* The sample data must be big enough that there are two calls to
  1803. the character data handler from within the inner "for" loop of
  1804. the XML_TOK_DATA_CHARS case in doContent(), and the character
  1805. handler must stop the parser and clear the character data
  1806. handler.
  1807. */
  1808. const char *text = long_character_data_text;
  1809. XML_SetCharacterDataHandler(g_parser, clearing_aborting_character_handler);
  1810. resumable = XML_TRUE;
  1811. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  1812. != XML_STATUS_SUSPENDED)
  1813. xml_failure(g_parser);
  1814. if (XML_GetErrorCode(g_parser) != XML_ERROR_NONE)
  1815. xml_failure(g_parser);
  1816. /* Try parsing directly */
  1817. if (XML_Parse(g_parser, text, (int)strlen(text), XML_TRUE)
  1818. != XML_STATUS_ERROR)
  1819. fail("Attempt to continue parse while suspended not faulted");
  1820. if (XML_GetErrorCode(g_parser) != XML_ERROR_SUSPENDED)
  1821. fail("Suspended parse not faulted with correct error");
  1822. }
  1823. END_TEST
  1824. static XML_Bool abortable = XML_FALSE;
  1825. static void
  1826. parser_stop_character_handler(void *userData, const XML_Char *s, int len) {
  1827. UNUSED_P(userData);
  1828. UNUSED_P(s);
  1829. UNUSED_P(len);
  1830. XML_StopParser(g_parser, resumable);
  1831. XML_SetCharacterDataHandler(g_parser, NULL);
  1832. if (! resumable) {
  1833. /* Check that aborting an aborted parser is faulted */
  1834. if (XML_StopParser(g_parser, XML_FALSE) != XML_STATUS_ERROR)
  1835. fail("Aborting aborted parser not faulted");
  1836. if (XML_GetErrorCode(g_parser) != XML_ERROR_FINISHED)
  1837. xml_failure(g_parser);
  1838. } else if (abortable) {
  1839. /* Check that aborting a suspended parser works */
  1840. if (XML_StopParser(g_parser, XML_FALSE) == XML_STATUS_ERROR)
  1841. xml_failure(g_parser);
  1842. } else {
  1843. /* Check that suspending a suspended parser works */
  1844. if (XML_StopParser(g_parser, XML_TRUE) != XML_STATUS_ERROR)
  1845. fail("Suspending suspended parser not faulted");
  1846. if (XML_GetErrorCode(g_parser) != XML_ERROR_SUSPENDED)
  1847. xml_failure(g_parser);
  1848. }
  1849. }
  1850. /* Test repeated calls to XML_StopParser are handled correctly */
  1851. START_TEST(test_repeated_stop_parser_between_char_data_calls) {
  1852. const char *text = long_character_data_text;
  1853. XML_SetCharacterDataHandler(g_parser, parser_stop_character_handler);
  1854. resumable = XML_FALSE;
  1855. abortable = XML_FALSE;
  1856. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  1857. != XML_STATUS_ERROR)
  1858. fail("Failed to double-stop parser");
  1859. XML_ParserReset(g_parser, NULL);
  1860. XML_SetCharacterDataHandler(g_parser, parser_stop_character_handler);
  1861. resumable = XML_TRUE;
  1862. abortable = XML_FALSE;
  1863. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  1864. != XML_STATUS_SUSPENDED)
  1865. fail("Failed to double-suspend parser");
  1866. XML_ParserReset(g_parser, NULL);
  1867. XML_SetCharacterDataHandler(g_parser, parser_stop_character_handler);
  1868. resumable = XML_TRUE;
  1869. abortable = XML_TRUE;
  1870. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  1871. != XML_STATUS_ERROR)
  1872. fail("Failed to suspend-abort parser");
  1873. }
  1874. END_TEST
  1875. START_TEST(test_good_cdata_ascii) {
  1876. const char *text = "<a><![CDATA[<greeting>Hello, world!</greeting>]]></a>";
  1877. const XML_Char *expected = XCS("<greeting>Hello, world!</greeting>");
  1878. CharData storage;
  1879. CharData_Init(&storage);
  1880. XML_SetUserData(g_parser, &storage);
  1881. XML_SetCharacterDataHandler(g_parser, accumulate_characters);
  1882. /* Add start and end handlers for coverage */
  1883. XML_SetStartCdataSectionHandler(g_parser, dummy_start_cdata_handler);
  1884. XML_SetEndCdataSectionHandler(g_parser, dummy_end_cdata_handler);
  1885. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  1886. == XML_STATUS_ERROR)
  1887. xml_failure(g_parser);
  1888. CharData_CheckXMLChars(&storage, expected);
  1889. /* Try again, this time with a default handler */
  1890. XML_ParserReset(g_parser, NULL);
  1891. CharData_Init(&storage);
  1892. XML_SetUserData(g_parser, &storage);
  1893. XML_SetCharacterDataHandler(g_parser, accumulate_characters);
  1894. XML_SetDefaultHandler(g_parser, dummy_default_handler);
  1895. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  1896. == XML_STATUS_ERROR)
  1897. xml_failure(g_parser);
  1898. CharData_CheckXMLChars(&storage, expected);
  1899. }
  1900. END_TEST
  1901. START_TEST(test_good_cdata_utf16) {
  1902. /* Test data is:
  1903. * <?xml version='1.0' encoding='utf-16'?>
  1904. * <a><![CDATA[hello]]></a>
  1905. */
  1906. const char text[]
  1907. = "\0<\0?\0x\0m\0l\0"
  1908. " \0v\0e\0r\0s\0i\0o\0n\0=\0'\0\x31\0.\0\x30\0'\0"
  1909. " \0e\0n\0c\0o\0d\0i\0n\0g\0=\0'\0u\0t\0f\0-\0"
  1910. "1\0"
  1911. "6\0'"
  1912. "\0?\0>\0\n"
  1913. "\0<\0a\0>\0<\0!\0[\0C\0D\0A\0T\0A\0[\0h\0e\0l\0l\0o\0]\0]\0>\0<\0/\0a\0>";
  1914. const XML_Char *expected = XCS("hello");
  1915. CharData storage;
  1916. CharData_Init(&storage);
  1917. XML_SetUserData(g_parser, &storage);
  1918. XML_SetCharacterDataHandler(g_parser, accumulate_characters);
  1919. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)sizeof(text) - 1, XML_TRUE)
  1920. == XML_STATUS_ERROR)
  1921. xml_failure(g_parser);
  1922. CharData_CheckXMLChars(&storage, expected);
  1923. }
  1924. END_TEST
  1925. START_TEST(test_good_cdata_utf16_le) {
  1926. /* Test data is:
  1927. * <?xml version='1.0' encoding='utf-16'?>
  1928. * <a><![CDATA[hello]]></a>
  1929. */
  1930. const char text[]
  1931. = "<\0?\0x\0m\0l\0"
  1932. " \0v\0e\0r\0s\0i\0o\0n\0=\0'\0\x31\0.\0\x30\0'\0"
  1933. " \0e\0n\0c\0o\0d\0i\0n\0g\0=\0'\0u\0t\0f\0-\0"
  1934. "1\0"
  1935. "6\0'"
  1936. "\0?\0>\0\n"
  1937. "\0<\0a\0>\0<\0!\0[\0C\0D\0A\0T\0A\0[\0h\0e\0l\0l\0o\0]\0]\0>\0<\0/\0a\0>\0";
  1938. const XML_Char *expected = XCS("hello");
  1939. CharData storage;
  1940. CharData_Init(&storage);
  1941. XML_SetUserData(g_parser, &storage);
  1942. XML_SetCharacterDataHandler(g_parser, accumulate_characters);
  1943. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)sizeof(text) - 1, XML_TRUE)
  1944. == XML_STATUS_ERROR)
  1945. xml_failure(g_parser);
  1946. CharData_CheckXMLChars(&storage, expected);
  1947. }
  1948. END_TEST
  1949. /* Test UTF16 conversion of a long cdata string */
  1950. /* 16 characters: handy macro to reduce visual clutter */
  1951. #define A_TO_P_IN_UTF16 "\0A\0B\0C\0D\0E\0F\0G\0H\0I\0J\0K\0L\0M\0N\0O\0P"
  1952. START_TEST(test_long_cdata_utf16) {
  1953. /* Test data is:
  1954. * <?xlm version='1.0' encoding='utf-16'?>
  1955. * <a><![CDATA[
  1956. * ABCDEFGHIJKLMNOP
  1957. * ]]></a>
  1958. */
  1959. const char text[]
  1960. = "\0<\0?\0x\0m\0l\0 "
  1961. "\0v\0e\0r\0s\0i\0o\0n\0=\0'\0\x31\0.\0\x30\0'\0 "
  1962. "\0e\0n\0c\0o\0d\0i\0n\0g\0=\0'\0u\0t\0f\0-\0\x31\0\x36\0'\0?\0>"
  1963. "\0<\0a\0>\0<\0!\0[\0C\0D\0A\0T\0A\0["
  1964. /* 64 characters per line */
  1965. /* clang-format off */
  1966. A_TO_P_IN_UTF16 A_TO_P_IN_UTF16 A_TO_P_IN_UTF16 A_TO_P_IN_UTF16
  1967. A_TO_P_IN_UTF16 A_TO_P_IN_UTF16 A_TO_P_IN_UTF16 A_TO_P_IN_UTF16
  1968. A_TO_P_IN_UTF16 A_TO_P_IN_UTF16 A_TO_P_IN_UTF16 A_TO_P_IN_UTF16
  1969. A_TO_P_IN_UTF16 A_TO_P_IN_UTF16 A_TO_P_IN_UTF16 A_TO_P_IN_UTF16
  1970. A_TO_P_IN_UTF16 A_TO_P_IN_UTF16 A_TO_P_IN_UTF16 A_TO_P_IN_UTF16
  1971. A_TO_P_IN_UTF16 A_TO_P_IN_UTF16 A_TO_P_IN_UTF16 A_TO_P_IN_UTF16
  1972. A_TO_P_IN_UTF16 A_TO_P_IN_UTF16 A_TO_P_IN_UTF16 A_TO_P_IN_UTF16
  1973. A_TO_P_IN_UTF16 A_TO_P_IN_UTF16 A_TO_P_IN_UTF16 A_TO_P_IN_UTF16
  1974. A_TO_P_IN_UTF16 A_TO_P_IN_UTF16 A_TO_P_IN_UTF16 A_TO_P_IN_UTF16
  1975. A_TO_P_IN_UTF16 A_TO_P_IN_UTF16 A_TO_P_IN_UTF16 A_TO_P_IN_UTF16
  1976. A_TO_P_IN_UTF16 A_TO_P_IN_UTF16 A_TO_P_IN_UTF16 A_TO_P_IN_UTF16
  1977. A_TO_P_IN_UTF16 A_TO_P_IN_UTF16 A_TO_P_IN_UTF16 A_TO_P_IN_UTF16
  1978. A_TO_P_IN_UTF16 A_TO_P_IN_UTF16 A_TO_P_IN_UTF16 A_TO_P_IN_UTF16
  1979. A_TO_P_IN_UTF16 A_TO_P_IN_UTF16 A_TO_P_IN_UTF16 A_TO_P_IN_UTF16
  1980. A_TO_P_IN_UTF16 A_TO_P_IN_UTF16 A_TO_P_IN_UTF16 A_TO_P_IN_UTF16
  1981. A_TO_P_IN_UTF16 A_TO_P_IN_UTF16 A_TO_P_IN_UTF16 A_TO_P_IN_UTF16
  1982. A_TO_P_IN_UTF16
  1983. /* clang-format on */
  1984. "\0]\0]\0>\0<\0/\0a\0>";
  1985. const XML_Char *expected =
  1986. /* clang-format off */
  1987. XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
  1988. XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
  1989. XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
  1990. XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
  1991. XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
  1992. XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
  1993. XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
  1994. XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
  1995. XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
  1996. XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
  1997. XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
  1998. XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
  1999. XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
  2000. XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
  2001. XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
  2002. XCS("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")
  2003. XCS("ABCDEFGHIJKLMNOP");
  2004. /* clang-format on */
  2005. CharData storage;
  2006. void *buffer;
  2007. CharData_Init(&storage);
  2008. XML_SetUserData(g_parser, &storage);
  2009. XML_SetCharacterDataHandler(g_parser, accumulate_characters);
  2010. buffer = XML_GetBuffer(g_parser, sizeof(text) - 1);
  2011. if (buffer == NULL)
  2012. fail("Could not allocate parse buffer");
  2013. assert(buffer != NULL);
  2014. memcpy(buffer, text, sizeof(text) - 1);
  2015. if (XML_ParseBuffer(g_parser, sizeof(text) - 1, XML_TRUE) == XML_STATUS_ERROR)
  2016. xml_failure(g_parser);
  2017. CharData_CheckXMLChars(&storage, expected);
  2018. }
  2019. END_TEST
  2020. /* Test handling of multiple unit UTF-16 characters */
  2021. START_TEST(test_multichar_cdata_utf16) {
  2022. /* Test data is:
  2023. * <?xml version='1.0' encoding='utf-16'?>
  2024. * <a><![CDATA[{MINIM}{CROTCHET}]]></a>
  2025. *
  2026. * where {MINIM} is U+1d15e (a minim or half-note)
  2027. * UTF-16: 0xd834 0xdd5e
  2028. * UTF-8: 0xf0 0x9d 0x85 0x9e
  2029. * and {CROTCHET} is U+1d15f (a crotchet or quarter-note)
  2030. * UTF-16: 0xd834 0xdd5f
  2031. * UTF-8: 0xf0 0x9d 0x85 0x9f
  2032. */
  2033. const char text[] = "\0<\0?\0x\0m\0l\0"
  2034. " \0v\0e\0r\0s\0i\0o\0n\0=\0'\0\x31\0.\0\x30\0'\0"
  2035. " \0e\0n\0c\0o\0d\0i\0n\0g\0=\0'\0u\0t\0f\0-\0"
  2036. "1\0"
  2037. "6\0'"
  2038. "\0?\0>\0\n"
  2039. "\0<\0a\0>\0<\0!\0[\0C\0D\0A\0T\0A\0["
  2040. "\xd8\x34\xdd\x5e\xd8\x34\xdd\x5f"
  2041. "\0]\0]\0>\0<\0/\0a\0>";
  2042. #ifdef XML_UNICODE
  2043. const XML_Char *expected = XCS("\xd834\xdd5e\xd834\xdd5f");
  2044. #else
  2045. const XML_Char *expected = XCS("\xf0\x9d\x85\x9e\xf0\x9d\x85\x9f");
  2046. #endif
  2047. CharData storage;
  2048. CharData_Init(&storage);
  2049. XML_SetUserData(g_parser, &storage);
  2050. XML_SetCharacterDataHandler(g_parser, accumulate_characters);
  2051. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)sizeof(text) - 1, XML_TRUE)
  2052. == XML_STATUS_ERROR)
  2053. xml_failure(g_parser);
  2054. CharData_CheckXMLChars(&storage, expected);
  2055. }
  2056. END_TEST
  2057. /* Test that an element name with a UTF-16 surrogate pair is rejected */
  2058. START_TEST(test_utf16_bad_surrogate_pair) {
  2059. /* Test data is:
  2060. * <?xml version='1.0' encoding='utf-16'?>
  2061. * <a><![CDATA[{BADLINB}]]></a>
  2062. *
  2063. * where {BADLINB} is U+10000 (the first Linear B character)
  2064. * with the UTF-16 surrogate pair in the wrong order, i.e.
  2065. * 0xdc00 0xd800
  2066. */
  2067. const char text[] = "\0<\0?\0x\0m\0l\0"
  2068. " \0v\0e\0r\0s\0i\0o\0n\0=\0'\0\x31\0.\0\x30\0'\0"
  2069. " \0e\0n\0c\0o\0d\0i\0n\0g\0=\0'\0u\0t\0f\0-\0"
  2070. "1\0"
  2071. "6\0'"
  2072. "\0?\0>\0\n"
  2073. "\0<\0a\0>\0<\0!\0[\0C\0D\0A\0T\0A\0["
  2074. "\xdc\x00\xd8\x00"
  2075. "\0]\0]\0>\0<\0/\0a\0>";
  2076. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)sizeof(text) - 1, XML_TRUE)
  2077. != XML_STATUS_ERROR)
  2078. fail("Reversed UTF-16 surrogate pair not faulted");
  2079. if (XML_GetErrorCode(g_parser) != XML_ERROR_INVALID_TOKEN)
  2080. xml_failure(g_parser);
  2081. }
  2082. END_TEST
  2083. START_TEST(test_bad_cdata) {
  2084. struct CaseData {
  2085. const char *text;
  2086. enum XML_Error expectedError;
  2087. };
  2088. struct CaseData cases[]
  2089. = {{"<a><", XML_ERROR_UNCLOSED_TOKEN},
  2090. {"<a><!", XML_ERROR_UNCLOSED_TOKEN},
  2091. {"<a><![", XML_ERROR_UNCLOSED_TOKEN},
  2092. {"<a><![C", XML_ERROR_UNCLOSED_TOKEN},
  2093. {"<a><![CD", XML_ERROR_UNCLOSED_TOKEN},
  2094. {"<a><![CDA", XML_ERROR_UNCLOSED_TOKEN},
  2095. {"<a><![CDAT", XML_ERROR_UNCLOSED_TOKEN},
  2096. {"<a><![CDATA", XML_ERROR_UNCLOSED_TOKEN},
  2097. {"<a><![CDATA[", XML_ERROR_UNCLOSED_CDATA_SECTION},
  2098. {"<a><![CDATA[]", XML_ERROR_UNCLOSED_CDATA_SECTION},
  2099. {"<a><![CDATA[]]", XML_ERROR_UNCLOSED_CDATA_SECTION},
  2100. {"<a><!<a/>", XML_ERROR_INVALID_TOKEN},
  2101. {"<a><![<a/>", XML_ERROR_UNCLOSED_TOKEN}, /* ?! */
  2102. {"<a><![C<a/>", XML_ERROR_UNCLOSED_TOKEN}, /* ?! */
  2103. {"<a><![CD<a/>", XML_ERROR_INVALID_TOKEN},
  2104. {"<a><![CDA<a/>", XML_ERROR_INVALID_TOKEN},
  2105. {"<a><![CDAT<a/>", XML_ERROR_INVALID_TOKEN},
  2106. {"<a><![CDATA<a/>", XML_ERROR_INVALID_TOKEN},
  2107. {"<a><![CDATA[<a/>", XML_ERROR_UNCLOSED_CDATA_SECTION},
  2108. {"<a><![CDATA[]<a/>", XML_ERROR_UNCLOSED_CDATA_SECTION},
  2109. {"<a><![CDATA[]]<a/>", XML_ERROR_UNCLOSED_CDATA_SECTION}};
  2110. size_t i = 0;
  2111. for (; i < sizeof(cases) / sizeof(struct CaseData); i++) {
  2112. const enum XML_Status actualStatus = _XML_Parse_SINGLE_BYTES(
  2113. g_parser, cases[i].text, (int)strlen(cases[i].text), XML_TRUE);
  2114. const enum XML_Error actualError = XML_GetErrorCode(g_parser);
  2115. assert(actualStatus == XML_STATUS_ERROR);
  2116. if (actualError != cases[i].expectedError) {
  2117. char message[100];
  2118. sprintf(message,
  2119. "Expected error %d but got error %d for case %u: \"%s\"\n",
  2120. cases[i].expectedError, actualError, (unsigned int)i + 1,
  2121. cases[i].text);
  2122. fail(message);
  2123. }
  2124. XML_ParserReset(g_parser, NULL);
  2125. }
  2126. }
  2127. END_TEST
  2128. /* Test failures in UTF-16 CDATA */
  2129. START_TEST(test_bad_cdata_utf16) {
  2130. struct CaseData {
  2131. size_t text_bytes;
  2132. const char *text;
  2133. enum XML_Error expected_error;
  2134. };
  2135. const char prolog[] = "\0<\0?\0x\0m\0l\0"
  2136. " \0v\0e\0r\0s\0i\0o\0n\0=\0'\0\x31\0.\0\x30\0'\0"
  2137. " \0e\0n\0c\0o\0d\0i\0n\0g\0=\0'\0u\0t\0f\0-\0"
  2138. "1\0"
  2139. "6\0'"
  2140. "\0?\0>\0\n"
  2141. "\0<\0a\0>";
  2142. struct CaseData cases[] = {
  2143. {1, "\0", XML_ERROR_UNCLOSED_TOKEN},
  2144. {2, "\0<", XML_ERROR_UNCLOSED_TOKEN},
  2145. {3, "\0<\0", XML_ERROR_UNCLOSED_TOKEN},
  2146. {4, "\0<\0!", XML_ERROR_UNCLOSED_TOKEN},
  2147. {5, "\0<\0!\0", XML_ERROR_UNCLOSED_TOKEN},
  2148. {6, "\0<\0!\0[", XML_ERROR_UNCLOSED_TOKEN},
  2149. {7, "\0<\0!\0[\0", XML_ERROR_UNCLOSED_TOKEN},
  2150. {8, "\0<\0!\0[\0C", XML_ERROR_UNCLOSED_TOKEN},
  2151. {9, "\0<\0!\0[\0C\0", XML_ERROR_UNCLOSED_TOKEN},
  2152. {10, "\0<\0!\0[\0C\0D", XML_ERROR_UNCLOSED_TOKEN},
  2153. {11, "\0<\0!\0[\0C\0D\0", XML_ERROR_UNCLOSED_TOKEN},
  2154. {12, "\0<\0!\0[\0C\0D\0A", XML_ERROR_UNCLOSED_TOKEN},
  2155. {13, "\0<\0!\0[\0C\0D\0A\0", XML_ERROR_UNCLOSED_TOKEN},
  2156. {14, "\0<\0!\0[\0C\0D\0A\0T", XML_ERROR_UNCLOSED_TOKEN},
  2157. {15, "\0<\0!\0[\0C\0D\0A\0T\0", XML_ERROR_UNCLOSED_TOKEN},
  2158. {16, "\0<\0!\0[\0C\0D\0A\0T\0A", XML_ERROR_UNCLOSED_TOKEN},
  2159. {17, "\0<\0!\0[\0C\0D\0A\0T\0A\0", XML_ERROR_UNCLOSED_TOKEN},
  2160. {18, "\0<\0!\0[\0C\0D\0A\0T\0A\0[", XML_ERROR_UNCLOSED_CDATA_SECTION},
  2161. {19, "\0<\0!\0[\0C\0D\0A\0T\0A\0[\0", XML_ERROR_UNCLOSED_CDATA_SECTION},
  2162. {20, "\0<\0!\0[\0C\0D\0A\0T\0A\0[\0Z", XML_ERROR_UNCLOSED_CDATA_SECTION},
  2163. /* Now add a four-byte UTF-16 character */
  2164. {21, "\0<\0!\0[\0C\0D\0A\0T\0A\0[\0Z\xd8",
  2165. XML_ERROR_UNCLOSED_CDATA_SECTION},
  2166. {22, "\0<\0!\0[\0C\0D\0A\0T\0A\0[\0Z\xd8\x34", XML_ERROR_PARTIAL_CHAR},
  2167. {23, "\0<\0!\0[\0C\0D\0A\0T\0A\0[\0Z\xd8\x34\xdd",
  2168. XML_ERROR_PARTIAL_CHAR},
  2169. {24, "\0<\0!\0[\0C\0D\0A\0T\0A\0[\0Z\xd8\x34\xdd\x5e",
  2170. XML_ERROR_UNCLOSED_CDATA_SECTION}};
  2171. size_t i;
  2172. for (i = 0; i < sizeof(cases) / sizeof(struct CaseData); i++) {
  2173. enum XML_Status actual_status;
  2174. enum XML_Error actual_error;
  2175. if (_XML_Parse_SINGLE_BYTES(g_parser, prolog, (int)sizeof(prolog) - 1,
  2176. XML_FALSE)
  2177. == XML_STATUS_ERROR)
  2178. xml_failure(g_parser);
  2179. actual_status = _XML_Parse_SINGLE_BYTES(g_parser, cases[i].text,
  2180. (int)cases[i].text_bytes, XML_TRUE);
  2181. assert(actual_status == XML_STATUS_ERROR);
  2182. actual_error = XML_GetErrorCode(g_parser);
  2183. if (actual_error != cases[i].expected_error) {
  2184. char message[1024];
  2185. sprintf(message,
  2186. "Expected error %d (%" XML_FMT_STR "), got %d (%" XML_FMT_STR
  2187. ") for case %lu\n",
  2188. cases[i].expected_error, XML_ErrorString(cases[i].expected_error),
  2189. actual_error, XML_ErrorString(actual_error),
  2190. (long unsigned)(i + 1));
  2191. fail(message);
  2192. }
  2193. XML_ParserReset(g_parser, NULL);
  2194. }
  2195. }
  2196. END_TEST
  2197. static const char *long_cdata_text
  2198. = "<s><![CDATA["
  2199. "012345678901234567890123456789012345678901234567890123456789"
  2200. "012345678901234567890123456789012345678901234567890123456789"
  2201. "012345678901234567890123456789012345678901234567890123456789"
  2202. "012345678901234567890123456789012345678901234567890123456789"
  2203. "012345678901234567890123456789012345678901234567890123456789"
  2204. "012345678901234567890123456789012345678901234567890123456789"
  2205. "012345678901234567890123456789012345678901234567890123456789"
  2206. "012345678901234567890123456789012345678901234567890123456789"
  2207. "012345678901234567890123456789012345678901234567890123456789"
  2208. "012345678901234567890123456789012345678901234567890123456789"
  2209. "012345678901234567890123456789012345678901234567890123456789"
  2210. "012345678901234567890123456789012345678901234567890123456789"
  2211. "012345678901234567890123456789012345678901234567890123456789"
  2212. "012345678901234567890123456789012345678901234567890123456789"
  2213. "012345678901234567890123456789012345678901234567890123456789"
  2214. "012345678901234567890123456789012345678901234567890123456789"
  2215. "012345678901234567890123456789012345678901234567890123456789"
  2216. "012345678901234567890123456789012345678901234567890123456789"
  2217. "012345678901234567890123456789012345678901234567890123456789"
  2218. "012345678901234567890123456789012345678901234567890123456789"
  2219. "]]></s>";
  2220. /* Test stopping the parser in cdata handler */
  2221. START_TEST(test_stop_parser_between_cdata_calls) {
  2222. const char *text = long_cdata_text;
  2223. XML_SetCharacterDataHandler(g_parser, clearing_aborting_character_handler);
  2224. resumable = XML_FALSE;
  2225. expect_failure(text, XML_ERROR_ABORTED, "Parse not aborted in CDATA handler");
  2226. }
  2227. END_TEST
  2228. /* Test suspending the parser in cdata handler */
  2229. START_TEST(test_suspend_parser_between_cdata_calls) {
  2230. const char *text = long_cdata_text;
  2231. enum XML_Status result;
  2232. XML_SetCharacterDataHandler(g_parser, clearing_aborting_character_handler);
  2233. resumable = XML_TRUE;
  2234. result = _XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE);
  2235. if (result != XML_STATUS_SUSPENDED) {
  2236. if (result == XML_STATUS_ERROR)
  2237. xml_failure(g_parser);
  2238. fail("Parse not suspended in CDATA handler");
  2239. }
  2240. if (XML_GetErrorCode(g_parser) != XML_ERROR_NONE)
  2241. xml_failure(g_parser);
  2242. }
  2243. END_TEST
  2244. /* Test memory allocation functions */
  2245. START_TEST(test_memory_allocation) {
  2246. char *buffer = (char *)XML_MemMalloc(g_parser, 256);
  2247. char *p;
  2248. if (buffer == NULL) {
  2249. fail("Allocation failed");
  2250. } else {
  2251. /* Try writing to memory; some OSes try to cheat! */
  2252. buffer[0] = 'T';
  2253. buffer[1] = 'E';
  2254. buffer[2] = 'S';
  2255. buffer[3] = 'T';
  2256. buffer[4] = '\0';
  2257. if (strcmp(buffer, "TEST") != 0) {
  2258. fail("Memory not writable");
  2259. } else {
  2260. p = (char *)XML_MemRealloc(g_parser, buffer, 512);
  2261. if (p == NULL) {
  2262. fail("Reallocation failed");
  2263. } else {
  2264. /* Write again, just to be sure */
  2265. buffer = p;
  2266. buffer[0] = 'V';
  2267. if (strcmp(buffer, "VEST") != 0) {
  2268. fail("Reallocated memory not writable");
  2269. }
  2270. }
  2271. }
  2272. XML_MemFree(g_parser, buffer);
  2273. }
  2274. }
  2275. END_TEST
  2276. static void XMLCALL
  2277. record_default_handler(void *userData, const XML_Char *s, int len) {
  2278. UNUSED_P(s);
  2279. UNUSED_P(len);
  2280. CharData_AppendXMLChars((CharData *)userData, XCS("D"), 1);
  2281. }
  2282. static void XMLCALL
  2283. record_cdata_handler(void *userData, const XML_Char *s, int len) {
  2284. UNUSED_P(s);
  2285. UNUSED_P(len);
  2286. CharData_AppendXMLChars((CharData *)userData, XCS("C"), 1);
  2287. XML_DefaultCurrent(g_parser);
  2288. }
  2289. static void XMLCALL
  2290. record_cdata_nodefault_handler(void *userData, const XML_Char *s, int len) {
  2291. UNUSED_P(s);
  2292. UNUSED_P(len);
  2293. CharData_AppendXMLChars((CharData *)userData, XCS("c"), 1);
  2294. }
  2295. static void XMLCALL
  2296. record_skip_handler(void *userData, const XML_Char *entityName,
  2297. int is_parameter_entity) {
  2298. UNUSED_P(entityName);
  2299. CharData_AppendXMLChars((CharData *)userData,
  2300. is_parameter_entity ? XCS("E") : XCS("e"), 1);
  2301. }
  2302. /* Test XML_DefaultCurrent() passes handling on correctly */
  2303. START_TEST(test_default_current) {
  2304. const char *text = "<doc>hell]</doc>";
  2305. const char *entity_text = "<!DOCTYPE doc [\n"
  2306. "<!ENTITY entity '&#37;'>\n"
  2307. "]>\n"
  2308. "<doc>&entity;</doc>";
  2309. CharData storage;
  2310. XML_SetDefaultHandler(g_parser, record_default_handler);
  2311. XML_SetCharacterDataHandler(g_parser, record_cdata_handler);
  2312. CharData_Init(&storage);
  2313. XML_SetUserData(g_parser, &storage);
  2314. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  2315. == XML_STATUS_ERROR)
  2316. xml_failure(g_parser);
  2317. CharData_CheckXMLChars(&storage, XCS("DCDCDCDCDCDD"));
  2318. /* Again, without the defaulting */
  2319. XML_ParserReset(g_parser, NULL);
  2320. XML_SetDefaultHandler(g_parser, record_default_handler);
  2321. XML_SetCharacterDataHandler(g_parser, record_cdata_nodefault_handler);
  2322. CharData_Init(&storage);
  2323. XML_SetUserData(g_parser, &storage);
  2324. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  2325. == XML_STATUS_ERROR)
  2326. xml_failure(g_parser);
  2327. CharData_CheckXMLChars(&storage, XCS("DcccccD"));
  2328. /* Now with an internal entity to complicate matters */
  2329. XML_ParserReset(g_parser, NULL);
  2330. XML_SetDefaultHandler(g_parser, record_default_handler);
  2331. XML_SetCharacterDataHandler(g_parser, record_cdata_handler);
  2332. CharData_Init(&storage);
  2333. XML_SetUserData(g_parser, &storage);
  2334. if (_XML_Parse_SINGLE_BYTES(g_parser, entity_text, (int)strlen(entity_text),
  2335. XML_TRUE)
  2336. == XML_STATUS_ERROR)
  2337. xml_failure(g_parser);
  2338. /* The default handler suppresses the entity */
  2339. CharData_CheckXMLChars(&storage, XCS("DDDDDDDDDDDDDDDDDDD"));
  2340. /* Again, with a skip handler */
  2341. XML_ParserReset(g_parser, NULL);
  2342. XML_SetDefaultHandler(g_parser, record_default_handler);
  2343. XML_SetCharacterDataHandler(g_parser, record_cdata_handler);
  2344. XML_SetSkippedEntityHandler(g_parser, record_skip_handler);
  2345. CharData_Init(&storage);
  2346. XML_SetUserData(g_parser, &storage);
  2347. if (_XML_Parse_SINGLE_BYTES(g_parser, entity_text, (int)strlen(entity_text),
  2348. XML_TRUE)
  2349. == XML_STATUS_ERROR)
  2350. xml_failure(g_parser);
  2351. /* The default handler suppresses the entity */
  2352. CharData_CheckXMLChars(&storage, XCS("DDDDDDDDDDDDDDDDDeD"));
  2353. /* This time, allow the entity through */
  2354. XML_ParserReset(g_parser, NULL);
  2355. XML_SetDefaultHandlerExpand(g_parser, record_default_handler);
  2356. XML_SetCharacterDataHandler(g_parser, record_cdata_handler);
  2357. CharData_Init(&storage);
  2358. XML_SetUserData(g_parser, &storage);
  2359. if (_XML_Parse_SINGLE_BYTES(g_parser, entity_text, (int)strlen(entity_text),
  2360. XML_TRUE)
  2361. == XML_STATUS_ERROR)
  2362. xml_failure(g_parser);
  2363. CharData_CheckXMLChars(&storage, XCS("DDDDDDDDDDDDDDDDDCDD"));
  2364. /* Finally, without passing the cdata to the default handler */
  2365. XML_ParserReset(g_parser, NULL);
  2366. XML_SetDefaultHandlerExpand(g_parser, record_default_handler);
  2367. XML_SetCharacterDataHandler(g_parser, record_cdata_nodefault_handler);
  2368. CharData_Init(&storage);
  2369. XML_SetUserData(g_parser, &storage);
  2370. if (_XML_Parse_SINGLE_BYTES(g_parser, entity_text, (int)strlen(entity_text),
  2371. XML_TRUE)
  2372. == XML_STATUS_ERROR)
  2373. xml_failure(g_parser);
  2374. CharData_CheckXMLChars(&storage, XCS("DDDDDDDDDDDDDDDDDcD"));
  2375. }
  2376. END_TEST
  2377. /* Test DTD element parsing code paths */
  2378. START_TEST(test_dtd_elements) {
  2379. const char *text = "<!DOCTYPE doc [\n"
  2380. "<!ELEMENT doc (chapter)>\n"
  2381. "<!ELEMENT chapter (#PCDATA)>\n"
  2382. "]>\n"
  2383. "<doc><chapter>Wombats are go</chapter></doc>";
  2384. XML_SetElementDeclHandler(g_parser, dummy_element_decl_handler);
  2385. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  2386. == XML_STATUS_ERROR)
  2387. xml_failure(g_parser);
  2388. }
  2389. END_TEST
  2390. static void XMLCALL
  2391. element_decl_check_model(void *userData, const XML_Char *name,
  2392. XML_Content *model) {
  2393. UNUSED_P(userData);
  2394. uint32_t errorFlags = 0;
  2395. /* Expected model array structure is this:
  2396. * [0] (type 6, quant 0)
  2397. * [1] (type 5, quant 0)
  2398. * [3] (type 4, quant 0, name "bar")
  2399. * [4] (type 4, quant 0, name "foo")
  2400. * [5] (type 4, quant 3, name "xyz")
  2401. * [2] (type 4, quant 2, name "zebra")
  2402. */
  2403. errorFlags |= ((xcstrcmp(name, XCS("junk")) == 0) ? 0 : (1u << 0));
  2404. errorFlags |= ((model != NULL) ? 0 : (1u << 1));
  2405. errorFlags |= ((model[0].type == XML_CTYPE_SEQ) ? 0 : (1u << 2));
  2406. errorFlags |= ((model[0].quant == XML_CQUANT_NONE) ? 0 : (1u << 3));
  2407. errorFlags |= ((model[0].numchildren == 2) ? 0 : (1u << 4));
  2408. errorFlags |= ((model[0].children == &model[1]) ? 0 : (1u << 5));
  2409. errorFlags |= ((model[0].name == NULL) ? 0 : (1u << 6));
  2410. errorFlags |= ((model[1].type == XML_CTYPE_CHOICE) ? 0 : (1u << 7));
  2411. errorFlags |= ((model[1].quant == XML_CQUANT_NONE) ? 0 : (1u << 8));
  2412. errorFlags |= ((model[1].numchildren == 3) ? 0 : (1u << 9));
  2413. errorFlags |= ((model[1].children == &model[3]) ? 0 : (1u << 10));
  2414. errorFlags |= ((model[1].name == NULL) ? 0 : (1u << 11));
  2415. errorFlags |= ((model[2].type == XML_CTYPE_NAME) ? 0 : (1u << 12));
  2416. errorFlags |= ((model[2].quant == XML_CQUANT_REP) ? 0 : (1u << 13));
  2417. errorFlags |= ((model[2].numchildren == 0) ? 0 : (1u << 14));
  2418. errorFlags |= ((model[2].children == NULL) ? 0 : (1u << 15));
  2419. errorFlags |= ((xcstrcmp(model[2].name, XCS("zebra")) == 0) ? 0 : (1u << 16));
  2420. errorFlags |= ((model[3].type == XML_CTYPE_NAME) ? 0 : (1u << 17));
  2421. errorFlags |= ((model[3].quant == XML_CQUANT_NONE) ? 0 : (1u << 18));
  2422. errorFlags |= ((model[3].numchildren == 0) ? 0 : (1u << 19));
  2423. errorFlags |= ((model[3].children == NULL) ? 0 : (1u << 20));
  2424. errorFlags |= ((xcstrcmp(model[3].name, XCS("bar")) == 0) ? 0 : (1u << 21));
  2425. errorFlags |= ((model[4].type == XML_CTYPE_NAME) ? 0 : (1u << 22));
  2426. errorFlags |= ((model[4].quant == XML_CQUANT_NONE) ? 0 : (1u << 23));
  2427. errorFlags |= ((model[4].numchildren == 0) ? 0 : (1u << 24));
  2428. errorFlags |= ((model[4].children == NULL) ? 0 : (1u << 25));
  2429. errorFlags |= ((xcstrcmp(model[4].name, XCS("foo")) == 0) ? 0 : (1u << 26));
  2430. errorFlags |= ((model[5].type == XML_CTYPE_NAME) ? 0 : (1u << 27));
  2431. errorFlags |= ((model[5].quant == XML_CQUANT_PLUS) ? 0 : (1u << 28));
  2432. errorFlags |= ((model[5].numchildren == 0) ? 0 : (1u << 29));
  2433. errorFlags |= ((model[5].children == NULL) ? 0 : (1u << 30));
  2434. errorFlags |= ((xcstrcmp(model[5].name, XCS("xyz")) == 0) ? 0 : (1u << 31));
  2435. XML_SetUserData(g_parser, (void *)(uintptr_t)errorFlags);
  2436. XML_FreeContentModel(g_parser, model);
  2437. }
  2438. START_TEST(test_dtd_elements_nesting) {
  2439. // Payload inspired by a test in Perl's XML::Parser
  2440. const char *text = "<!DOCTYPE foo [\n"
  2441. "<!ELEMENT junk ((bar|foo|xyz+), zebra*)>\n"
  2442. "]>\n"
  2443. "<foo/>";
  2444. XML_SetUserData(g_parser, (void *)(uintptr_t)-1);
  2445. XML_SetElementDeclHandler(g_parser, element_decl_check_model);
  2446. if (XML_Parse(g_parser, text, (int)strlen(text), XML_TRUE)
  2447. == XML_STATUS_ERROR)
  2448. xml_failure(g_parser);
  2449. if ((uint32_t)(uintptr_t)XML_GetUserData(g_parser) != 0)
  2450. fail("Element declaration model regression detected");
  2451. }
  2452. END_TEST
  2453. /* Test foreign DTD handling */
  2454. START_TEST(test_set_foreign_dtd) {
  2455. const char *text1 = "<?xml version='1.0' encoding='us-ascii'?>\n";
  2456. const char *text2 = "<doc>&entity;</doc>";
  2457. ExtTest test_data = {"<!ELEMENT doc (#PCDATA)*>", NULL, NULL};
  2458. /* Check hash salt is passed through too */
  2459. XML_SetHashSalt(g_parser, 0x12345678);
  2460. XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
  2461. XML_SetUserData(g_parser, &test_data);
  2462. XML_SetExternalEntityRefHandler(g_parser, external_entity_loader);
  2463. /* Add a default handler to exercise more code paths */
  2464. XML_SetDefaultHandler(g_parser, dummy_default_handler);
  2465. if (XML_UseForeignDTD(g_parser, XML_TRUE) != XML_ERROR_NONE)
  2466. fail("Could not set foreign DTD");
  2467. if (_XML_Parse_SINGLE_BYTES(g_parser, text1, (int)strlen(text1), XML_FALSE)
  2468. == XML_STATUS_ERROR)
  2469. xml_failure(g_parser);
  2470. /* Ensure that trying to set the DTD after parsing has started
  2471. * is faulted, even if it's the same setting.
  2472. */
  2473. if (XML_UseForeignDTD(g_parser, XML_TRUE)
  2474. != XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING)
  2475. fail("Failed to reject late foreign DTD setting");
  2476. /* Ditto for the hash salt */
  2477. if (XML_SetHashSalt(g_parser, 0x23456789))
  2478. fail("Failed to reject late hash salt change");
  2479. /* Now finish the parse */
  2480. if (_XML_Parse_SINGLE_BYTES(g_parser, text2, (int)strlen(text2), XML_TRUE)
  2481. == XML_STATUS_ERROR)
  2482. xml_failure(g_parser);
  2483. }
  2484. END_TEST
  2485. /* Test foreign DTD handling with a failing NotStandalone handler */
  2486. START_TEST(test_foreign_dtd_not_standalone) {
  2487. const char *text = "<?xml version='1.0' encoding='us-ascii'?>\n"
  2488. "<doc>&entity;</doc>";
  2489. ExtTest test_data = {"<!ELEMENT doc (#PCDATA)*>", NULL, NULL};
  2490. XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
  2491. XML_SetUserData(g_parser, &test_data);
  2492. XML_SetExternalEntityRefHandler(g_parser, external_entity_loader);
  2493. XML_SetNotStandaloneHandler(g_parser, reject_not_standalone_handler);
  2494. if (XML_UseForeignDTD(g_parser, XML_TRUE) != XML_ERROR_NONE)
  2495. fail("Could not set foreign DTD");
  2496. expect_failure(text, XML_ERROR_NOT_STANDALONE,
  2497. "NotStandalonehandler failed to reject");
  2498. }
  2499. END_TEST
  2500. /* Test invalid character in a foreign DTD is faulted */
  2501. START_TEST(test_invalid_foreign_dtd) {
  2502. const char *text = "<?xml version='1.0' encoding='us-ascii'?>\n"
  2503. "<doc>&entity;</doc>";
  2504. ExtFaults test_data
  2505. = {"$", "Dollar not faulted", NULL, XML_ERROR_INVALID_TOKEN};
  2506. XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
  2507. XML_SetUserData(g_parser, &test_data);
  2508. XML_SetExternalEntityRefHandler(g_parser, external_entity_faulter);
  2509. XML_UseForeignDTD(g_parser, XML_TRUE);
  2510. expect_failure(text, XML_ERROR_EXTERNAL_ENTITY_HANDLING,
  2511. "Bad DTD should not have been accepted");
  2512. }
  2513. END_TEST
  2514. /* Test foreign DTD use with a doctype */
  2515. START_TEST(test_foreign_dtd_with_doctype) {
  2516. const char *text1 = "<?xml version='1.0' encoding='us-ascii'?>\n"
  2517. "<!DOCTYPE doc [<!ENTITY entity 'hello world'>]>\n";
  2518. const char *text2 = "<doc>&entity;</doc>";
  2519. ExtTest test_data = {"<!ELEMENT doc (#PCDATA)*>", NULL, NULL};
  2520. /* Check hash salt is passed through too */
  2521. XML_SetHashSalt(g_parser, 0x12345678);
  2522. XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
  2523. XML_SetUserData(g_parser, &test_data);
  2524. XML_SetExternalEntityRefHandler(g_parser, external_entity_loader);
  2525. /* Add a default handler to exercise more code paths */
  2526. XML_SetDefaultHandler(g_parser, dummy_default_handler);
  2527. if (XML_UseForeignDTD(g_parser, XML_TRUE) != XML_ERROR_NONE)
  2528. fail("Could not set foreign DTD");
  2529. if (_XML_Parse_SINGLE_BYTES(g_parser, text1, (int)strlen(text1), XML_FALSE)
  2530. == XML_STATUS_ERROR)
  2531. xml_failure(g_parser);
  2532. /* Ensure that trying to set the DTD after parsing has started
  2533. * is faulted, even if it's the same setting.
  2534. */
  2535. if (XML_UseForeignDTD(g_parser, XML_TRUE)
  2536. != XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING)
  2537. fail("Failed to reject late foreign DTD setting");
  2538. /* Ditto for the hash salt */
  2539. if (XML_SetHashSalt(g_parser, 0x23456789))
  2540. fail("Failed to reject late hash salt change");
  2541. /* Now finish the parse */
  2542. if (_XML_Parse_SINGLE_BYTES(g_parser, text2, (int)strlen(text2), XML_TRUE)
  2543. == XML_STATUS_ERROR)
  2544. xml_failure(g_parser);
  2545. }
  2546. END_TEST
  2547. /* Test XML_UseForeignDTD with no external subset present */
  2548. static int XMLCALL
  2549. external_entity_null_loader(XML_Parser parser, const XML_Char *context,
  2550. const XML_Char *base, const XML_Char *systemId,
  2551. const XML_Char *publicId) {
  2552. UNUSED_P(parser);
  2553. UNUSED_P(context);
  2554. UNUSED_P(base);
  2555. UNUSED_P(systemId);
  2556. UNUSED_P(publicId);
  2557. return XML_STATUS_OK;
  2558. }
  2559. START_TEST(test_foreign_dtd_without_external_subset) {
  2560. const char *text = "<!DOCTYPE doc [<!ENTITY foo 'bar'>]>\n"
  2561. "<doc>&foo;</doc>";
  2562. XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
  2563. XML_SetUserData(g_parser, NULL);
  2564. XML_SetExternalEntityRefHandler(g_parser, external_entity_null_loader);
  2565. XML_UseForeignDTD(g_parser, XML_TRUE);
  2566. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  2567. == XML_STATUS_ERROR)
  2568. xml_failure(g_parser);
  2569. }
  2570. END_TEST
  2571. START_TEST(test_empty_foreign_dtd) {
  2572. const char *text = "<?xml version='1.0' encoding='us-ascii'?>\n"
  2573. "<doc>&entity;</doc>";
  2574. XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
  2575. XML_SetExternalEntityRefHandler(g_parser, external_entity_null_loader);
  2576. XML_UseForeignDTD(g_parser, XML_TRUE);
  2577. expect_failure(text, XML_ERROR_UNDEFINED_ENTITY,
  2578. "Undefined entity not faulted");
  2579. }
  2580. END_TEST
  2581. /* Test XML Base is set and unset appropriately */
  2582. START_TEST(test_set_base) {
  2583. const XML_Char *old_base;
  2584. const XML_Char *new_base = XCS("/local/file/name.xml");
  2585. old_base = XML_GetBase(g_parser);
  2586. if (XML_SetBase(g_parser, new_base) != XML_STATUS_OK)
  2587. fail("Unable to set base");
  2588. if (xcstrcmp(XML_GetBase(g_parser), new_base) != 0)
  2589. fail("Base setting not correct");
  2590. if (XML_SetBase(g_parser, NULL) != XML_STATUS_OK)
  2591. fail("Unable to NULL base");
  2592. if (XML_GetBase(g_parser) != NULL)
  2593. fail("Base setting not nulled");
  2594. XML_SetBase(g_parser, old_base);
  2595. }
  2596. END_TEST
  2597. /* Test attribute counts, indexing, etc */
  2598. typedef struct attrInfo {
  2599. const XML_Char *name;
  2600. const XML_Char *value;
  2601. } AttrInfo;
  2602. typedef struct elementInfo {
  2603. const XML_Char *name;
  2604. int attr_count;
  2605. const XML_Char *id_name;
  2606. AttrInfo *attributes;
  2607. } ElementInfo;
  2608. static void XMLCALL
  2609. counting_start_element_handler(void *userData, const XML_Char *name,
  2610. const XML_Char **atts) {
  2611. ElementInfo *info = (ElementInfo *)userData;
  2612. AttrInfo *attr;
  2613. int count, id, i;
  2614. while (info->name != NULL) {
  2615. if (! xcstrcmp(name, info->name))
  2616. break;
  2617. info++;
  2618. }
  2619. if (info->name == NULL)
  2620. fail("Element not recognised");
  2621. /* The attribute count is twice what you might expect. It is a
  2622. * count of items in atts, an array which contains alternating
  2623. * attribute names and attribute values. For the naive user this
  2624. * is possibly a little unexpected, but it is what the
  2625. * documentation in expat.h tells us to expect.
  2626. */
  2627. count = XML_GetSpecifiedAttributeCount(g_parser);
  2628. if (info->attr_count * 2 != count) {
  2629. fail("Not got expected attribute count");
  2630. return;
  2631. }
  2632. id = XML_GetIdAttributeIndex(g_parser);
  2633. if (id == -1 && info->id_name != NULL) {
  2634. fail("ID not present");
  2635. return;
  2636. }
  2637. if (id != -1 && xcstrcmp(atts[id], info->id_name)) {
  2638. fail("ID does not have the correct name");
  2639. return;
  2640. }
  2641. for (i = 0; i < info->attr_count; i++) {
  2642. attr = info->attributes;
  2643. while (attr->name != NULL) {
  2644. if (! xcstrcmp(atts[0], attr->name))
  2645. break;
  2646. attr++;
  2647. }
  2648. if (attr->name == NULL) {
  2649. fail("Attribute not recognised");
  2650. return;
  2651. }
  2652. if (xcstrcmp(atts[1], attr->value)) {
  2653. fail("Attribute has wrong value");
  2654. return;
  2655. }
  2656. /* Remember, two entries in atts per attribute (see above) */
  2657. atts += 2;
  2658. }
  2659. }
  2660. START_TEST(test_attributes) {
  2661. const char *text = "<!DOCTYPE doc [\n"
  2662. "<!ELEMENT doc (tag)>\n"
  2663. "<!ATTLIST doc id ID #REQUIRED>\n"
  2664. "]>"
  2665. "<doc a='1' id='one' b='2'>"
  2666. "<tag c='3'/>"
  2667. "</doc>";
  2668. AttrInfo doc_info[] = {{XCS("a"), XCS("1")},
  2669. {XCS("b"), XCS("2")},
  2670. {XCS("id"), XCS("one")},
  2671. {NULL, NULL}};
  2672. AttrInfo tag_info[] = {{XCS("c"), XCS("3")}, {NULL, NULL}};
  2673. ElementInfo info[] = {{XCS("doc"), 3, XCS("id"), NULL},
  2674. {XCS("tag"), 1, NULL, NULL},
  2675. {NULL, 0, NULL, NULL}};
  2676. info[0].attributes = doc_info;
  2677. info[1].attributes = tag_info;
  2678. XML_SetStartElementHandler(g_parser, counting_start_element_handler);
  2679. XML_SetUserData(g_parser, info);
  2680. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  2681. == XML_STATUS_ERROR)
  2682. xml_failure(g_parser);
  2683. }
  2684. END_TEST
  2685. /* Test reset works correctly in the middle of processing an internal
  2686. * entity. Exercises some obscure code in XML_ParserReset().
  2687. */
  2688. START_TEST(test_reset_in_entity) {
  2689. const char *text = "<!DOCTYPE doc [\n"
  2690. "<!ENTITY wombat 'wom'>\n"
  2691. "<!ENTITY entity 'hi &wom; there'>\n"
  2692. "]>\n"
  2693. "<doc>&entity;</doc>";
  2694. XML_ParsingStatus status;
  2695. resumable = XML_TRUE;
  2696. XML_SetCharacterDataHandler(g_parser, clearing_aborting_character_handler);
  2697. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_FALSE)
  2698. == XML_STATUS_ERROR)
  2699. xml_failure(g_parser);
  2700. XML_GetParsingStatus(g_parser, &status);
  2701. if (status.parsing != XML_SUSPENDED)
  2702. fail("Parsing status not SUSPENDED");
  2703. XML_ParserReset(g_parser, NULL);
  2704. XML_GetParsingStatus(g_parser, &status);
  2705. if (status.parsing != XML_INITIALIZED)
  2706. fail("Parsing status doesn't reset to INITIALIZED");
  2707. }
  2708. END_TEST
  2709. /* Test that resume correctly passes through parse errors */
  2710. START_TEST(test_resume_invalid_parse) {
  2711. const char *text = "<doc>Hello</doc"; /* Missing closing wedge */
  2712. resumable = XML_TRUE;
  2713. XML_SetCharacterDataHandler(g_parser, clearing_aborting_character_handler);
  2714. if (XML_Parse(g_parser, text, (int)strlen(text), XML_TRUE)
  2715. == XML_STATUS_ERROR)
  2716. xml_failure(g_parser);
  2717. if (XML_ResumeParser(g_parser) == XML_STATUS_OK)
  2718. fail("Resumed invalid parse not faulted");
  2719. if (XML_GetErrorCode(g_parser) != XML_ERROR_UNCLOSED_TOKEN)
  2720. fail("Invalid parse not correctly faulted");
  2721. }
  2722. END_TEST
  2723. /* Test that re-suspended parses are correctly passed through */
  2724. START_TEST(test_resume_resuspended) {
  2725. const char *text = "<doc>Hello<meep/>world</doc>";
  2726. resumable = XML_TRUE;
  2727. XML_SetCharacterDataHandler(g_parser, clearing_aborting_character_handler);
  2728. if (XML_Parse(g_parser, text, (int)strlen(text), XML_TRUE)
  2729. == XML_STATUS_ERROR)
  2730. xml_failure(g_parser);
  2731. resumable = XML_TRUE;
  2732. XML_SetCharacterDataHandler(g_parser, clearing_aborting_character_handler);
  2733. if (XML_ResumeParser(g_parser) != XML_STATUS_SUSPENDED)
  2734. fail("Resumption not suspended");
  2735. /* This one should succeed and finish up */
  2736. if (XML_ResumeParser(g_parser) != XML_STATUS_OK)
  2737. xml_failure(g_parser);
  2738. }
  2739. END_TEST
  2740. /* Test that CDATA shows up correctly through a default handler */
  2741. START_TEST(test_cdata_default) {
  2742. const char *text = "<doc><![CDATA[Hello\nworld]]></doc>";
  2743. const XML_Char *expected = XCS("<doc><![CDATA[Hello\nworld]]></doc>");
  2744. CharData storage;
  2745. CharData_Init(&storage);
  2746. XML_SetUserData(g_parser, &storage);
  2747. XML_SetDefaultHandler(g_parser, accumulate_characters);
  2748. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  2749. == XML_STATUS_ERROR)
  2750. xml_failure(g_parser);
  2751. CharData_CheckXMLChars(&storage, expected);
  2752. }
  2753. END_TEST
  2754. /* Test resetting a subordinate parser does exactly nothing */
  2755. static int XMLCALL
  2756. external_entity_resetter(XML_Parser parser, const XML_Char *context,
  2757. const XML_Char *base, const XML_Char *systemId,
  2758. const XML_Char *publicId) {
  2759. const char *text = "<!ELEMENT doc (#PCDATA)*>";
  2760. XML_Parser ext_parser;
  2761. XML_ParsingStatus status;
  2762. UNUSED_P(base);
  2763. UNUSED_P(systemId);
  2764. UNUSED_P(publicId);
  2765. ext_parser = XML_ExternalEntityParserCreate(parser, context, NULL);
  2766. if (ext_parser == NULL)
  2767. fail("Could not create external entity parser");
  2768. XML_GetParsingStatus(ext_parser, &status);
  2769. if (status.parsing != XML_INITIALIZED) {
  2770. fail("Parsing status is not INITIALIZED");
  2771. return XML_STATUS_ERROR;
  2772. }
  2773. if (_XML_Parse_SINGLE_BYTES(ext_parser, text, (int)strlen(text), XML_TRUE)
  2774. == XML_STATUS_ERROR) {
  2775. xml_failure(parser);
  2776. return XML_STATUS_ERROR;
  2777. }
  2778. XML_GetParsingStatus(ext_parser, &status);
  2779. if (status.parsing != XML_FINISHED) {
  2780. fail("Parsing status is not FINISHED");
  2781. return XML_STATUS_ERROR;
  2782. }
  2783. /* Check we can't parse here */
  2784. if (XML_Parse(ext_parser, text, (int)strlen(text), XML_TRUE)
  2785. != XML_STATUS_ERROR)
  2786. fail("Parsing when finished not faulted");
  2787. if (XML_GetErrorCode(ext_parser) != XML_ERROR_FINISHED)
  2788. fail("Parsing when finished faulted with wrong code");
  2789. XML_ParserReset(ext_parser, NULL);
  2790. XML_GetParsingStatus(ext_parser, &status);
  2791. if (status.parsing != XML_FINISHED) {
  2792. fail("Parsing status not still FINISHED");
  2793. return XML_STATUS_ERROR;
  2794. }
  2795. XML_ParserFree(ext_parser);
  2796. return XML_STATUS_OK;
  2797. }
  2798. START_TEST(test_subordinate_reset) {
  2799. const char *text = "<?xml version='1.0' encoding='us-ascii'?>\n"
  2800. "<!DOCTYPE doc SYSTEM 'foo'>\n"
  2801. "<doc>&entity;</doc>";
  2802. XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
  2803. XML_SetExternalEntityRefHandler(g_parser, external_entity_resetter);
  2804. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  2805. == XML_STATUS_ERROR)
  2806. xml_failure(g_parser);
  2807. }
  2808. END_TEST
  2809. /* Test suspending a subordinate parser */
  2810. static void XMLCALL
  2811. entity_suspending_decl_handler(void *userData, const XML_Char *name,
  2812. XML_Content *model) {
  2813. XML_Parser ext_parser = (XML_Parser)userData;
  2814. UNUSED_P(name);
  2815. if (XML_StopParser(ext_parser, XML_TRUE) != XML_STATUS_ERROR)
  2816. fail("Attempting to suspend a subordinate parser not faulted");
  2817. if (XML_GetErrorCode(ext_parser) != XML_ERROR_SUSPEND_PE)
  2818. fail("Suspending subordinate parser get wrong code");
  2819. XML_SetElementDeclHandler(ext_parser, NULL);
  2820. XML_FreeContentModel(g_parser, model);
  2821. }
  2822. static int XMLCALL
  2823. external_entity_suspender(XML_Parser parser, const XML_Char *context,
  2824. const XML_Char *base, const XML_Char *systemId,
  2825. const XML_Char *publicId) {
  2826. const char *text = "<!ELEMENT doc (#PCDATA)*>";
  2827. XML_Parser ext_parser;
  2828. UNUSED_P(base);
  2829. UNUSED_P(systemId);
  2830. UNUSED_P(publicId);
  2831. ext_parser = XML_ExternalEntityParserCreate(parser, context, NULL);
  2832. if (ext_parser == NULL)
  2833. fail("Could not create external entity parser");
  2834. XML_SetElementDeclHandler(ext_parser, entity_suspending_decl_handler);
  2835. XML_SetUserData(ext_parser, ext_parser);
  2836. if (_XML_Parse_SINGLE_BYTES(ext_parser, text, (int)strlen(text), XML_TRUE)
  2837. == XML_STATUS_ERROR) {
  2838. xml_failure(ext_parser);
  2839. return XML_STATUS_ERROR;
  2840. }
  2841. XML_ParserFree(ext_parser);
  2842. return XML_STATUS_OK;
  2843. }
  2844. START_TEST(test_subordinate_suspend) {
  2845. const char *text = "<?xml version='1.0' encoding='us-ascii'?>\n"
  2846. "<!DOCTYPE doc SYSTEM 'foo'>\n"
  2847. "<doc>&entity;</doc>";
  2848. XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
  2849. XML_SetExternalEntityRefHandler(g_parser, external_entity_suspender);
  2850. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  2851. == XML_STATUS_ERROR)
  2852. xml_failure(g_parser);
  2853. }
  2854. END_TEST
  2855. /* Test suspending a subordinate parser from an XML declaration */
  2856. /* Increases code coverage of the tests */
  2857. static void XMLCALL
  2858. entity_suspending_xdecl_handler(void *userData, const XML_Char *version,
  2859. const XML_Char *encoding, int standalone) {
  2860. XML_Parser ext_parser = (XML_Parser)userData;
  2861. UNUSED_P(version);
  2862. UNUSED_P(encoding);
  2863. UNUSED_P(standalone);
  2864. XML_StopParser(ext_parser, resumable);
  2865. XML_SetXmlDeclHandler(ext_parser, NULL);
  2866. }
  2867. static int XMLCALL
  2868. external_entity_suspend_xmldecl(XML_Parser parser, const XML_Char *context,
  2869. const XML_Char *base, const XML_Char *systemId,
  2870. const XML_Char *publicId) {
  2871. const char *text = "<?xml version='1.0' encoding='us-ascii'?>";
  2872. XML_Parser ext_parser;
  2873. XML_ParsingStatus status;
  2874. enum XML_Status rc;
  2875. UNUSED_P(base);
  2876. UNUSED_P(systemId);
  2877. UNUSED_P(publicId);
  2878. ext_parser = XML_ExternalEntityParserCreate(parser, context, NULL);
  2879. if (ext_parser == NULL)
  2880. fail("Could not create external entity parser");
  2881. XML_SetXmlDeclHandler(ext_parser, entity_suspending_xdecl_handler);
  2882. XML_SetUserData(ext_parser, ext_parser);
  2883. rc = _XML_Parse_SINGLE_BYTES(ext_parser, text, (int)strlen(text), XML_TRUE);
  2884. XML_GetParsingStatus(ext_parser, &status);
  2885. if (resumable) {
  2886. if (rc == XML_STATUS_ERROR)
  2887. xml_failure(ext_parser);
  2888. if (status.parsing != XML_SUSPENDED)
  2889. fail("Ext Parsing status not SUSPENDED");
  2890. } else {
  2891. if (rc != XML_STATUS_ERROR)
  2892. fail("Ext parsing not aborted");
  2893. if (XML_GetErrorCode(ext_parser) != XML_ERROR_ABORTED)
  2894. xml_failure(ext_parser);
  2895. if (status.parsing != XML_FINISHED)
  2896. fail("Ext Parsing status not FINISHED");
  2897. }
  2898. XML_ParserFree(ext_parser);
  2899. return XML_STATUS_OK;
  2900. }
  2901. START_TEST(test_subordinate_xdecl_suspend) {
  2902. const char *text
  2903. = "<!DOCTYPE doc [\n"
  2904. " <!ENTITY entity SYSTEM 'http://example.org/dummy.ent'>\n"
  2905. "]>\n"
  2906. "<doc>&entity;</doc>";
  2907. XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
  2908. XML_SetExternalEntityRefHandler(g_parser, external_entity_suspend_xmldecl);
  2909. resumable = XML_TRUE;
  2910. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  2911. == XML_STATUS_ERROR)
  2912. xml_failure(g_parser);
  2913. }
  2914. END_TEST
  2915. START_TEST(test_subordinate_xdecl_abort) {
  2916. const char *text
  2917. = "<!DOCTYPE doc [\n"
  2918. " <!ENTITY entity SYSTEM 'http://example.org/dummy.ent'>\n"
  2919. "]>\n"
  2920. "<doc>&entity;</doc>";
  2921. XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
  2922. XML_SetExternalEntityRefHandler(g_parser, external_entity_suspend_xmldecl);
  2923. resumable = XML_FALSE;
  2924. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  2925. == XML_STATUS_ERROR)
  2926. xml_failure(g_parser);
  2927. }
  2928. END_TEST
  2929. /* Test external entity fault handling with suspension */
  2930. static int XMLCALL
  2931. external_entity_suspending_faulter(XML_Parser parser, const XML_Char *context,
  2932. const XML_Char *base,
  2933. const XML_Char *systemId,
  2934. const XML_Char *publicId) {
  2935. XML_Parser ext_parser;
  2936. ExtFaults *fault = (ExtFaults *)XML_GetUserData(parser);
  2937. void *buffer;
  2938. int parse_len = (int)strlen(fault->parse_text);
  2939. UNUSED_P(base);
  2940. UNUSED_P(systemId);
  2941. UNUSED_P(publicId);
  2942. ext_parser = XML_ExternalEntityParserCreate(parser, context, NULL);
  2943. if (ext_parser == NULL)
  2944. fail("Could not create external entity parser");
  2945. XML_SetXmlDeclHandler(ext_parser, entity_suspending_xdecl_handler);
  2946. XML_SetUserData(ext_parser, ext_parser);
  2947. resumable = XML_TRUE;
  2948. buffer = XML_GetBuffer(ext_parser, parse_len);
  2949. if (buffer == NULL)
  2950. fail("Could not allocate parse buffer");
  2951. assert(buffer != NULL);
  2952. memcpy(buffer, fault->parse_text, parse_len);
  2953. if (XML_ParseBuffer(ext_parser, parse_len, XML_FALSE) != XML_STATUS_SUSPENDED)
  2954. fail("XML declaration did not suspend");
  2955. if (XML_ResumeParser(ext_parser) != XML_STATUS_OK)
  2956. xml_failure(ext_parser);
  2957. if (XML_ParseBuffer(ext_parser, 0, XML_TRUE) != XML_STATUS_ERROR)
  2958. fail(fault->fail_text);
  2959. if (XML_GetErrorCode(ext_parser) != fault->error)
  2960. xml_failure(ext_parser);
  2961. XML_ParserFree(ext_parser);
  2962. return XML_STATUS_ERROR;
  2963. }
  2964. START_TEST(test_ext_entity_invalid_suspended_parse) {
  2965. const char *text = "<!DOCTYPE doc [\n"
  2966. " <!ENTITY en SYSTEM 'http://example.org/dummy.ent'>\n"
  2967. "]>\n"
  2968. "<doc>&en;</doc>";
  2969. ExtFaults faults[]
  2970. = {{"<?xml version='1.0' encoding='us-ascii'?><",
  2971. "Incomplete element declaration not faulted", NULL,
  2972. XML_ERROR_UNCLOSED_TOKEN},
  2973. {/* First two bytes of a three-byte char */
  2974. "<?xml version='1.0' encoding='utf-8'?>\xe2\x82",
  2975. "Incomplete character not faulted", NULL, XML_ERROR_PARTIAL_CHAR},
  2976. {NULL, NULL, NULL, XML_ERROR_NONE}};
  2977. ExtFaults *fault;
  2978. for (fault = &faults[0]; fault->parse_text != NULL; fault++) {
  2979. XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
  2980. XML_SetExternalEntityRefHandler(g_parser,
  2981. external_entity_suspending_faulter);
  2982. XML_SetUserData(g_parser, fault);
  2983. expect_failure(text, XML_ERROR_EXTERNAL_ENTITY_HANDLING,
  2984. "Parser did not report external entity error");
  2985. XML_ParserReset(g_parser, NULL);
  2986. }
  2987. }
  2988. END_TEST
  2989. /* Test setting an explicit encoding */
  2990. START_TEST(test_explicit_encoding) {
  2991. const char *text1 = "<doc>Hello ";
  2992. const char *text2 = " World</doc>";
  2993. /* Just check that we can set the encoding to NULL before starting */
  2994. if (XML_SetEncoding(g_parser, NULL) != XML_STATUS_OK)
  2995. fail("Failed to initialise encoding to NULL");
  2996. /* Say we are UTF-8 */
  2997. if (XML_SetEncoding(g_parser, XCS("utf-8")) != XML_STATUS_OK)
  2998. fail("Failed to set explicit encoding");
  2999. if (_XML_Parse_SINGLE_BYTES(g_parser, text1, (int)strlen(text1), XML_FALSE)
  3000. == XML_STATUS_ERROR)
  3001. xml_failure(g_parser);
  3002. /* Try to switch encodings mid-parse */
  3003. if (XML_SetEncoding(g_parser, XCS("us-ascii")) != XML_STATUS_ERROR)
  3004. fail("Allowed encoding change");
  3005. if (_XML_Parse_SINGLE_BYTES(g_parser, text2, (int)strlen(text2), XML_TRUE)
  3006. == XML_STATUS_ERROR)
  3007. xml_failure(g_parser);
  3008. /* Try now the parse is over */
  3009. if (XML_SetEncoding(g_parser, NULL) != XML_STATUS_OK)
  3010. fail("Failed to unset encoding");
  3011. }
  3012. END_TEST
  3013. /* Test handling of trailing CR (rather than newline) */
  3014. static void XMLCALL
  3015. cr_cdata_handler(void *userData, const XML_Char *s, int len) {
  3016. int *pfound = (int *)userData;
  3017. /* Internal processing turns the CR into a newline for the
  3018. * character data handler, but not for the default handler
  3019. */
  3020. if (len == 1 && (*s == XCS('\n') || *s == XCS('\r')))
  3021. *pfound = 1;
  3022. }
  3023. START_TEST(test_trailing_cr) {
  3024. const char *text = "<doc>\r";
  3025. int found_cr;
  3026. /* Try with a character handler, for code coverage */
  3027. XML_SetCharacterDataHandler(g_parser, cr_cdata_handler);
  3028. XML_SetUserData(g_parser, &found_cr);
  3029. found_cr = 0;
  3030. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  3031. == XML_STATUS_OK)
  3032. fail("Failed to fault unclosed doc");
  3033. if (found_cr == 0)
  3034. fail("Did not catch the carriage return");
  3035. XML_ParserReset(g_parser, NULL);
  3036. /* Now with a default handler instead */
  3037. XML_SetDefaultHandler(g_parser, cr_cdata_handler);
  3038. XML_SetUserData(g_parser, &found_cr);
  3039. found_cr = 0;
  3040. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  3041. == XML_STATUS_OK)
  3042. fail("Failed to fault unclosed doc");
  3043. if (found_cr == 0)
  3044. fail("Did not catch default carriage return");
  3045. }
  3046. END_TEST
  3047. /* Test trailing CR in an external entity parse */
  3048. static int XMLCALL
  3049. external_entity_cr_catcher(XML_Parser parser, const XML_Char *context,
  3050. const XML_Char *base, const XML_Char *systemId,
  3051. const XML_Char *publicId) {
  3052. const char *text = "\r";
  3053. XML_Parser ext_parser;
  3054. UNUSED_P(base);
  3055. UNUSED_P(systemId);
  3056. UNUSED_P(publicId);
  3057. ext_parser = XML_ExternalEntityParserCreate(parser, context, NULL);
  3058. if (ext_parser == NULL)
  3059. fail("Could not create external entity parser");
  3060. XML_SetCharacterDataHandler(ext_parser, cr_cdata_handler);
  3061. if (_XML_Parse_SINGLE_BYTES(ext_parser, text, (int)strlen(text), XML_TRUE)
  3062. == XML_STATUS_ERROR)
  3063. xml_failure(ext_parser);
  3064. XML_ParserFree(ext_parser);
  3065. return XML_STATUS_OK;
  3066. }
  3067. static int XMLCALL
  3068. external_entity_bad_cr_catcher(XML_Parser parser, const XML_Char *context,
  3069. const XML_Char *base, const XML_Char *systemId,
  3070. const XML_Char *publicId) {
  3071. const char *text = "<tag>\r";
  3072. XML_Parser ext_parser;
  3073. UNUSED_P(base);
  3074. UNUSED_P(systemId);
  3075. UNUSED_P(publicId);
  3076. ext_parser = XML_ExternalEntityParserCreate(parser, context, NULL);
  3077. if (ext_parser == NULL)
  3078. fail("Could not create external entity parser");
  3079. XML_SetCharacterDataHandler(ext_parser, cr_cdata_handler);
  3080. if (_XML_Parse_SINGLE_BYTES(ext_parser, text, (int)strlen(text), XML_TRUE)
  3081. == XML_STATUS_OK)
  3082. fail("Async entity error not caught");
  3083. if (XML_GetErrorCode(ext_parser) != XML_ERROR_ASYNC_ENTITY)
  3084. xml_failure(ext_parser);
  3085. XML_ParserFree(ext_parser);
  3086. return XML_STATUS_OK;
  3087. }
  3088. START_TEST(test_ext_entity_trailing_cr) {
  3089. const char *text = "<!DOCTYPE doc [\n"
  3090. " <!ENTITY en SYSTEM 'http://example.org/dummy.ent'>\n"
  3091. "]>\n"
  3092. "<doc>&en;</doc>";
  3093. int found_cr;
  3094. XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
  3095. XML_SetExternalEntityRefHandler(g_parser, external_entity_cr_catcher);
  3096. XML_SetUserData(g_parser, &found_cr);
  3097. found_cr = 0;
  3098. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  3099. != XML_STATUS_OK)
  3100. xml_failure(g_parser);
  3101. if (found_cr == 0)
  3102. fail("No carriage return found");
  3103. XML_ParserReset(g_parser, NULL);
  3104. /* Try again with a different trailing CR */
  3105. XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
  3106. XML_SetExternalEntityRefHandler(g_parser, external_entity_bad_cr_catcher);
  3107. XML_SetUserData(g_parser, &found_cr);
  3108. found_cr = 0;
  3109. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  3110. != XML_STATUS_OK)
  3111. xml_failure(g_parser);
  3112. if (found_cr == 0)
  3113. fail("No carriage return found");
  3114. }
  3115. END_TEST
  3116. /* Test handling of trailing square bracket */
  3117. static void XMLCALL
  3118. rsqb_handler(void *userData, const XML_Char *s, int len) {
  3119. int *pfound = (int *)userData;
  3120. if (len == 1 && *s == XCS(']'))
  3121. *pfound = 1;
  3122. }
  3123. START_TEST(test_trailing_rsqb) {
  3124. const char *text8 = "<doc>]";
  3125. const char text16[] = "\xFF\xFE<\000d\000o\000c\000>\000]\000";
  3126. int found_rsqb;
  3127. int text8_len = (int)strlen(text8);
  3128. XML_SetCharacterDataHandler(g_parser, rsqb_handler);
  3129. XML_SetUserData(g_parser, &found_rsqb);
  3130. found_rsqb = 0;
  3131. if (_XML_Parse_SINGLE_BYTES(g_parser, text8, text8_len, XML_TRUE)
  3132. == XML_STATUS_OK)
  3133. fail("Failed to fault unclosed doc");
  3134. if (found_rsqb == 0)
  3135. fail("Did not catch the right square bracket");
  3136. /* Try again with a different encoding */
  3137. XML_ParserReset(g_parser, NULL);
  3138. XML_SetCharacterDataHandler(g_parser, rsqb_handler);
  3139. XML_SetUserData(g_parser, &found_rsqb);
  3140. found_rsqb = 0;
  3141. if (_XML_Parse_SINGLE_BYTES(g_parser, text16, (int)sizeof(text16) - 1,
  3142. XML_TRUE)
  3143. == XML_STATUS_OK)
  3144. fail("Failed to fault unclosed doc");
  3145. if (found_rsqb == 0)
  3146. fail("Did not catch the right square bracket");
  3147. /* And finally with a default handler */
  3148. XML_ParserReset(g_parser, NULL);
  3149. XML_SetDefaultHandler(g_parser, rsqb_handler);
  3150. XML_SetUserData(g_parser, &found_rsqb);
  3151. found_rsqb = 0;
  3152. if (_XML_Parse_SINGLE_BYTES(g_parser, text16, (int)sizeof(text16) - 1,
  3153. XML_TRUE)
  3154. == XML_STATUS_OK)
  3155. fail("Failed to fault unclosed doc");
  3156. if (found_rsqb == 0)
  3157. fail("Did not catch the right square bracket");
  3158. }
  3159. END_TEST
  3160. /* Test trailing right square bracket in an external entity parse */
  3161. static int XMLCALL
  3162. external_entity_rsqb_catcher(XML_Parser parser, const XML_Char *context,
  3163. const XML_Char *base, const XML_Char *systemId,
  3164. const XML_Char *publicId) {
  3165. const char *text = "<tag>]";
  3166. XML_Parser ext_parser;
  3167. UNUSED_P(base);
  3168. UNUSED_P(systemId);
  3169. UNUSED_P(publicId);
  3170. ext_parser = XML_ExternalEntityParserCreate(parser, context, NULL);
  3171. if (ext_parser == NULL)
  3172. fail("Could not create external entity parser");
  3173. XML_SetCharacterDataHandler(ext_parser, rsqb_handler);
  3174. if (_XML_Parse_SINGLE_BYTES(ext_parser, text, (int)strlen(text), XML_TRUE)
  3175. != XML_STATUS_ERROR)
  3176. fail("Async entity error not caught");
  3177. if (XML_GetErrorCode(ext_parser) != XML_ERROR_ASYNC_ENTITY)
  3178. xml_failure(ext_parser);
  3179. XML_ParserFree(ext_parser);
  3180. return XML_STATUS_OK;
  3181. }
  3182. START_TEST(test_ext_entity_trailing_rsqb) {
  3183. const char *text = "<!DOCTYPE doc [\n"
  3184. " <!ENTITY en SYSTEM 'http://example.org/dummy.ent'>\n"
  3185. "]>\n"
  3186. "<doc>&en;</doc>";
  3187. int found_rsqb;
  3188. XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
  3189. XML_SetExternalEntityRefHandler(g_parser, external_entity_rsqb_catcher);
  3190. XML_SetUserData(g_parser, &found_rsqb);
  3191. found_rsqb = 0;
  3192. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  3193. != XML_STATUS_OK)
  3194. xml_failure(g_parser);
  3195. if (found_rsqb == 0)
  3196. fail("No right square bracket found");
  3197. }
  3198. END_TEST
  3199. /* Test CDATA handling in an external entity */
  3200. static int XMLCALL
  3201. external_entity_good_cdata_ascii(XML_Parser parser, const XML_Char *context,
  3202. const XML_Char *base, const XML_Char *systemId,
  3203. const XML_Char *publicId) {
  3204. const char *text = "<a><![CDATA[<greeting>Hello, world!</greeting>]]></a>";
  3205. const XML_Char *expected = XCS("<greeting>Hello, world!</greeting>");
  3206. CharData storage;
  3207. XML_Parser ext_parser;
  3208. UNUSED_P(base);
  3209. UNUSED_P(systemId);
  3210. UNUSED_P(publicId);
  3211. CharData_Init(&storage);
  3212. ext_parser = XML_ExternalEntityParserCreate(parser, context, NULL);
  3213. if (ext_parser == NULL)
  3214. fail("Could not create external entity parser");
  3215. XML_SetUserData(ext_parser, &storage);
  3216. XML_SetCharacterDataHandler(ext_parser, accumulate_characters);
  3217. if (_XML_Parse_SINGLE_BYTES(ext_parser, text, (int)strlen(text), XML_TRUE)
  3218. == XML_STATUS_ERROR)
  3219. xml_failure(ext_parser);
  3220. CharData_CheckXMLChars(&storage, expected);
  3221. XML_ParserFree(ext_parser);
  3222. return XML_STATUS_OK;
  3223. }
  3224. START_TEST(test_ext_entity_good_cdata) {
  3225. const char *text = "<!DOCTYPE doc [\n"
  3226. " <!ENTITY en SYSTEM 'http://example.org/dummy.ent'>\n"
  3227. "]>\n"
  3228. "<doc>&en;</doc>";
  3229. XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
  3230. XML_SetExternalEntityRefHandler(g_parser, external_entity_good_cdata_ascii);
  3231. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  3232. != XML_STATUS_OK)
  3233. xml_failure(g_parser);
  3234. }
  3235. END_TEST
  3236. /* Test user parameter settings */
  3237. /* Variable holding the expected handler userData */
  3238. static void *handler_data = NULL;
  3239. /* Count of the number of times the comment handler has been invoked */
  3240. static int comment_count = 0;
  3241. /* Count of the number of skipped entities */
  3242. static int skip_count = 0;
  3243. /* Count of the number of times the XML declaration handler is invoked */
  3244. static int xdecl_count = 0;
  3245. static void XMLCALL
  3246. xml_decl_handler(void *userData, const XML_Char *version,
  3247. const XML_Char *encoding, int standalone) {
  3248. UNUSED_P(version);
  3249. UNUSED_P(encoding);
  3250. if (userData != handler_data)
  3251. fail("User data (xml decl) not correctly set");
  3252. if (standalone != -1)
  3253. fail("Standalone not flagged as not present in XML decl");
  3254. xdecl_count++;
  3255. }
  3256. static void XMLCALL
  3257. param_check_skip_handler(void *userData, const XML_Char *entityName,
  3258. int is_parameter_entity) {
  3259. UNUSED_P(entityName);
  3260. UNUSED_P(is_parameter_entity);
  3261. if (userData != handler_data)
  3262. fail("User data (skip) not correctly set");
  3263. skip_count++;
  3264. }
  3265. static void XMLCALL
  3266. data_check_comment_handler(void *userData, const XML_Char *data) {
  3267. UNUSED_P(data);
  3268. /* Check that the userData passed through is what we expect */
  3269. if (userData != handler_data)
  3270. fail("User data (parser) not correctly set");
  3271. /* Check that the user data in the parser is appropriate */
  3272. if (XML_GetUserData(userData) != (void *)1)
  3273. fail("User data in parser not correctly set");
  3274. comment_count++;
  3275. }
  3276. static int XMLCALL
  3277. external_entity_param_checker(XML_Parser parser, const XML_Char *context,
  3278. const XML_Char *base, const XML_Char *systemId,
  3279. const XML_Char *publicId) {
  3280. const char *text = "<!-- Subordinate parser -->\n"
  3281. "<!ELEMENT doc (#PCDATA)*>";
  3282. XML_Parser ext_parser;
  3283. UNUSED_P(base);
  3284. UNUSED_P(systemId);
  3285. UNUSED_P(publicId);
  3286. ext_parser = XML_ExternalEntityParserCreate(parser, context, NULL);
  3287. if (ext_parser == NULL)
  3288. fail("Could not create external entity parser");
  3289. handler_data = ext_parser;
  3290. if (_XML_Parse_SINGLE_BYTES(ext_parser, text, (int)strlen(text), XML_TRUE)
  3291. == XML_STATUS_ERROR) {
  3292. xml_failure(parser);
  3293. return XML_STATUS_ERROR;
  3294. }
  3295. handler_data = parser;
  3296. XML_ParserFree(ext_parser);
  3297. return XML_STATUS_OK;
  3298. }
  3299. START_TEST(test_user_parameters) {
  3300. const char *text = "<?xml version='1.0' encoding='us-ascii'?>\n"
  3301. "<!-- Primary parse -->\n"
  3302. "<!DOCTYPE doc SYSTEM 'foo'>\n"
  3303. "<doc>&entity;";
  3304. const char *epilog = "<!-- Back to primary parser -->\n"
  3305. "</doc>";
  3306. comment_count = 0;
  3307. skip_count = 0;
  3308. xdecl_count = 0;
  3309. XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
  3310. XML_SetXmlDeclHandler(g_parser, xml_decl_handler);
  3311. XML_SetExternalEntityRefHandler(g_parser, external_entity_param_checker);
  3312. XML_SetCommentHandler(g_parser, data_check_comment_handler);
  3313. XML_SetSkippedEntityHandler(g_parser, param_check_skip_handler);
  3314. XML_UseParserAsHandlerArg(g_parser);
  3315. XML_SetUserData(g_parser, (void *)1);
  3316. handler_data = g_parser;
  3317. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_FALSE)
  3318. == XML_STATUS_ERROR)
  3319. xml_failure(g_parser);
  3320. if (comment_count != 2)
  3321. fail("Comment handler not invoked enough times");
  3322. /* Ensure we can't change policy mid-parse */
  3323. if (XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_NEVER))
  3324. fail("Changed param entity parsing policy while parsing");
  3325. if (_XML_Parse_SINGLE_BYTES(g_parser, epilog, (int)strlen(epilog), XML_TRUE)
  3326. == XML_STATUS_ERROR)
  3327. xml_failure(g_parser);
  3328. if (comment_count != 3)
  3329. fail("Comment handler not invoked enough times");
  3330. if (skip_count != 1)
  3331. fail("Skip handler not invoked enough times");
  3332. if (xdecl_count != 1)
  3333. fail("XML declaration handler not invoked");
  3334. }
  3335. END_TEST
  3336. /* Test that an explicit external entity handler argument replaces
  3337. * the parser as the first argument.
  3338. *
  3339. * We do not call the first parameter to the external entity handler
  3340. * 'parser' for once, since the first time the handler is called it
  3341. * will actually be a text string. We need to be able to access the
  3342. * global 'parser' variable to create our external entity parser from,
  3343. * since there are code paths we need to ensure get executed.
  3344. */
  3345. static int XMLCALL
  3346. external_entity_ref_param_checker(XML_Parser parameter, const XML_Char *context,
  3347. const XML_Char *base,
  3348. const XML_Char *systemId,
  3349. const XML_Char *publicId) {
  3350. const char *text = "<!ELEMENT doc (#PCDATA)*>";
  3351. XML_Parser ext_parser;
  3352. UNUSED_P(base);
  3353. UNUSED_P(systemId);
  3354. UNUSED_P(publicId);
  3355. if ((void *)parameter != handler_data)
  3356. fail("External entity ref handler parameter not correct");
  3357. /* Here we use the global 'parser' variable */
  3358. ext_parser = XML_ExternalEntityParserCreate(g_parser, context, NULL);
  3359. if (ext_parser == NULL)
  3360. fail("Could not create external entity parser");
  3361. if (_XML_Parse_SINGLE_BYTES(ext_parser, text, (int)strlen(text), XML_TRUE)
  3362. == XML_STATUS_ERROR)
  3363. xml_failure(ext_parser);
  3364. XML_ParserFree(ext_parser);
  3365. return XML_STATUS_OK;
  3366. }
  3367. START_TEST(test_ext_entity_ref_parameter) {
  3368. const char *text = "<?xml version='1.0' encoding='us-ascii'?>\n"
  3369. "<!DOCTYPE doc SYSTEM 'foo'>\n"
  3370. "<doc>&entity;</doc>";
  3371. XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
  3372. XML_SetExternalEntityRefHandler(g_parser, external_entity_ref_param_checker);
  3373. /* Set a handler arg that is not NULL and not parser (which is
  3374. * what NULL would cause to be passed.
  3375. */
  3376. XML_SetExternalEntityRefHandlerArg(g_parser, (void *)text);
  3377. handler_data = (void *)text;
  3378. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  3379. == XML_STATUS_ERROR)
  3380. xml_failure(g_parser);
  3381. /* Now try again with unset args */
  3382. XML_ParserReset(g_parser, NULL);
  3383. XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
  3384. XML_SetExternalEntityRefHandler(g_parser, external_entity_ref_param_checker);
  3385. XML_SetExternalEntityRefHandlerArg(g_parser, NULL);
  3386. handler_data = (void *)g_parser;
  3387. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  3388. == XML_STATUS_ERROR)
  3389. xml_failure(g_parser);
  3390. }
  3391. END_TEST
  3392. /* Test the parsing of an empty string */
  3393. START_TEST(test_empty_parse) {
  3394. const char *text = "<doc></doc>";
  3395. const char *partial = "<doc>";
  3396. if (XML_Parse(g_parser, NULL, 0, XML_FALSE) == XML_STATUS_ERROR)
  3397. fail("Parsing empty string faulted");
  3398. if (XML_Parse(g_parser, NULL, 0, XML_TRUE) != XML_STATUS_ERROR)
  3399. fail("Parsing final empty string not faulted");
  3400. if (XML_GetErrorCode(g_parser) != XML_ERROR_NO_ELEMENTS)
  3401. fail("Parsing final empty string faulted for wrong reason");
  3402. /* Now try with valid text before the empty end */
  3403. XML_ParserReset(g_parser, NULL);
  3404. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_FALSE)
  3405. == XML_STATUS_ERROR)
  3406. xml_failure(g_parser);
  3407. if (XML_Parse(g_parser, NULL, 0, XML_TRUE) == XML_STATUS_ERROR)
  3408. fail("Parsing final empty string faulted");
  3409. /* Now try with invalid text before the empty end */
  3410. XML_ParserReset(g_parser, NULL);
  3411. if (_XML_Parse_SINGLE_BYTES(g_parser, partial, (int)strlen(partial),
  3412. XML_FALSE)
  3413. == XML_STATUS_ERROR)
  3414. xml_failure(g_parser);
  3415. if (XML_Parse(g_parser, NULL, 0, XML_TRUE) != XML_STATUS_ERROR)
  3416. fail("Parsing final incomplete empty string not faulted");
  3417. }
  3418. END_TEST
  3419. /* Test odd corners of the XML_GetBuffer interface */
  3420. static enum XML_Status
  3421. get_feature(enum XML_FeatureEnum feature_id, long *presult) {
  3422. const XML_Feature *feature = XML_GetFeatureList();
  3423. if (feature == NULL)
  3424. return XML_STATUS_ERROR;
  3425. for (; feature->feature != XML_FEATURE_END; feature++) {
  3426. if (feature->feature == feature_id) {
  3427. *presult = feature->value;
  3428. return XML_STATUS_OK;
  3429. }
  3430. }
  3431. return XML_STATUS_ERROR;
  3432. }
  3433. /* Having an element name longer than 1024 characters exercises some
  3434. * of the pool allocation code in the parser that otherwise does not
  3435. * get executed. The count at the end of the line is the number of
  3436. * characters (bytes) in the element name by that point.x
  3437. */
  3438. static const char *get_buffer_test_text
  3439. = "<documentwitharidiculouslylongelementnametotease" /* 0x030 */
  3440. "aparticularcorneroftheallocationinXML_GetBuffers" /* 0x060 */
  3441. "othatwecanimprovethecoverageyetagain012345678901" /* 0x090 */
  3442. "123456789abcdef0123456789abcdef0123456789abcdef0" /* 0x0c0 */
  3443. "123456789abcdef0123456789abcdef0123456789abcdef0" /* 0x0f0 */
  3444. "123456789abcdef0123456789abcdef0123456789abcdef0" /* 0x120 */
  3445. "123456789abcdef0123456789abcdef0123456789abcdef0" /* 0x150 */
  3446. "123456789abcdef0123456789abcdef0123456789abcdef0" /* 0x180 */
  3447. "123456789abcdef0123456789abcdef0123456789abcdef0" /* 0x1b0 */
  3448. "123456789abcdef0123456789abcdef0123456789abcdef0" /* 0x1e0 */
  3449. "123456789abcdef0123456789abcdef0123456789abcdef0" /* 0x210 */
  3450. "123456789abcdef0123456789abcdef0123456789abcdef0" /* 0x240 */
  3451. "123456789abcdef0123456789abcdef0123456789abcdef0" /* 0x270 */
  3452. "123456789abcdef0123456789abcdef0123456789abcdef0" /* 0x2a0 */
  3453. "123456789abcdef0123456789abcdef0123456789abcdef0" /* 0x2d0 */
  3454. "123456789abcdef0123456789abcdef0123456789abcdef0" /* 0x300 */
  3455. "123456789abcdef0123456789abcdef0123456789abcdef0" /* 0x330 */
  3456. "123456789abcdef0123456789abcdef0123456789abcdef0" /* 0x360 */
  3457. "123456789abcdef0123456789abcdef0123456789abcdef0" /* 0x390 */
  3458. "123456789abcdef0123456789abcdef0123456789abcdef0" /* 0x3c0 */
  3459. "123456789abcdef0123456789abcdef0123456789abcdef0" /* 0x3f0 */
  3460. "123456789abcdef0123456789abcdef0123456789>\n<ef0"; /* 0x420 */
  3461. /* Test odd corners of the XML_GetBuffer interface */
  3462. START_TEST(test_get_buffer_1) {
  3463. const char *text = get_buffer_test_text;
  3464. void *buffer;
  3465. long context_bytes;
  3466. /* Attempt to allocate a negative length buffer */
  3467. if (XML_GetBuffer(g_parser, -12) != NULL)
  3468. fail("Negative length buffer not failed");
  3469. /* Now get a small buffer and extend it past valid length */
  3470. buffer = XML_GetBuffer(g_parser, 1536);
  3471. if (buffer == NULL)
  3472. fail("1.5K buffer failed");
  3473. assert(buffer != NULL);
  3474. memcpy(buffer, text, strlen(text));
  3475. if (XML_ParseBuffer(g_parser, (int)strlen(text), XML_FALSE)
  3476. == XML_STATUS_ERROR)
  3477. xml_failure(g_parser);
  3478. if (XML_GetBuffer(g_parser, INT_MAX) != NULL)
  3479. fail("INT_MAX buffer not failed");
  3480. /* Now try extending it a more reasonable but still too large
  3481. * amount. The allocator in XML_GetBuffer() doubles the buffer
  3482. * size until it exceeds the requested amount or INT_MAX. If it
  3483. * exceeds INT_MAX, it rejects the request, so we want a request
  3484. * between INT_MAX and INT_MAX/2. A gap of 1K seems comfortable,
  3485. * with an extra byte just to ensure that the request is off any
  3486. * boundary. The request will be inflated internally by
  3487. * XML_CONTEXT_BYTES (if defined), so we subtract that from our
  3488. * request.
  3489. */
  3490. if (get_feature(XML_FEATURE_CONTEXT_BYTES, &context_bytes) != XML_STATUS_OK)
  3491. context_bytes = 0;
  3492. if (XML_GetBuffer(g_parser, INT_MAX - (context_bytes + 1025)) != NULL)
  3493. fail("INT_MAX- buffer not failed");
  3494. /* Now try extending it a carefully crafted amount */
  3495. if (XML_GetBuffer(g_parser, 1000) == NULL)
  3496. fail("1000 buffer failed");
  3497. }
  3498. END_TEST
  3499. /* Test more corners of the XML_GetBuffer interface */
  3500. START_TEST(test_get_buffer_2) {
  3501. const char *text = get_buffer_test_text;
  3502. void *buffer;
  3503. /* Now get a decent buffer */
  3504. buffer = XML_GetBuffer(g_parser, 1536);
  3505. if (buffer == NULL)
  3506. fail("1.5K buffer failed");
  3507. assert(buffer != NULL);
  3508. memcpy(buffer, text, strlen(text));
  3509. if (XML_ParseBuffer(g_parser, (int)strlen(text), XML_FALSE)
  3510. == XML_STATUS_ERROR)
  3511. xml_failure(g_parser);
  3512. /* Extend it, to catch a different code path */
  3513. if (XML_GetBuffer(g_parser, 1024) == NULL)
  3514. fail("1024 buffer failed");
  3515. }
  3516. END_TEST
  3517. /* Test for signed integer overflow CVE-2022-23852 */
  3518. #if defined(XML_CONTEXT_BYTES)
  3519. START_TEST(test_get_buffer_3_overflow) {
  3520. XML_Parser parser = XML_ParserCreate(NULL);
  3521. assert(parser != NULL);
  3522. const char *const text = "\n";
  3523. const int expectedKeepValue = (int)strlen(text);
  3524. // After this call, variable "keep" in XML_GetBuffer will
  3525. // have value expectedKeepValue
  3526. if (XML_Parse(parser, text, (int)strlen(text), XML_FALSE /* isFinal */)
  3527. == XML_STATUS_ERROR)
  3528. xml_failure(parser);
  3529. assert(expectedKeepValue > 0);
  3530. if (XML_GetBuffer(parser, INT_MAX - expectedKeepValue + 1) != NULL)
  3531. fail("enlarging buffer not failed");
  3532. XML_ParserFree(parser);
  3533. }
  3534. END_TEST
  3535. #endif // defined(XML_CONTEXT_BYTES)
  3536. /* Test position information macros */
  3537. START_TEST(test_byte_info_at_end) {
  3538. const char *text = "<doc></doc>";
  3539. if (XML_GetCurrentByteIndex(g_parser) != -1
  3540. || XML_GetCurrentByteCount(g_parser) != 0)
  3541. fail("Byte index/count incorrect at start of parse");
  3542. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  3543. == XML_STATUS_ERROR)
  3544. xml_failure(g_parser);
  3545. /* At end, the count will be zero and the index the end of string */
  3546. if (XML_GetCurrentByteCount(g_parser) != 0)
  3547. fail("Terminal byte count incorrect");
  3548. if (XML_GetCurrentByteIndex(g_parser) != (XML_Index)strlen(text))
  3549. fail("Terminal byte index incorrect");
  3550. }
  3551. END_TEST
  3552. /* Test position information from errors */
  3553. #define PRE_ERROR_STR "<doc></"
  3554. #define POST_ERROR_STR "wombat></doc>"
  3555. START_TEST(test_byte_info_at_error) {
  3556. const char *text = PRE_ERROR_STR POST_ERROR_STR;
  3557. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  3558. == XML_STATUS_OK)
  3559. fail("Syntax error not faulted");
  3560. if (XML_GetCurrentByteCount(g_parser) != 0)
  3561. fail("Error byte count incorrect");
  3562. if (XML_GetCurrentByteIndex(g_parser) != strlen(PRE_ERROR_STR))
  3563. fail("Error byte index incorrect");
  3564. }
  3565. END_TEST
  3566. #undef PRE_ERROR_STR
  3567. #undef POST_ERROR_STR
  3568. /* Test position information in handler */
  3569. typedef struct ByteTestData {
  3570. int start_element_len;
  3571. int cdata_len;
  3572. int total_string_len;
  3573. } ByteTestData;
  3574. static void
  3575. byte_character_handler(void *userData, const XML_Char *s, int len) {
  3576. #ifdef XML_CONTEXT_BYTES
  3577. int offset, size;
  3578. const char *buffer;
  3579. ByteTestData *data = (ByteTestData *)userData;
  3580. UNUSED_P(s);
  3581. buffer = XML_GetInputContext(g_parser, &offset, &size);
  3582. if (buffer == NULL)
  3583. fail("Failed to get context buffer");
  3584. if (offset != data->start_element_len)
  3585. fail("Context offset in unexpected position");
  3586. if (len != data->cdata_len)
  3587. fail("CDATA length reported incorrectly");
  3588. if (size != data->total_string_len)
  3589. fail("Context size is not full buffer");
  3590. if (XML_GetCurrentByteIndex(g_parser) != offset)
  3591. fail("Character byte index incorrect");
  3592. if (XML_GetCurrentByteCount(g_parser) != len)
  3593. fail("Character byte count incorrect");
  3594. #else
  3595. UNUSED_P(s);
  3596. UNUSED_P(userData);
  3597. UNUSED_P(len);
  3598. #endif
  3599. }
  3600. #define START_ELEMENT "<e>"
  3601. #define CDATA_TEXT "Hello"
  3602. #define END_ELEMENT "</e>"
  3603. START_TEST(test_byte_info_at_cdata) {
  3604. const char *text = START_ELEMENT CDATA_TEXT END_ELEMENT;
  3605. int offset, size;
  3606. ByteTestData data;
  3607. /* Check initial context is empty */
  3608. if (XML_GetInputContext(g_parser, &offset, &size) != NULL)
  3609. fail("Unexpected context at start of parse");
  3610. data.start_element_len = (int)strlen(START_ELEMENT);
  3611. data.cdata_len = (int)strlen(CDATA_TEXT);
  3612. data.total_string_len = (int)strlen(text);
  3613. XML_SetCharacterDataHandler(g_parser, byte_character_handler);
  3614. XML_SetUserData(g_parser, &data);
  3615. if (XML_Parse(g_parser, text, (int)strlen(text), XML_TRUE) != XML_STATUS_OK)
  3616. xml_failure(g_parser);
  3617. }
  3618. END_TEST
  3619. #undef START_ELEMENT
  3620. #undef CDATA_TEXT
  3621. #undef END_ELEMENT
  3622. /* Test predefined entities are correctly recognised */
  3623. START_TEST(test_predefined_entities) {
  3624. const char *text = "<doc>&lt;&gt;&amp;&quot;&apos;</doc>";
  3625. const XML_Char *expected = XCS("<doc>&lt;&gt;&amp;&quot;&apos;</doc>");
  3626. const XML_Char *result = XCS("<>&\"'");
  3627. CharData storage;
  3628. XML_SetDefaultHandler(g_parser, accumulate_characters);
  3629. /* run_character_check uses XML_SetCharacterDataHandler(), which
  3630. * unfortunately heads off a code path that we need to exercise.
  3631. */
  3632. CharData_Init(&storage);
  3633. XML_SetUserData(g_parser, &storage);
  3634. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  3635. == XML_STATUS_ERROR)
  3636. xml_failure(g_parser);
  3637. /* The default handler doesn't translate the entities */
  3638. CharData_CheckXMLChars(&storage, expected);
  3639. /* Now try again and check the translation */
  3640. XML_ParserReset(g_parser, NULL);
  3641. run_character_check(text, result);
  3642. }
  3643. END_TEST
  3644. /* Regression test that an invalid tag in an external parameter
  3645. * reference in an external DTD is correctly faulted.
  3646. *
  3647. * Only a few specific tags are legal in DTDs ignoring comments and
  3648. * processing instructions, all of which begin with an exclamation
  3649. * mark. "<el/>" is not one of them, so the parser should raise an
  3650. * error on encountering it.
  3651. */
  3652. static int XMLCALL
  3653. external_entity_param(XML_Parser parser, const XML_Char *context,
  3654. const XML_Char *base, const XML_Char *systemId,
  3655. const XML_Char *publicId) {
  3656. const char *text1 = "<!ELEMENT doc EMPTY>\n"
  3657. "<!ENTITY % e1 SYSTEM '004-2.ent'>\n"
  3658. "<!ENTITY % e2 '%e1;'>\n"
  3659. "%e1;\n";
  3660. const char *text2 = "<!ELEMENT el EMPTY>\n"
  3661. "<el/>\n";
  3662. XML_Parser ext_parser;
  3663. UNUSED_P(base);
  3664. UNUSED_P(publicId);
  3665. if (systemId == NULL)
  3666. return XML_STATUS_OK;
  3667. ext_parser = XML_ExternalEntityParserCreate(parser, context, NULL);
  3668. if (ext_parser == NULL)
  3669. fail("Could not create external entity parser");
  3670. if (! xcstrcmp(systemId, XCS("004-1.ent"))) {
  3671. if (_XML_Parse_SINGLE_BYTES(ext_parser, text1, (int)strlen(text1), XML_TRUE)
  3672. != XML_STATUS_ERROR)
  3673. fail("Inner DTD with invalid tag not rejected");
  3674. if (XML_GetErrorCode(ext_parser) != XML_ERROR_EXTERNAL_ENTITY_HANDLING)
  3675. xml_failure(ext_parser);
  3676. } else if (! xcstrcmp(systemId, XCS("004-2.ent"))) {
  3677. if (_XML_Parse_SINGLE_BYTES(ext_parser, text2, (int)strlen(text2), XML_TRUE)
  3678. != XML_STATUS_ERROR)
  3679. fail("Invalid tag in external param not rejected");
  3680. if (XML_GetErrorCode(ext_parser) != XML_ERROR_SYNTAX)
  3681. xml_failure(ext_parser);
  3682. } else {
  3683. fail("Unknown system ID");
  3684. }
  3685. XML_ParserFree(ext_parser);
  3686. return XML_STATUS_ERROR;
  3687. }
  3688. START_TEST(test_invalid_tag_in_dtd) {
  3689. const char *text = "<!DOCTYPE doc SYSTEM '004-1.ent'>\n"
  3690. "<doc></doc>\n";
  3691. XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
  3692. XML_SetExternalEntityRefHandler(g_parser, external_entity_param);
  3693. expect_failure(text, XML_ERROR_EXTERNAL_ENTITY_HANDLING,
  3694. "Invalid tag IN DTD external param not rejected");
  3695. }
  3696. END_TEST
  3697. /* Test entities not quite the predefined ones are not mis-recognised */
  3698. START_TEST(test_not_predefined_entities) {
  3699. const char *text[] = {"<doc>&pt;</doc>", "<doc>&amo;</doc>",
  3700. "<doc>&quid;</doc>", "<doc>&apod;</doc>", NULL};
  3701. int i = 0;
  3702. while (text[i] != NULL) {
  3703. expect_failure(text[i], XML_ERROR_UNDEFINED_ENTITY,
  3704. "Undefined entity not rejected");
  3705. XML_ParserReset(g_parser, NULL);
  3706. i++;
  3707. }
  3708. }
  3709. END_TEST
  3710. /* Test conditional inclusion (IGNORE) */
  3711. static int XMLCALL
  3712. external_entity_load_ignore(XML_Parser parser, const XML_Char *context,
  3713. const XML_Char *base, const XML_Char *systemId,
  3714. const XML_Char *publicId) {
  3715. const char *text = "<![IGNORE[<!ELEMENT e (#PCDATA)*>]]>";
  3716. XML_Parser ext_parser;
  3717. UNUSED_P(base);
  3718. UNUSED_P(systemId);
  3719. UNUSED_P(publicId);
  3720. ext_parser = XML_ExternalEntityParserCreate(parser, context, NULL);
  3721. if (ext_parser == NULL)
  3722. fail("Could not create external entity parser");
  3723. if (_XML_Parse_SINGLE_BYTES(ext_parser, text, (int)strlen(text), XML_TRUE)
  3724. == XML_STATUS_ERROR)
  3725. xml_failure(parser);
  3726. XML_ParserFree(ext_parser);
  3727. return XML_STATUS_OK;
  3728. }
  3729. START_TEST(test_ignore_section) {
  3730. const char *text = "<!DOCTYPE doc SYSTEM 'foo'>\n"
  3731. "<doc><e>&entity;</e></doc>";
  3732. const XML_Char *expected
  3733. = XCS("<![IGNORE[<!ELEMENT e (#PCDATA)*>]]>\n&entity;");
  3734. CharData storage;
  3735. CharData_Init(&storage);
  3736. XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
  3737. XML_SetUserData(g_parser, &storage);
  3738. XML_SetExternalEntityRefHandler(g_parser, external_entity_load_ignore);
  3739. XML_SetDefaultHandler(g_parser, accumulate_characters);
  3740. XML_SetStartDoctypeDeclHandler(g_parser, dummy_start_doctype_handler);
  3741. XML_SetEndDoctypeDeclHandler(g_parser, dummy_end_doctype_handler);
  3742. XML_SetElementDeclHandler(g_parser, dummy_element_decl_handler);
  3743. XML_SetStartElementHandler(g_parser, dummy_start_element);
  3744. XML_SetEndElementHandler(g_parser, dummy_end_element);
  3745. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  3746. == XML_STATUS_ERROR)
  3747. xml_failure(g_parser);
  3748. CharData_CheckXMLChars(&storage, expected);
  3749. }
  3750. END_TEST
  3751. static int XMLCALL
  3752. external_entity_load_ignore_utf16(XML_Parser parser, const XML_Char *context,
  3753. const XML_Char *base,
  3754. const XML_Char *systemId,
  3755. const XML_Char *publicId) {
  3756. const char text[] =
  3757. /* <![IGNORE[<!ELEMENT e (#PCDATA)*>]]> */
  3758. "<\0!\0[\0I\0G\0N\0O\0R\0E\0[\0"
  3759. "<\0!\0E\0L\0E\0M\0E\0N\0T\0 \0e\0 \0"
  3760. "(\0#\0P\0C\0D\0A\0T\0A\0)\0*\0>\0]\0]\0>\0";
  3761. XML_Parser ext_parser;
  3762. UNUSED_P(base);
  3763. UNUSED_P(systemId);
  3764. UNUSED_P(publicId);
  3765. ext_parser = XML_ExternalEntityParserCreate(parser, context, NULL);
  3766. if (ext_parser == NULL)
  3767. fail("Could not create external entity parser");
  3768. if (_XML_Parse_SINGLE_BYTES(ext_parser, text, (int)sizeof(text) - 1, XML_TRUE)
  3769. == XML_STATUS_ERROR)
  3770. xml_failure(parser);
  3771. XML_ParserFree(ext_parser);
  3772. return XML_STATUS_OK;
  3773. }
  3774. START_TEST(test_ignore_section_utf16) {
  3775. const char text[] =
  3776. /* <!DOCTYPE d SYSTEM 's'> */
  3777. "<\0!\0D\0O\0C\0T\0Y\0P\0E\0 \0d\0 "
  3778. "\0S\0Y\0S\0T\0E\0M\0 \0'\0s\0'\0>\0\n\0"
  3779. /* <d><e>&en;</e></d> */
  3780. "<\0d\0>\0<\0e\0>\0&\0e\0n\0;\0<\0/\0e\0>\0<\0/\0d\0>\0";
  3781. const XML_Char *expected = XCS("<![IGNORE[<!ELEMENT e (#PCDATA)*>]]>\n&en;");
  3782. CharData storage;
  3783. CharData_Init(&storage);
  3784. XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
  3785. XML_SetUserData(g_parser, &storage);
  3786. XML_SetExternalEntityRefHandler(g_parser, external_entity_load_ignore_utf16);
  3787. XML_SetDefaultHandler(g_parser, accumulate_characters);
  3788. XML_SetStartDoctypeDeclHandler(g_parser, dummy_start_doctype_handler);
  3789. XML_SetEndDoctypeDeclHandler(g_parser, dummy_end_doctype_handler);
  3790. XML_SetElementDeclHandler(g_parser, dummy_element_decl_handler);
  3791. XML_SetStartElementHandler(g_parser, dummy_start_element);
  3792. XML_SetEndElementHandler(g_parser, dummy_end_element);
  3793. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)sizeof(text) - 1, XML_TRUE)
  3794. == XML_STATUS_ERROR)
  3795. xml_failure(g_parser);
  3796. CharData_CheckXMLChars(&storage, expected);
  3797. }
  3798. END_TEST
  3799. static int XMLCALL
  3800. external_entity_load_ignore_utf16_be(XML_Parser parser, const XML_Char *context,
  3801. const XML_Char *base,
  3802. const XML_Char *systemId,
  3803. const XML_Char *publicId) {
  3804. const char text[] =
  3805. /* <![IGNORE[<!ELEMENT e (#PCDATA)*>]]> */
  3806. "\0<\0!\0[\0I\0G\0N\0O\0R\0E\0["
  3807. "\0<\0!\0E\0L\0E\0M\0E\0N\0T\0 \0e\0 "
  3808. "\0(\0#\0P\0C\0D\0A\0T\0A\0)\0*\0>\0]\0]\0>";
  3809. XML_Parser ext_parser;
  3810. UNUSED_P(base);
  3811. UNUSED_P(systemId);
  3812. UNUSED_P(publicId);
  3813. ext_parser = XML_ExternalEntityParserCreate(parser, context, NULL);
  3814. if (ext_parser == NULL)
  3815. fail("Could not create external entity parser");
  3816. if (_XML_Parse_SINGLE_BYTES(ext_parser, text, (int)sizeof(text) - 1, XML_TRUE)
  3817. == XML_STATUS_ERROR)
  3818. xml_failure(parser);
  3819. XML_ParserFree(ext_parser);
  3820. return XML_STATUS_OK;
  3821. }
  3822. START_TEST(test_ignore_section_utf16_be) {
  3823. const char text[] =
  3824. /* <!DOCTYPE d SYSTEM 's'> */
  3825. "\0<\0!\0D\0O\0C\0T\0Y\0P\0E\0 \0d\0 "
  3826. "\0S\0Y\0S\0T\0E\0M\0 \0'\0s\0'\0>\0\n"
  3827. /* <d><e>&en;</e></d> */
  3828. "\0<\0d\0>\0<\0e\0>\0&\0e\0n\0;\0<\0/\0e\0>\0<\0/\0d\0>";
  3829. const XML_Char *expected = XCS("<![IGNORE[<!ELEMENT e (#PCDATA)*>]]>\n&en;");
  3830. CharData storage;
  3831. CharData_Init(&storage);
  3832. XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
  3833. XML_SetUserData(g_parser, &storage);
  3834. XML_SetExternalEntityRefHandler(g_parser,
  3835. external_entity_load_ignore_utf16_be);
  3836. XML_SetDefaultHandler(g_parser, accumulate_characters);
  3837. XML_SetStartDoctypeDeclHandler(g_parser, dummy_start_doctype_handler);
  3838. XML_SetEndDoctypeDeclHandler(g_parser, dummy_end_doctype_handler);
  3839. XML_SetElementDeclHandler(g_parser, dummy_element_decl_handler);
  3840. XML_SetStartElementHandler(g_parser, dummy_start_element);
  3841. XML_SetEndElementHandler(g_parser, dummy_end_element);
  3842. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)sizeof(text) - 1, XML_TRUE)
  3843. == XML_STATUS_ERROR)
  3844. xml_failure(g_parser);
  3845. CharData_CheckXMLChars(&storage, expected);
  3846. }
  3847. END_TEST
  3848. /* Test mis-formatted conditional exclusion */
  3849. START_TEST(test_bad_ignore_section) {
  3850. const char *text = "<!DOCTYPE doc SYSTEM 'foo'>\n"
  3851. "<doc><e>&entity;</e></doc>";
  3852. ExtFaults faults[]
  3853. = {{"<![IGNORE[<!ELEM", "Broken-off declaration not faulted", NULL,
  3854. XML_ERROR_SYNTAX},
  3855. {"<![IGNORE[\x01]]>", "Invalid XML character not faulted", NULL,
  3856. XML_ERROR_INVALID_TOKEN},
  3857. {/* FIrst two bytes of a three-byte char */
  3858. "<![IGNORE[\xe2\x82", "Partial XML character not faulted", NULL,
  3859. XML_ERROR_PARTIAL_CHAR},
  3860. {NULL, NULL, NULL, XML_ERROR_NONE}};
  3861. ExtFaults *fault;
  3862. for (fault = &faults[0]; fault->parse_text != NULL; fault++) {
  3863. XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
  3864. XML_SetExternalEntityRefHandler(g_parser, external_entity_faulter);
  3865. XML_SetUserData(g_parser, fault);
  3866. expect_failure(text, XML_ERROR_EXTERNAL_ENTITY_HANDLING,
  3867. "Incomplete IGNORE section not failed");
  3868. XML_ParserReset(g_parser, NULL);
  3869. }
  3870. }
  3871. END_TEST
  3872. /* Test recursive parsing */
  3873. static int XMLCALL
  3874. external_entity_valuer(XML_Parser parser, const XML_Char *context,
  3875. const XML_Char *base, const XML_Char *systemId,
  3876. const XML_Char *publicId) {
  3877. const char *text1 = "<!ELEMENT doc EMPTY>\n"
  3878. "<!ENTITY % e1 SYSTEM '004-2.ent'>\n"
  3879. "<!ENTITY % e2 '%e1;'>\n"
  3880. "%e1;\n";
  3881. XML_Parser ext_parser;
  3882. UNUSED_P(base);
  3883. UNUSED_P(publicId);
  3884. if (systemId == NULL)
  3885. return XML_STATUS_OK;
  3886. ext_parser = XML_ExternalEntityParserCreate(parser, context, NULL);
  3887. if (ext_parser == NULL)
  3888. fail("Could not create external entity parser");
  3889. if (! xcstrcmp(systemId, XCS("004-1.ent"))) {
  3890. if (_XML_Parse_SINGLE_BYTES(ext_parser, text1, (int)strlen(text1), XML_TRUE)
  3891. == XML_STATUS_ERROR)
  3892. xml_failure(ext_parser);
  3893. } else if (! xcstrcmp(systemId, XCS("004-2.ent"))) {
  3894. ExtFaults *fault = (ExtFaults *)XML_GetUserData(parser);
  3895. enum XML_Status status;
  3896. enum XML_Error error;
  3897. status = _XML_Parse_SINGLE_BYTES(ext_parser, fault->parse_text,
  3898. (int)strlen(fault->parse_text), XML_TRUE);
  3899. if (fault->error == XML_ERROR_NONE) {
  3900. if (status == XML_STATUS_ERROR)
  3901. xml_failure(ext_parser);
  3902. } else {
  3903. if (status != XML_STATUS_ERROR)
  3904. fail(fault->fail_text);
  3905. error = XML_GetErrorCode(ext_parser);
  3906. if (error != fault->error
  3907. && (fault->error != XML_ERROR_XML_DECL
  3908. || error != XML_ERROR_TEXT_DECL))
  3909. xml_failure(ext_parser);
  3910. }
  3911. }
  3912. XML_ParserFree(ext_parser);
  3913. return XML_STATUS_OK;
  3914. }
  3915. START_TEST(test_external_entity_values) {
  3916. const char *text = "<!DOCTYPE doc SYSTEM '004-1.ent'>\n"
  3917. "<doc></doc>\n";
  3918. ExtFaults data_004_2[] = {
  3919. {"<!ATTLIST doc a1 CDATA 'value'>", NULL, NULL, XML_ERROR_NONE},
  3920. {"<!ATTLIST $doc a1 CDATA 'value'>", "Invalid token not faulted", NULL,
  3921. XML_ERROR_INVALID_TOKEN},
  3922. {"'wombat", "Unterminated string not faulted", NULL,
  3923. XML_ERROR_UNCLOSED_TOKEN},
  3924. {"\xe2\x82", "Partial UTF-8 character not faulted", NULL,
  3925. XML_ERROR_PARTIAL_CHAR},
  3926. {"<?xml version='1.0' encoding='utf-8'?>\n", NULL, NULL, XML_ERROR_NONE},
  3927. {"<?xml?>", "Malformed XML declaration not faulted", NULL,
  3928. XML_ERROR_XML_DECL},
  3929. {/* UTF-8 BOM */
  3930. "\xEF\xBB\xBF<!ATTLIST doc a1 CDATA 'value'>", NULL, NULL,
  3931. XML_ERROR_NONE},
  3932. {"<?xml version='1.0' encoding='utf-8'?>\n$",
  3933. "Invalid token after text declaration not faulted", NULL,
  3934. XML_ERROR_INVALID_TOKEN},
  3935. {"<?xml version='1.0' encoding='utf-8'?>\n'wombat",
  3936. "Unterminated string after text decl not faulted", NULL,
  3937. XML_ERROR_UNCLOSED_TOKEN},
  3938. {"<?xml version='1.0' encoding='utf-8'?>\n\xe2\x82",
  3939. "Partial UTF-8 character after text decl not faulted", NULL,
  3940. XML_ERROR_PARTIAL_CHAR},
  3941. {"%e1;", "Recursive parameter entity not faulted", NULL,
  3942. XML_ERROR_RECURSIVE_ENTITY_REF},
  3943. {NULL, NULL, NULL, XML_ERROR_NONE}};
  3944. int i;
  3945. for (i = 0; data_004_2[i].parse_text != NULL; i++) {
  3946. XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
  3947. XML_SetExternalEntityRefHandler(g_parser, external_entity_valuer);
  3948. XML_SetUserData(g_parser, &data_004_2[i]);
  3949. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  3950. == XML_STATUS_ERROR)
  3951. xml_failure(g_parser);
  3952. XML_ParserReset(g_parser, NULL);
  3953. }
  3954. }
  3955. END_TEST
  3956. /* Test the recursive parse interacts with a not standalone handler */
  3957. static int XMLCALL
  3958. external_entity_not_standalone(XML_Parser parser, const XML_Char *context,
  3959. const XML_Char *base, const XML_Char *systemId,
  3960. const XML_Char *publicId) {
  3961. const char *text1 = "<!ELEMENT doc EMPTY>\n"
  3962. "<!ENTITY % e1 SYSTEM 'bar'>\n"
  3963. "%e1;\n";
  3964. const char *text2 = "<!ATTLIST doc a1 CDATA 'value'>";
  3965. XML_Parser ext_parser;
  3966. UNUSED_P(base);
  3967. UNUSED_P(publicId);
  3968. if (systemId == NULL)
  3969. return XML_STATUS_OK;
  3970. ext_parser = XML_ExternalEntityParserCreate(parser, context, NULL);
  3971. if (ext_parser == NULL)
  3972. fail("Could not create external entity parser");
  3973. if (! xcstrcmp(systemId, XCS("foo"))) {
  3974. XML_SetNotStandaloneHandler(ext_parser, reject_not_standalone_handler);
  3975. if (_XML_Parse_SINGLE_BYTES(ext_parser, text1, (int)strlen(text1), XML_TRUE)
  3976. != XML_STATUS_ERROR)
  3977. fail("Expected not standalone rejection");
  3978. if (XML_GetErrorCode(ext_parser) != XML_ERROR_NOT_STANDALONE)
  3979. xml_failure(ext_parser);
  3980. XML_SetNotStandaloneHandler(ext_parser, NULL);
  3981. XML_ParserFree(ext_parser);
  3982. return XML_STATUS_ERROR;
  3983. } else if (! xcstrcmp(systemId, XCS("bar"))) {
  3984. if (_XML_Parse_SINGLE_BYTES(ext_parser, text2, (int)strlen(text2), XML_TRUE)
  3985. == XML_STATUS_ERROR)
  3986. xml_failure(ext_parser);
  3987. }
  3988. XML_ParserFree(ext_parser);
  3989. return XML_STATUS_OK;
  3990. }
  3991. START_TEST(test_ext_entity_not_standalone) {
  3992. const char *text = "<!DOCTYPE doc SYSTEM 'foo'>\n"
  3993. "<doc></doc>";
  3994. XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
  3995. XML_SetExternalEntityRefHandler(g_parser, external_entity_not_standalone);
  3996. expect_failure(text, XML_ERROR_EXTERNAL_ENTITY_HANDLING,
  3997. "Standalone rejection not caught");
  3998. }
  3999. END_TEST
  4000. static int XMLCALL
  4001. external_entity_value_aborter(XML_Parser parser, const XML_Char *context,
  4002. const XML_Char *base, const XML_Char *systemId,
  4003. const XML_Char *publicId) {
  4004. const char *text1 = "<!ELEMENT doc EMPTY>\n"
  4005. "<!ENTITY % e1 SYSTEM '004-2.ent'>\n"
  4006. "<!ENTITY % e2 '%e1;'>\n"
  4007. "%e1;\n";
  4008. const char *text2 = "<?xml version='1.0' encoding='utf-8'?>";
  4009. XML_Parser ext_parser;
  4010. UNUSED_P(base);
  4011. UNUSED_P(publicId);
  4012. if (systemId == NULL)
  4013. return XML_STATUS_OK;
  4014. ext_parser = XML_ExternalEntityParserCreate(parser, context, NULL);
  4015. if (ext_parser == NULL)
  4016. fail("Could not create external entity parser");
  4017. if (! xcstrcmp(systemId, XCS("004-1.ent"))) {
  4018. if (_XML_Parse_SINGLE_BYTES(ext_parser, text1, (int)strlen(text1), XML_TRUE)
  4019. == XML_STATUS_ERROR)
  4020. xml_failure(ext_parser);
  4021. }
  4022. if (! xcstrcmp(systemId, XCS("004-2.ent"))) {
  4023. XML_SetXmlDeclHandler(ext_parser, entity_suspending_xdecl_handler);
  4024. XML_SetUserData(ext_parser, ext_parser);
  4025. if (_XML_Parse_SINGLE_BYTES(ext_parser, text2, (int)strlen(text2), XML_TRUE)
  4026. != XML_STATUS_ERROR)
  4027. fail("Aborted parse not faulted");
  4028. if (XML_GetErrorCode(ext_parser) != XML_ERROR_ABORTED)
  4029. xml_failure(ext_parser);
  4030. }
  4031. XML_ParserFree(ext_parser);
  4032. return XML_STATUS_OK;
  4033. }
  4034. START_TEST(test_ext_entity_value_abort) {
  4035. const char *text = "<!DOCTYPE doc SYSTEM '004-1.ent'>\n"
  4036. "<doc></doc>\n";
  4037. XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
  4038. XML_SetExternalEntityRefHandler(g_parser, external_entity_value_aborter);
  4039. resumable = XML_FALSE;
  4040. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  4041. == XML_STATUS_ERROR)
  4042. xml_failure(g_parser);
  4043. }
  4044. END_TEST
  4045. START_TEST(test_bad_public_doctype) {
  4046. const char *text = "<?xml version='1.0' encoding='utf-8'?>\n"
  4047. "<!DOCTYPE doc PUBLIC '{BadName}' 'test'>\n"
  4048. "<doc></doc>";
  4049. /* Setting a handler provokes a particular code path */
  4050. XML_SetDoctypeDeclHandler(g_parser, dummy_start_doctype_handler,
  4051. dummy_end_doctype_handler);
  4052. expect_failure(text, XML_ERROR_PUBLICID, "Bad Public ID not failed");
  4053. }
  4054. END_TEST
  4055. /* Test based on ibm/valid/P32/ibm32v04.xml */
  4056. START_TEST(test_attribute_enum_value) {
  4057. const char *text = "<?xml version='1.0' standalone='no'?>\n"
  4058. "<!DOCTYPE animal SYSTEM 'test.dtd'>\n"
  4059. "<animal>This is a \n <a/> \n\nyellow tiger</animal>";
  4060. ExtTest dtd_data
  4061. = {"<!ELEMENT animal (#PCDATA|a)*>\n"
  4062. "<!ELEMENT a EMPTY>\n"
  4063. "<!ATTLIST animal xml:space (default|preserve) 'preserve'>",
  4064. NULL, NULL};
  4065. const XML_Char *expected = XCS("This is a \n \n\nyellow tiger");
  4066. XML_SetExternalEntityRefHandler(g_parser, external_entity_loader);
  4067. XML_SetUserData(g_parser, &dtd_data);
  4068. XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
  4069. /* An attribute list handler provokes a different code path */
  4070. XML_SetAttlistDeclHandler(g_parser, dummy_attlist_decl_handler);
  4071. run_ext_character_check(text, &dtd_data, expected);
  4072. }
  4073. END_TEST
  4074. /* Slightly bizarrely, the library seems to silently ignore entity
  4075. * definitions for predefined entities, even when they are wrong. The
  4076. * language of the XML 1.0 spec is somewhat unhelpful as to what ought
  4077. * to happen, so this is currently treated as acceptable.
  4078. */
  4079. START_TEST(test_predefined_entity_redefinition) {
  4080. const char *text = "<!DOCTYPE doc [\n"
  4081. "<!ENTITY apos 'foo'>\n"
  4082. "]>\n"
  4083. "<doc>&apos;</doc>";
  4084. run_character_check(text, XCS("'"));
  4085. }
  4086. END_TEST
  4087. /* Test that the parser stops processing the DTD after an unresolved
  4088. * parameter entity is encountered.
  4089. */
  4090. START_TEST(test_dtd_stop_processing) {
  4091. const char *text = "<!DOCTYPE doc [\n"
  4092. "%foo;\n"
  4093. "<!ENTITY bar 'bas'>\n"
  4094. "]><doc/>";
  4095. XML_SetEntityDeclHandler(g_parser, dummy_entity_decl_handler);
  4096. dummy_handler_flags = 0;
  4097. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  4098. == XML_STATUS_ERROR)
  4099. xml_failure(g_parser);
  4100. if (dummy_handler_flags != 0)
  4101. fail("DTD processing still going after undefined PE");
  4102. }
  4103. END_TEST
  4104. /* Test public notations with no system ID */
  4105. START_TEST(test_public_notation_no_sysid) {
  4106. const char *text = "<!DOCTYPE doc [\n"
  4107. "<!NOTATION note PUBLIC 'foo'>\n"
  4108. "<!ELEMENT doc EMPTY>\n"
  4109. "]>\n<doc/>";
  4110. dummy_handler_flags = 0;
  4111. XML_SetNotationDeclHandler(g_parser, dummy_notation_decl_handler);
  4112. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  4113. == XML_STATUS_ERROR)
  4114. xml_failure(g_parser);
  4115. if (dummy_handler_flags != DUMMY_NOTATION_DECL_HANDLER_FLAG)
  4116. fail("Notation declaration handler not called");
  4117. }
  4118. END_TEST
  4119. static void XMLCALL
  4120. record_element_start_handler(void *userData, const XML_Char *name,
  4121. const XML_Char **atts) {
  4122. UNUSED_P(atts);
  4123. CharData_AppendXMLChars((CharData *)userData, name, (int)xcstrlen(name));
  4124. }
  4125. START_TEST(test_nested_groups) {
  4126. const char *text
  4127. = "<!DOCTYPE doc [\n"
  4128. "<!ELEMENT doc "
  4129. /* Sixteen elements per line */
  4130. "(e,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,"
  4131. "(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?"
  4132. "))))))))))))))))))))))))))))))))>\n"
  4133. "<!ELEMENT e EMPTY>"
  4134. "]>\n"
  4135. "<doc><e/></doc>";
  4136. CharData storage;
  4137. CharData_Init(&storage);
  4138. XML_SetElementDeclHandler(g_parser, dummy_element_decl_handler);
  4139. XML_SetStartElementHandler(g_parser, record_element_start_handler);
  4140. XML_SetUserData(g_parser, &storage);
  4141. dummy_handler_flags = 0;
  4142. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  4143. == XML_STATUS_ERROR)
  4144. xml_failure(g_parser);
  4145. CharData_CheckXMLChars(&storage, XCS("doce"));
  4146. if (dummy_handler_flags != DUMMY_ELEMENT_DECL_HANDLER_FLAG)
  4147. fail("Element handler not fired");
  4148. }
  4149. END_TEST
  4150. START_TEST(test_group_choice) {
  4151. const char *text = "<!DOCTYPE doc [\n"
  4152. "<!ELEMENT doc (a|b|c)+>\n"
  4153. "<!ELEMENT a EMPTY>\n"
  4154. "<!ELEMENT b (#PCDATA)>\n"
  4155. "<!ELEMENT c ANY>\n"
  4156. "]>\n"
  4157. "<doc>\n"
  4158. "<a/>\n"
  4159. "<b attr='foo'>This is a foo</b>\n"
  4160. "<c></c>\n"
  4161. "</doc>\n";
  4162. XML_SetElementDeclHandler(g_parser, dummy_element_decl_handler);
  4163. dummy_handler_flags = 0;
  4164. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  4165. == XML_STATUS_ERROR)
  4166. xml_failure(g_parser);
  4167. if (dummy_handler_flags != DUMMY_ELEMENT_DECL_HANDLER_FLAG)
  4168. fail("Element handler flag not raised");
  4169. }
  4170. END_TEST
  4171. static int XMLCALL
  4172. external_entity_public(XML_Parser parser, const XML_Char *context,
  4173. const XML_Char *base, const XML_Char *systemId,
  4174. const XML_Char *publicId) {
  4175. const char *text1 = (const char *)XML_GetUserData(parser);
  4176. const char *text2 = "<!ATTLIST doc a CDATA 'value'>";
  4177. const char *text = NULL;
  4178. XML_Parser ext_parser;
  4179. int parse_res;
  4180. UNUSED_P(base);
  4181. ext_parser = XML_ExternalEntityParserCreate(parser, context, NULL);
  4182. if (ext_parser == NULL)
  4183. return XML_STATUS_ERROR;
  4184. if (systemId != NULL && ! xcstrcmp(systemId, XCS("http://example.org/"))) {
  4185. text = text1;
  4186. } else if (publicId != NULL && ! xcstrcmp(publicId, XCS("foo"))) {
  4187. text = text2;
  4188. } else
  4189. fail("Unexpected parameters to external entity parser");
  4190. assert(text != NULL);
  4191. parse_res
  4192. = _XML_Parse_SINGLE_BYTES(ext_parser, text, (int)strlen(text), XML_TRUE);
  4193. XML_ParserFree(ext_parser);
  4194. return parse_res;
  4195. }
  4196. START_TEST(test_standalone_parameter_entity) {
  4197. const char *text = "<?xml version='1.0' standalone='yes'?>\n"
  4198. "<!DOCTYPE doc SYSTEM 'http://example.org/' [\n"
  4199. "<!ENTITY % entity '<!ELEMENT doc (#PCDATA)>'>\n"
  4200. "%entity;\n"
  4201. "]>\n"
  4202. "<doc></doc>";
  4203. char dtd_data[] = "<!ENTITY % e1 'foo'>\n";
  4204. XML_SetUserData(g_parser, dtd_data);
  4205. XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
  4206. XML_SetExternalEntityRefHandler(g_parser, external_entity_public);
  4207. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  4208. == XML_STATUS_ERROR)
  4209. xml_failure(g_parser);
  4210. }
  4211. END_TEST
  4212. /* Test skipping of parameter entity in an external DTD */
  4213. /* Derived from ibm/invalid/P69/ibm69i01.xml */
  4214. START_TEST(test_skipped_parameter_entity) {
  4215. const char *text = "<?xml version='1.0'?>\n"
  4216. "<!DOCTYPE root SYSTEM 'http://example.org/dtd.ent' [\n"
  4217. "<!ELEMENT root (#PCDATA|a)* >\n"
  4218. "]>\n"
  4219. "<root></root>";
  4220. ExtTest dtd_data = {"%pe2;", NULL, NULL};
  4221. XML_SetExternalEntityRefHandler(g_parser, external_entity_loader);
  4222. XML_SetUserData(g_parser, &dtd_data);
  4223. XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
  4224. XML_SetSkippedEntityHandler(g_parser, dummy_skip_handler);
  4225. dummy_handler_flags = 0;
  4226. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  4227. == XML_STATUS_ERROR)
  4228. xml_failure(g_parser);
  4229. if (dummy_handler_flags != DUMMY_SKIP_HANDLER_FLAG)
  4230. fail("Skip handler not executed");
  4231. }
  4232. END_TEST
  4233. /* Test recursive parameter entity definition rejected in external DTD */
  4234. START_TEST(test_recursive_external_parameter_entity) {
  4235. const char *text = "<?xml version='1.0'?>\n"
  4236. "<!DOCTYPE root SYSTEM 'http://example.org/dtd.ent' [\n"
  4237. "<!ELEMENT root (#PCDATA|a)* >\n"
  4238. "]>\n"
  4239. "<root></root>";
  4240. ExtFaults dtd_data = {"<!ENTITY % pe2 '&#37;pe2;'>\n%pe2;",
  4241. "Recursive external parameter entity not faulted", NULL,
  4242. XML_ERROR_RECURSIVE_ENTITY_REF};
  4243. XML_SetExternalEntityRefHandler(g_parser, external_entity_faulter);
  4244. XML_SetUserData(g_parser, &dtd_data);
  4245. XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
  4246. expect_failure(text, XML_ERROR_EXTERNAL_ENTITY_HANDLING,
  4247. "Recursive external parameter not spotted");
  4248. }
  4249. END_TEST
  4250. /* Test undefined parameter entity in external entity handler */
  4251. static int XMLCALL
  4252. external_entity_devaluer(XML_Parser parser, const XML_Char *context,
  4253. const XML_Char *base, const XML_Char *systemId,
  4254. const XML_Char *publicId) {
  4255. const char *text = "<!ELEMENT doc EMPTY>\n"
  4256. "<!ENTITY % e1 SYSTEM 'bar'>\n"
  4257. "%e1;\n";
  4258. XML_Parser ext_parser;
  4259. intptr_t clear_handler = (intptr_t)XML_GetUserData(parser);
  4260. UNUSED_P(base);
  4261. UNUSED_P(publicId);
  4262. if (systemId == NULL || ! xcstrcmp(systemId, XCS("bar")))
  4263. return XML_STATUS_OK;
  4264. if (xcstrcmp(systemId, XCS("foo")))
  4265. fail("Unexpected system ID");
  4266. ext_parser = XML_ExternalEntityParserCreate(parser, context, NULL);
  4267. if (ext_parser == NULL)
  4268. fail("Could note create external entity parser");
  4269. if (clear_handler)
  4270. XML_SetExternalEntityRefHandler(ext_parser, NULL);
  4271. if (_XML_Parse_SINGLE_BYTES(ext_parser, text, (int)strlen(text), XML_TRUE)
  4272. == XML_STATUS_ERROR)
  4273. xml_failure(ext_parser);
  4274. XML_ParserFree(ext_parser);
  4275. return XML_STATUS_OK;
  4276. }
  4277. START_TEST(test_undefined_ext_entity_in_external_dtd) {
  4278. const char *text = "<!DOCTYPE doc SYSTEM 'foo'>\n"
  4279. "<doc></doc>\n";
  4280. XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
  4281. XML_SetExternalEntityRefHandler(g_parser, external_entity_devaluer);
  4282. XML_SetUserData(g_parser, (void *)(intptr_t)XML_FALSE);
  4283. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  4284. == XML_STATUS_ERROR)
  4285. xml_failure(g_parser);
  4286. /* Now repeat without the external entity ref handler invoking
  4287. * another copy of itself.
  4288. */
  4289. XML_ParserReset(g_parser, NULL);
  4290. XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
  4291. XML_SetExternalEntityRefHandler(g_parser, external_entity_devaluer);
  4292. XML_SetUserData(g_parser, (void *)(intptr_t)XML_TRUE);
  4293. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  4294. == XML_STATUS_ERROR)
  4295. xml_failure(g_parser);
  4296. }
  4297. END_TEST
  4298. static void XMLCALL
  4299. aborting_xdecl_handler(void *userData, const XML_Char *version,
  4300. const XML_Char *encoding, int standalone) {
  4301. UNUSED_P(userData);
  4302. UNUSED_P(version);
  4303. UNUSED_P(encoding);
  4304. UNUSED_P(standalone);
  4305. XML_StopParser(g_parser, resumable);
  4306. XML_SetXmlDeclHandler(g_parser, NULL);
  4307. }
  4308. /* Test suspending the parse on receiving an XML declaration works */
  4309. START_TEST(test_suspend_xdecl) {
  4310. const char *text = long_character_data_text;
  4311. XML_SetXmlDeclHandler(g_parser, aborting_xdecl_handler);
  4312. resumable = XML_TRUE;
  4313. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  4314. != XML_STATUS_SUSPENDED)
  4315. xml_failure(g_parser);
  4316. if (XML_GetErrorCode(g_parser) != XML_ERROR_NONE)
  4317. xml_failure(g_parser);
  4318. /* Attempt to start a new parse while suspended */
  4319. if (XML_Parse(g_parser, text, (int)strlen(text), XML_TRUE)
  4320. != XML_STATUS_ERROR)
  4321. fail("Attempt to parse while suspended not faulted");
  4322. if (XML_GetErrorCode(g_parser) != XML_ERROR_SUSPENDED)
  4323. fail("Suspended parse not faulted with correct error");
  4324. }
  4325. END_TEST
  4326. /* Test aborting the parse in an epilog works */
  4327. static void XMLCALL
  4328. selective_aborting_default_handler(void *userData, const XML_Char *s, int len) {
  4329. const XML_Char *match = (const XML_Char *)userData;
  4330. if (match == NULL
  4331. || (xcstrlen(match) == (unsigned)len && ! xcstrncmp(match, s, len))) {
  4332. XML_StopParser(g_parser, resumable);
  4333. XML_SetDefaultHandler(g_parser, NULL);
  4334. }
  4335. }
  4336. START_TEST(test_abort_epilog) {
  4337. const char *text = "<doc></doc>\n\r\n";
  4338. XML_Char match[] = XCS("\r");
  4339. XML_SetDefaultHandler(g_parser, selective_aborting_default_handler);
  4340. XML_SetUserData(g_parser, match);
  4341. resumable = XML_FALSE;
  4342. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  4343. != XML_STATUS_ERROR)
  4344. fail("Abort not triggered");
  4345. if (XML_GetErrorCode(g_parser) != XML_ERROR_ABORTED)
  4346. xml_failure(g_parser);
  4347. }
  4348. END_TEST
  4349. /* Test a different code path for abort in the epilog */
  4350. START_TEST(test_abort_epilog_2) {
  4351. const char *text = "<doc></doc>\n";
  4352. XML_Char match[] = XCS("\n");
  4353. XML_SetDefaultHandler(g_parser, selective_aborting_default_handler);
  4354. XML_SetUserData(g_parser, match);
  4355. resumable = XML_FALSE;
  4356. expect_failure(text, XML_ERROR_ABORTED, "Abort not triggered");
  4357. }
  4358. END_TEST
  4359. /* Test suspension from the epilog */
  4360. START_TEST(test_suspend_epilog) {
  4361. const char *text = "<doc></doc>\n";
  4362. XML_Char match[] = XCS("\n");
  4363. XML_SetDefaultHandler(g_parser, selective_aborting_default_handler);
  4364. XML_SetUserData(g_parser, match);
  4365. resumable = XML_TRUE;
  4366. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  4367. != XML_STATUS_SUSPENDED)
  4368. xml_failure(g_parser);
  4369. }
  4370. END_TEST
  4371. static void XMLCALL
  4372. suspending_end_handler(void *userData, const XML_Char *s) {
  4373. UNUSED_P(s);
  4374. XML_StopParser((XML_Parser)userData, 1);
  4375. }
  4376. START_TEST(test_suspend_in_sole_empty_tag) {
  4377. const char *text = "<doc/>";
  4378. enum XML_Status rc;
  4379. XML_SetEndElementHandler(g_parser, suspending_end_handler);
  4380. XML_SetUserData(g_parser, g_parser);
  4381. rc = _XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE);
  4382. if (rc == XML_STATUS_ERROR)
  4383. xml_failure(g_parser);
  4384. else if (rc != XML_STATUS_SUSPENDED)
  4385. fail("Suspend not triggered");
  4386. rc = XML_ResumeParser(g_parser);
  4387. if (rc == XML_STATUS_ERROR)
  4388. xml_failure(g_parser);
  4389. else if (rc != XML_STATUS_OK)
  4390. fail("Resume failed");
  4391. }
  4392. END_TEST
  4393. START_TEST(test_unfinished_epilog) {
  4394. const char *text = "<doc></doc><";
  4395. expect_failure(text, XML_ERROR_UNCLOSED_TOKEN,
  4396. "Incomplete epilog entry not faulted");
  4397. }
  4398. END_TEST
  4399. START_TEST(test_partial_char_in_epilog) {
  4400. const char *text = "<doc></doc>\xe2\x82";
  4401. /* First check that no fault is raised if the parse is not finished */
  4402. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_FALSE)
  4403. == XML_STATUS_ERROR)
  4404. xml_failure(g_parser);
  4405. /* Now check that it is faulted once we finish */
  4406. if (XML_ParseBuffer(g_parser, 0, XML_TRUE) != XML_STATUS_ERROR)
  4407. fail("Partial character in epilog not faulted");
  4408. if (XML_GetErrorCode(g_parser) != XML_ERROR_PARTIAL_CHAR)
  4409. xml_failure(g_parser);
  4410. }
  4411. END_TEST
  4412. START_TEST(test_hash_collision) {
  4413. /* For full coverage of the lookup routine, we need to ensure a
  4414. * hash collision even though we can only tell that we have one
  4415. * through breakpoint debugging or coverage statistics. The
  4416. * following will cause a hash collision on machines with a 64-bit
  4417. * long type; others will have to experiment. The full coverage
  4418. * tests invoked from qa.sh usually provide a hash collision, but
  4419. * not always. This is an attempt to provide insurance.
  4420. */
  4421. #define COLLIDING_HASH_SALT (unsigned long)_SIP_ULL(0xffffffffU, 0xff99fc90U)
  4422. const char *text
  4423. = "<doc>\n"
  4424. "<a1/><a2/><a3/><a4/><a5/><a6/><a7/><a8/>\n"
  4425. "<b1></b1><b2 attr='foo'>This is a foo</b2><b3></b3><b4></b4>\n"
  4426. "<b5></b5><b6></b6><b7></b7><b8></b8>\n"
  4427. "<c1/><c2/><c3/><c4/><c5/><c6/><c7/><c8/>\n"
  4428. "<d1/><d2/><d3/><d4/><d5/><d6/><d7/>\n"
  4429. "<d8>This triggers the table growth and collides with b2</d8>\n"
  4430. "</doc>\n";
  4431. XML_SetHashSalt(g_parser, COLLIDING_HASH_SALT);
  4432. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  4433. == XML_STATUS_ERROR)
  4434. xml_failure(g_parser);
  4435. }
  4436. END_TEST
  4437. #undef COLLIDING_HASH_SALT
  4438. /* Test resuming a parse suspended in entity substitution */
  4439. static void XMLCALL
  4440. start_element_suspender(void *userData, const XML_Char *name,
  4441. const XML_Char **atts) {
  4442. UNUSED_P(userData);
  4443. UNUSED_P(atts);
  4444. if (! xcstrcmp(name, XCS("suspend")))
  4445. XML_StopParser(g_parser, XML_TRUE);
  4446. if (! xcstrcmp(name, XCS("abort")))
  4447. XML_StopParser(g_parser, XML_FALSE);
  4448. }
  4449. START_TEST(test_suspend_resume_internal_entity) {
  4450. const char *text
  4451. = "<!DOCTYPE doc [\n"
  4452. "<!ENTITY foo '<suspend>Hi<suspend>Ho</suspend></suspend>'>\n"
  4453. "]>\n"
  4454. "<doc>&foo;</doc>\n";
  4455. const XML_Char *expected1 = XCS("Hi");
  4456. const XML_Char *expected2 = XCS("HiHo");
  4457. CharData storage;
  4458. CharData_Init(&storage);
  4459. XML_SetStartElementHandler(g_parser, start_element_suspender);
  4460. XML_SetCharacterDataHandler(g_parser, accumulate_characters);
  4461. XML_SetUserData(g_parser, &storage);
  4462. if (XML_Parse(g_parser, text, (int)strlen(text), XML_TRUE)
  4463. != XML_STATUS_SUSPENDED)
  4464. xml_failure(g_parser);
  4465. CharData_CheckXMLChars(&storage, XCS(""));
  4466. if (XML_ResumeParser(g_parser) != XML_STATUS_SUSPENDED)
  4467. xml_failure(g_parser);
  4468. CharData_CheckXMLChars(&storage, expected1);
  4469. if (XML_ResumeParser(g_parser) != XML_STATUS_OK)
  4470. xml_failure(g_parser);
  4471. CharData_CheckXMLChars(&storage, expected2);
  4472. }
  4473. END_TEST
  4474. /* Test syntax error is caught at parse resumption */
  4475. START_TEST(test_resume_entity_with_syntax_error) {
  4476. const char *text = "<!DOCTYPE doc [\n"
  4477. "<!ENTITY foo '<suspend>Hi</wombat>'>\n"
  4478. "]>\n"
  4479. "<doc>&foo;</doc>\n";
  4480. XML_SetStartElementHandler(g_parser, start_element_suspender);
  4481. if (XML_Parse(g_parser, text, (int)strlen(text), XML_TRUE)
  4482. != XML_STATUS_SUSPENDED)
  4483. xml_failure(g_parser);
  4484. if (XML_ResumeParser(g_parser) != XML_STATUS_ERROR)
  4485. fail("Syntax error in entity not faulted");
  4486. if (XML_GetErrorCode(g_parser) != XML_ERROR_TAG_MISMATCH)
  4487. xml_failure(g_parser);
  4488. }
  4489. END_TEST
  4490. /* Test suspending and resuming in a parameter entity substitution */
  4491. static void XMLCALL
  4492. element_decl_suspender(void *userData, const XML_Char *name,
  4493. XML_Content *model) {
  4494. UNUSED_P(userData);
  4495. UNUSED_P(name);
  4496. XML_StopParser(g_parser, XML_TRUE);
  4497. XML_FreeContentModel(g_parser, model);
  4498. }
  4499. START_TEST(test_suspend_resume_parameter_entity) {
  4500. const char *text = "<!DOCTYPE doc [\n"
  4501. "<!ENTITY % foo '<!ELEMENT doc (#PCDATA)*>'>\n"
  4502. "%foo;\n"
  4503. "]>\n"
  4504. "<doc>Hello, world</doc>";
  4505. const XML_Char *expected = XCS("Hello, world");
  4506. CharData storage;
  4507. CharData_Init(&storage);
  4508. XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
  4509. XML_SetElementDeclHandler(g_parser, element_decl_suspender);
  4510. XML_SetCharacterDataHandler(g_parser, accumulate_characters);
  4511. XML_SetUserData(g_parser, &storage);
  4512. if (XML_Parse(g_parser, text, (int)strlen(text), XML_TRUE)
  4513. != XML_STATUS_SUSPENDED)
  4514. xml_failure(g_parser);
  4515. CharData_CheckXMLChars(&storage, XCS(""));
  4516. if (XML_ResumeParser(g_parser) != XML_STATUS_OK)
  4517. xml_failure(g_parser);
  4518. CharData_CheckXMLChars(&storage, expected);
  4519. }
  4520. END_TEST
  4521. /* Test attempting to use parser after an error is faulted */
  4522. START_TEST(test_restart_on_error) {
  4523. const char *text = "<$doc><doc></doc>";
  4524. if (XML_Parse(g_parser, text, (int)strlen(text), XML_TRUE)
  4525. != XML_STATUS_ERROR)
  4526. fail("Invalid tag name not faulted");
  4527. if (XML_GetErrorCode(g_parser) != XML_ERROR_INVALID_TOKEN)
  4528. xml_failure(g_parser);
  4529. if (XML_Parse(g_parser, NULL, 0, XML_TRUE) != XML_STATUS_ERROR)
  4530. fail("Restarting invalid parse not faulted");
  4531. if (XML_GetErrorCode(g_parser) != XML_ERROR_INVALID_TOKEN)
  4532. xml_failure(g_parser);
  4533. }
  4534. END_TEST
  4535. /* Test that angle brackets in an attribute default value are faulted */
  4536. START_TEST(test_reject_lt_in_attribute_value) {
  4537. const char *text = "<!DOCTYPE doc [<!ATTLIST doc a CDATA '<bar>'>]>\n"
  4538. "<doc></doc>";
  4539. expect_failure(text, XML_ERROR_INVALID_TOKEN,
  4540. "Bad attribute default not faulted");
  4541. }
  4542. END_TEST
  4543. START_TEST(test_reject_unfinished_param_in_att_value) {
  4544. const char *text = "<!DOCTYPE doc [<!ATTLIST doc a CDATA '&foo'>]>\n"
  4545. "<doc></doc>";
  4546. expect_failure(text, XML_ERROR_INVALID_TOKEN,
  4547. "Bad attribute default not faulted");
  4548. }
  4549. END_TEST
  4550. START_TEST(test_trailing_cr_in_att_value) {
  4551. const char *text = "<doc a='value\r'/>";
  4552. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  4553. == XML_STATUS_ERROR)
  4554. xml_failure(g_parser);
  4555. }
  4556. END_TEST
  4557. /* Try parsing a general entity within a parameter entity in a
  4558. * standalone internal DTD. Covers a corner case in the parser.
  4559. */
  4560. START_TEST(test_standalone_internal_entity) {
  4561. const char *text = "<?xml version='1.0' standalone='yes' ?>\n"
  4562. "<!DOCTYPE doc [\n"
  4563. " <!ELEMENT doc (#PCDATA)>\n"
  4564. " <!ENTITY % pe '<!ATTLIST doc att2 CDATA \"&ge;\">'>\n"
  4565. " <!ENTITY ge 'AttDefaultValue'>\n"
  4566. " %pe;\n"
  4567. "]>\n"
  4568. "<doc att2='any'/>";
  4569. XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
  4570. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  4571. == XML_STATUS_ERROR)
  4572. xml_failure(g_parser);
  4573. }
  4574. END_TEST
  4575. /* Test that a reference to an unknown external entity is skipped */
  4576. START_TEST(test_skipped_external_entity) {
  4577. const char *text = "<!DOCTYPE doc SYSTEM 'http://example.org/'>\n"
  4578. "<doc></doc>\n";
  4579. ExtTest test_data = {"<!ELEMENT doc EMPTY>\n"
  4580. "<!ENTITY % e2 '%e1;'>\n",
  4581. NULL, NULL};
  4582. XML_SetUserData(g_parser, &test_data);
  4583. XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
  4584. XML_SetExternalEntityRefHandler(g_parser, external_entity_loader);
  4585. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  4586. == XML_STATUS_ERROR)
  4587. xml_failure(g_parser);
  4588. }
  4589. END_TEST
  4590. /* Test a different form of unknown external entity */
  4591. typedef struct ext_hdlr_data {
  4592. const char *parse_text;
  4593. XML_ExternalEntityRefHandler handler;
  4594. } ExtHdlrData;
  4595. static int XMLCALL
  4596. external_entity_oneshot_loader(XML_Parser parser, const XML_Char *context,
  4597. const XML_Char *base, const XML_Char *systemId,
  4598. const XML_Char *publicId) {
  4599. ExtHdlrData *test_data = (ExtHdlrData *)XML_GetUserData(parser);
  4600. XML_Parser ext_parser;
  4601. UNUSED_P(base);
  4602. UNUSED_P(systemId);
  4603. UNUSED_P(publicId);
  4604. ext_parser = XML_ExternalEntityParserCreate(parser, context, NULL);
  4605. if (ext_parser == NULL)
  4606. fail("Could not create external entity parser.");
  4607. /* Use the requested entity parser for further externals */
  4608. XML_SetExternalEntityRefHandler(ext_parser, test_data->handler);
  4609. if (_XML_Parse_SINGLE_BYTES(ext_parser, test_data->parse_text,
  4610. (int)strlen(test_data->parse_text), XML_TRUE)
  4611. == XML_STATUS_ERROR) {
  4612. xml_failure(ext_parser);
  4613. }
  4614. XML_ParserFree(ext_parser);
  4615. return XML_STATUS_OK;
  4616. }
  4617. START_TEST(test_skipped_null_loaded_ext_entity) {
  4618. const char *text = "<!DOCTYPE doc SYSTEM 'http://example.org/one.ent'>\n"
  4619. "<doc />";
  4620. ExtHdlrData test_data
  4621. = {"<!ENTITY % pe1 SYSTEM 'http://example.org/two.ent'>\n"
  4622. "<!ENTITY % pe2 '%pe1;'>\n"
  4623. "%pe2;\n",
  4624. external_entity_null_loader};
  4625. XML_SetUserData(g_parser, &test_data);
  4626. XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
  4627. XML_SetExternalEntityRefHandler(g_parser, external_entity_oneshot_loader);
  4628. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  4629. == XML_STATUS_ERROR)
  4630. xml_failure(g_parser);
  4631. }
  4632. END_TEST
  4633. START_TEST(test_skipped_unloaded_ext_entity) {
  4634. const char *text = "<!DOCTYPE doc SYSTEM 'http://example.org/one.ent'>\n"
  4635. "<doc />";
  4636. ExtHdlrData test_data
  4637. = {"<!ENTITY % pe1 SYSTEM 'http://example.org/two.ent'>\n"
  4638. "<!ENTITY % pe2 '%pe1;'>\n"
  4639. "%pe2;\n",
  4640. NULL};
  4641. XML_SetUserData(g_parser, &test_data);
  4642. XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
  4643. XML_SetExternalEntityRefHandler(g_parser, external_entity_oneshot_loader);
  4644. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  4645. == XML_STATUS_ERROR)
  4646. xml_failure(g_parser);
  4647. }
  4648. END_TEST
  4649. /* Test that a parameter entity value ending with a carriage return
  4650. * has it translated internally into a newline.
  4651. */
  4652. START_TEST(test_param_entity_with_trailing_cr) {
  4653. #define PARAM_ENTITY_NAME "pe"
  4654. #define PARAM_ENTITY_CORE_VALUE "<!ATTLIST doc att CDATA \"default\">"
  4655. const char *text = "<!DOCTYPE doc SYSTEM 'http://example.org/'>\n"
  4656. "<doc/>";
  4657. ExtTest test_data
  4658. = {"<!ENTITY % " PARAM_ENTITY_NAME " '" PARAM_ENTITY_CORE_VALUE "\r'>\n"
  4659. "%" PARAM_ENTITY_NAME ";\n",
  4660. NULL, NULL};
  4661. XML_SetUserData(g_parser, &test_data);
  4662. XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
  4663. XML_SetExternalEntityRefHandler(g_parser, external_entity_loader);
  4664. XML_SetEntityDeclHandler(g_parser, param_entity_match_handler);
  4665. entity_name_to_match = XCS(PARAM_ENTITY_NAME);
  4666. entity_value_to_match = XCS(PARAM_ENTITY_CORE_VALUE) XCS("\n");
  4667. entity_match_flag = ENTITY_MATCH_NOT_FOUND;
  4668. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  4669. == XML_STATUS_ERROR)
  4670. xml_failure(g_parser);
  4671. if (entity_match_flag == ENTITY_MATCH_FAIL)
  4672. fail("Parameter entity CR->NEWLINE conversion failed");
  4673. else if (entity_match_flag == ENTITY_MATCH_NOT_FOUND)
  4674. fail("Parameter entity not parsed");
  4675. }
  4676. #undef PARAM_ENTITY_NAME
  4677. #undef PARAM_ENTITY_CORE_VALUE
  4678. END_TEST
  4679. START_TEST(test_invalid_character_entity) {
  4680. const char *text = "<!DOCTYPE doc [\n"
  4681. " <!ENTITY entity '&#x110000;'>\n"
  4682. "]>\n"
  4683. "<doc>&entity;</doc>";
  4684. expect_failure(text, XML_ERROR_BAD_CHAR_REF,
  4685. "Out of range character reference not faulted");
  4686. }
  4687. END_TEST
  4688. START_TEST(test_invalid_character_entity_2) {
  4689. const char *text = "<!DOCTYPE doc [\n"
  4690. " <!ENTITY entity '&#xg0;'>\n"
  4691. "]>\n"
  4692. "<doc>&entity;</doc>";
  4693. expect_failure(text, XML_ERROR_INVALID_TOKEN,
  4694. "Out of range character reference not faulted");
  4695. }
  4696. END_TEST
  4697. START_TEST(test_invalid_character_entity_3) {
  4698. const char text[] =
  4699. /* <!DOCTYPE doc [\n */
  4700. "\0<\0!\0D\0O\0C\0T\0Y\0P\0E\0 \0d\0o\0c\0 \0[\0\n"
  4701. /* U+0E04 = KHO KHWAI
  4702. * U+0E08 = CHO CHAN */
  4703. /* <!ENTITY entity '&\u0e04\u0e08;'>\n */
  4704. "\0<\0!\0E\0N\0T\0I\0T\0Y\0 \0e\0n\0t\0i\0t\0y\0 "
  4705. "\0'\0&\x0e\x04\x0e\x08\0;\0'\0>\0\n"
  4706. /* ]>\n */
  4707. "\0]\0>\0\n"
  4708. /* <doc>&entity;</doc> */
  4709. "\0<\0d\0o\0c\0>\0&\0e\0n\0t\0i\0t\0y\0;\0<\0/\0d\0o\0c\0>";
  4710. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)sizeof(text) - 1, XML_TRUE)
  4711. != XML_STATUS_ERROR)
  4712. fail("Invalid start of entity name not faulted");
  4713. if (XML_GetErrorCode(g_parser) != XML_ERROR_UNDEFINED_ENTITY)
  4714. xml_failure(g_parser);
  4715. }
  4716. END_TEST
  4717. START_TEST(test_invalid_character_entity_4) {
  4718. const char *text = "<!DOCTYPE doc [\n"
  4719. " <!ENTITY entity '&#1114112;'>\n" /* = &#x110000 */
  4720. "]>\n"
  4721. "<doc>&entity;</doc>";
  4722. expect_failure(text, XML_ERROR_BAD_CHAR_REF,
  4723. "Out of range character reference not faulted");
  4724. }
  4725. END_TEST
  4726. /* Test that processing instructions are picked up by a default handler */
  4727. START_TEST(test_pi_handled_in_default) {
  4728. const char *text = "<?test processing instruction?>\n<doc/>";
  4729. const XML_Char *expected = XCS("<?test processing instruction?>\n<doc/>");
  4730. CharData storage;
  4731. CharData_Init(&storage);
  4732. XML_SetDefaultHandler(g_parser, accumulate_characters);
  4733. XML_SetUserData(g_parser, &storage);
  4734. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  4735. == XML_STATUS_ERROR)
  4736. xml_failure(g_parser);
  4737. CharData_CheckXMLChars(&storage, expected);
  4738. }
  4739. END_TEST
  4740. /* Test that comments are picked up by a default handler */
  4741. START_TEST(test_comment_handled_in_default) {
  4742. const char *text = "<!-- This is a comment -->\n<doc/>";
  4743. const XML_Char *expected = XCS("<!-- This is a comment -->\n<doc/>");
  4744. CharData storage;
  4745. CharData_Init(&storage);
  4746. XML_SetDefaultHandler(g_parser, accumulate_characters);
  4747. XML_SetUserData(g_parser, &storage);
  4748. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  4749. == XML_STATUS_ERROR)
  4750. xml_failure(g_parser);
  4751. CharData_CheckXMLChars(&storage, expected);
  4752. }
  4753. END_TEST
  4754. /* Test PIs that look almost but not quite like XML declarations */
  4755. static void XMLCALL
  4756. accumulate_pi_characters(void *userData, const XML_Char *target,
  4757. const XML_Char *data) {
  4758. CharData *storage = (CharData *)userData;
  4759. CharData_AppendXMLChars(storage, target, -1);
  4760. CharData_AppendXMLChars(storage, XCS(": "), 2);
  4761. CharData_AppendXMLChars(storage, data, -1);
  4762. CharData_AppendXMLChars(storage, XCS("\n"), 1);
  4763. }
  4764. START_TEST(test_pi_yml) {
  4765. const char *text = "<?yml something like data?><doc/>";
  4766. const XML_Char *expected = XCS("yml: something like data\n");
  4767. CharData storage;
  4768. CharData_Init(&storage);
  4769. XML_SetProcessingInstructionHandler(g_parser, accumulate_pi_characters);
  4770. XML_SetUserData(g_parser, &storage);
  4771. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  4772. == XML_STATUS_ERROR)
  4773. xml_failure(g_parser);
  4774. CharData_CheckXMLChars(&storage, expected);
  4775. }
  4776. END_TEST
  4777. START_TEST(test_pi_xnl) {
  4778. const char *text = "<?xnl nothing like data?><doc/>";
  4779. const XML_Char *expected = XCS("xnl: nothing like data\n");
  4780. CharData storage;
  4781. CharData_Init(&storage);
  4782. XML_SetProcessingInstructionHandler(g_parser, accumulate_pi_characters);
  4783. XML_SetUserData(g_parser, &storage);
  4784. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  4785. == XML_STATUS_ERROR)
  4786. xml_failure(g_parser);
  4787. CharData_CheckXMLChars(&storage, expected);
  4788. }
  4789. END_TEST
  4790. START_TEST(test_pi_xmm) {
  4791. const char *text = "<?xmm everything like data?><doc/>";
  4792. const XML_Char *expected = XCS("xmm: everything like data\n");
  4793. CharData storage;
  4794. CharData_Init(&storage);
  4795. XML_SetProcessingInstructionHandler(g_parser, accumulate_pi_characters);
  4796. XML_SetUserData(g_parser, &storage);
  4797. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  4798. == XML_STATUS_ERROR)
  4799. xml_failure(g_parser);
  4800. CharData_CheckXMLChars(&storage, expected);
  4801. }
  4802. END_TEST
  4803. START_TEST(test_utf16_pi) {
  4804. const char text[] =
  4805. /* <?{KHO KHWAI}{CHO CHAN}?>
  4806. * where {KHO KHWAI} = U+0E04
  4807. * and {CHO CHAN} = U+0E08
  4808. */
  4809. "<\0?\0\x04\x0e\x08\x0e?\0>\0"
  4810. /* <q/> */
  4811. "<\0q\0/\0>\0";
  4812. #ifdef XML_UNICODE
  4813. const XML_Char *expected = XCS("\x0e04\x0e08: \n");
  4814. #else
  4815. const XML_Char *expected = XCS("\xe0\xb8\x84\xe0\xb8\x88: \n");
  4816. #endif
  4817. CharData storage;
  4818. CharData_Init(&storage);
  4819. XML_SetProcessingInstructionHandler(g_parser, accumulate_pi_characters);
  4820. XML_SetUserData(g_parser, &storage);
  4821. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)sizeof(text) - 1, XML_TRUE)
  4822. == XML_STATUS_ERROR)
  4823. xml_failure(g_parser);
  4824. CharData_CheckXMLChars(&storage, expected);
  4825. }
  4826. END_TEST
  4827. START_TEST(test_utf16_be_pi) {
  4828. const char text[] =
  4829. /* <?{KHO KHWAI}{CHO CHAN}?>
  4830. * where {KHO KHWAI} = U+0E04
  4831. * and {CHO CHAN} = U+0E08
  4832. */
  4833. "\0<\0?\x0e\x04\x0e\x08\0?\0>"
  4834. /* <q/> */
  4835. "\0<\0q\0/\0>";
  4836. #ifdef XML_UNICODE
  4837. const XML_Char *expected = XCS("\x0e04\x0e08: \n");
  4838. #else
  4839. const XML_Char *expected = XCS("\xe0\xb8\x84\xe0\xb8\x88: \n");
  4840. #endif
  4841. CharData storage;
  4842. CharData_Init(&storage);
  4843. XML_SetProcessingInstructionHandler(g_parser, accumulate_pi_characters);
  4844. XML_SetUserData(g_parser, &storage);
  4845. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)sizeof(text) - 1, XML_TRUE)
  4846. == XML_STATUS_ERROR)
  4847. xml_failure(g_parser);
  4848. CharData_CheckXMLChars(&storage, expected);
  4849. }
  4850. END_TEST
  4851. /* Test that comments can be picked up and translated */
  4852. static void XMLCALL
  4853. accumulate_comment(void *userData, const XML_Char *data) {
  4854. CharData *storage = (CharData *)userData;
  4855. CharData_AppendXMLChars(storage, data, -1);
  4856. }
  4857. START_TEST(test_utf16_be_comment) {
  4858. const char text[] =
  4859. /* <!-- Comment A --> */
  4860. "\0<\0!\0-\0-\0 \0C\0o\0m\0m\0e\0n\0t\0 \0A\0 \0-\0-\0>\0\n"
  4861. /* <doc/> */
  4862. "\0<\0d\0o\0c\0/\0>";
  4863. const XML_Char *expected = XCS(" Comment A ");
  4864. CharData storage;
  4865. CharData_Init(&storage);
  4866. XML_SetCommentHandler(g_parser, accumulate_comment);
  4867. XML_SetUserData(g_parser, &storage);
  4868. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)sizeof(text) - 1, XML_TRUE)
  4869. == XML_STATUS_ERROR)
  4870. xml_failure(g_parser);
  4871. CharData_CheckXMLChars(&storage, expected);
  4872. }
  4873. END_TEST
  4874. START_TEST(test_utf16_le_comment) {
  4875. const char text[] =
  4876. /* <!-- Comment B --> */
  4877. "<\0!\0-\0-\0 \0C\0o\0m\0m\0e\0n\0t\0 \0B\0 \0-\0-\0>\0\n\0"
  4878. /* <doc/> */
  4879. "<\0d\0o\0c\0/\0>\0";
  4880. const XML_Char *expected = XCS(" Comment B ");
  4881. CharData storage;
  4882. CharData_Init(&storage);
  4883. XML_SetCommentHandler(g_parser, accumulate_comment);
  4884. XML_SetUserData(g_parser, &storage);
  4885. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)sizeof(text) - 1, XML_TRUE)
  4886. == XML_STATUS_ERROR)
  4887. xml_failure(g_parser);
  4888. CharData_CheckXMLChars(&storage, expected);
  4889. }
  4890. END_TEST
  4891. /* Test that the unknown encoding handler with map entries that expect
  4892. * conversion but no conversion function is faulted
  4893. */
  4894. static int XMLCALL
  4895. failing_converter(void *data, const char *s) {
  4896. UNUSED_P(data);
  4897. UNUSED_P(s);
  4898. /* Always claim to have failed */
  4899. return -1;
  4900. }
  4901. static int XMLCALL
  4902. prefix_converter(void *data, const char *s) {
  4903. UNUSED_P(data);
  4904. /* If the first byte is 0xff, raise an error */
  4905. if (s[0] == (char)-1)
  4906. return -1;
  4907. /* Just add the low bits of the first byte to the second */
  4908. return (s[1] + (s[0] & 0x7f)) & 0x01ff;
  4909. }
  4910. static int XMLCALL
  4911. MiscEncodingHandler(void *data, const XML_Char *encoding, XML_Encoding *info) {
  4912. int i;
  4913. int high_map = -2; /* Assume a 2-byte sequence */
  4914. if (! xcstrcmp(encoding, XCS("invalid-9"))
  4915. || ! xcstrcmp(encoding, XCS("ascii-like"))
  4916. || ! xcstrcmp(encoding, XCS("invalid-len"))
  4917. || ! xcstrcmp(encoding, XCS("invalid-a"))
  4918. || ! xcstrcmp(encoding, XCS("invalid-surrogate"))
  4919. || ! xcstrcmp(encoding, XCS("invalid-high")))
  4920. high_map = -1;
  4921. for (i = 0; i < 128; ++i)
  4922. info->map[i] = i;
  4923. for (; i < 256; ++i)
  4924. info->map[i] = high_map;
  4925. /* If required, put an invalid value in the ASCII entries */
  4926. if (! xcstrcmp(encoding, XCS("invalid-9")))
  4927. info->map[9] = 5;
  4928. /* If required, have a top-bit set character starts a 5-byte sequence */
  4929. if (! xcstrcmp(encoding, XCS("invalid-len")))
  4930. info->map[0x81] = -5;
  4931. /* If required, make a top-bit set character a valid ASCII character */
  4932. if (! xcstrcmp(encoding, XCS("invalid-a")))
  4933. info->map[0x82] = 'a';
  4934. /* If required, give a top-bit set character a forbidden value,
  4935. * what would otherwise be the first of a surrogate pair.
  4936. */
  4937. if (! xcstrcmp(encoding, XCS("invalid-surrogate")))
  4938. info->map[0x83] = 0xd801;
  4939. /* If required, give a top-bit set character too high a value */
  4940. if (! xcstrcmp(encoding, XCS("invalid-high")))
  4941. info->map[0x84] = 0x010101;
  4942. info->data = data;
  4943. info->release = NULL;
  4944. if (! xcstrcmp(encoding, XCS("failing-conv")))
  4945. info->convert = failing_converter;
  4946. else if (! xcstrcmp(encoding, XCS("prefix-conv")))
  4947. info->convert = prefix_converter;
  4948. else
  4949. info->convert = NULL;
  4950. return XML_STATUS_OK;
  4951. }
  4952. START_TEST(test_missing_encoding_conversion_fn) {
  4953. const char *text = "<?xml version='1.0' encoding='no-conv'?>\n"
  4954. "<doc>\x81</doc>";
  4955. XML_SetUnknownEncodingHandler(g_parser, MiscEncodingHandler, NULL);
  4956. /* MiscEncodingHandler sets up an encoding with every top-bit-set
  4957. * character introducing a two-byte sequence. For this, it
  4958. * requires a convert function. The above function call doesn't
  4959. * pass one through, so when BadEncodingHandler actually gets
  4960. * called it should supply an invalid encoding.
  4961. */
  4962. expect_failure(text, XML_ERROR_UNKNOWN_ENCODING,
  4963. "Encoding with missing convert() not faulted");
  4964. }
  4965. END_TEST
  4966. START_TEST(test_failing_encoding_conversion_fn) {
  4967. const char *text = "<?xml version='1.0' encoding='failing-conv'?>\n"
  4968. "<doc>\x81</doc>";
  4969. XML_SetUnknownEncodingHandler(g_parser, MiscEncodingHandler, NULL);
  4970. /* BadEncodingHandler sets up an encoding with every top-bit-set
  4971. * character introducing a two-byte sequence. For this, it
  4972. * requires a convert function. The above function call passes
  4973. * one that insists all possible sequences are invalid anyway.
  4974. */
  4975. expect_failure(text, XML_ERROR_INVALID_TOKEN,
  4976. "Encoding with failing convert() not faulted");
  4977. }
  4978. END_TEST
  4979. /* Test unknown encoding conversions */
  4980. START_TEST(test_unknown_encoding_success) {
  4981. const char *text = "<?xml version='1.0' encoding='prefix-conv'?>\n"
  4982. /* Equivalent to <eoc>Hello, world</eoc> */
  4983. "<\x81\x64\x80oc>Hello, world</\x81\x64\x80oc>";
  4984. XML_SetUnknownEncodingHandler(g_parser, MiscEncodingHandler, NULL);
  4985. run_character_check(text, XCS("Hello, world"));
  4986. }
  4987. END_TEST
  4988. /* Test bad name character in unknown encoding */
  4989. START_TEST(test_unknown_encoding_bad_name) {
  4990. const char *text = "<?xml version='1.0' encoding='prefix-conv'?>\n"
  4991. "<\xff\x64oc>Hello, world</\xff\x64oc>";
  4992. XML_SetUnknownEncodingHandler(g_parser, MiscEncodingHandler, NULL);
  4993. expect_failure(text, XML_ERROR_INVALID_TOKEN,
  4994. "Bad name start in unknown encoding not faulted");
  4995. }
  4996. END_TEST
  4997. /* Test bad mid-name character in unknown encoding */
  4998. START_TEST(test_unknown_encoding_bad_name_2) {
  4999. const char *text = "<?xml version='1.0' encoding='prefix-conv'?>\n"
  5000. "<d\xffoc>Hello, world</d\xffoc>";
  5001. XML_SetUnknownEncodingHandler(g_parser, MiscEncodingHandler, NULL);
  5002. expect_failure(text, XML_ERROR_INVALID_TOKEN,
  5003. "Bad name in unknown encoding not faulted");
  5004. }
  5005. END_TEST
  5006. /* Test element name that is long enough to fill the conversion buffer
  5007. * in an unknown encoding, finishing with an encoded character.
  5008. */
  5009. START_TEST(test_unknown_encoding_long_name_1) {
  5010. const char *text = "<?xml version='1.0' encoding='prefix-conv'?>\n"
  5011. "<abcdefghabcdefghabcdefghijkl\x80m\x80n\x80o\x80p>"
  5012. "Hi"
  5013. "</abcdefghabcdefghabcdefghijkl\x80m\x80n\x80o\x80p>";
  5014. const XML_Char *expected = XCS("abcdefghabcdefghabcdefghijklmnop");
  5015. CharData storage;
  5016. CharData_Init(&storage);
  5017. XML_SetUnknownEncodingHandler(g_parser, MiscEncodingHandler, NULL);
  5018. XML_SetStartElementHandler(g_parser, record_element_start_handler);
  5019. XML_SetUserData(g_parser, &storage);
  5020. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  5021. == XML_STATUS_ERROR)
  5022. xml_failure(g_parser);
  5023. CharData_CheckXMLChars(&storage, expected);
  5024. }
  5025. END_TEST
  5026. /* Test element name that is long enough to fill the conversion buffer
  5027. * in an unknown encoding, finishing with an simple character.
  5028. */
  5029. START_TEST(test_unknown_encoding_long_name_2) {
  5030. const char *text = "<?xml version='1.0' encoding='prefix-conv'?>\n"
  5031. "<abcdefghabcdefghabcdefghijklmnop>"
  5032. "Hi"
  5033. "</abcdefghabcdefghabcdefghijklmnop>";
  5034. const XML_Char *expected = XCS("abcdefghabcdefghabcdefghijklmnop");
  5035. CharData storage;
  5036. CharData_Init(&storage);
  5037. XML_SetUnknownEncodingHandler(g_parser, MiscEncodingHandler, NULL);
  5038. XML_SetStartElementHandler(g_parser, record_element_start_handler);
  5039. XML_SetUserData(g_parser, &storage);
  5040. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  5041. == XML_STATUS_ERROR)
  5042. xml_failure(g_parser);
  5043. CharData_CheckXMLChars(&storage, expected);
  5044. }
  5045. END_TEST
  5046. START_TEST(test_invalid_unknown_encoding) {
  5047. const char *text = "<?xml version='1.0' encoding='invalid-9'?>\n"
  5048. "<doc>Hello world</doc>";
  5049. XML_SetUnknownEncodingHandler(g_parser, MiscEncodingHandler, NULL);
  5050. expect_failure(text, XML_ERROR_UNKNOWN_ENCODING,
  5051. "Invalid unknown encoding not faulted");
  5052. }
  5053. END_TEST
  5054. START_TEST(test_unknown_ascii_encoding_ok) {
  5055. const char *text = "<?xml version='1.0' encoding='ascii-like'?>\n"
  5056. "<doc>Hello, world</doc>";
  5057. XML_SetUnknownEncodingHandler(g_parser, MiscEncodingHandler, NULL);
  5058. run_character_check(text, XCS("Hello, world"));
  5059. }
  5060. END_TEST
  5061. START_TEST(test_unknown_ascii_encoding_fail) {
  5062. const char *text = "<?xml version='1.0' encoding='ascii-like'?>\n"
  5063. "<doc>Hello, \x80 world</doc>";
  5064. XML_SetUnknownEncodingHandler(g_parser, MiscEncodingHandler, NULL);
  5065. expect_failure(text, XML_ERROR_INVALID_TOKEN,
  5066. "Invalid character not faulted");
  5067. }
  5068. END_TEST
  5069. START_TEST(test_unknown_encoding_invalid_length) {
  5070. const char *text = "<?xml version='1.0' encoding='invalid-len'?>\n"
  5071. "<doc>Hello, world</doc>";
  5072. XML_SetUnknownEncodingHandler(g_parser, MiscEncodingHandler, NULL);
  5073. expect_failure(text, XML_ERROR_UNKNOWN_ENCODING,
  5074. "Invalid unknown encoding not faulted");
  5075. }
  5076. END_TEST
  5077. START_TEST(test_unknown_encoding_invalid_topbit) {
  5078. const char *text = "<?xml version='1.0' encoding='invalid-a'?>\n"
  5079. "<doc>Hello, world</doc>";
  5080. XML_SetUnknownEncodingHandler(g_parser, MiscEncodingHandler, NULL);
  5081. expect_failure(text, XML_ERROR_UNKNOWN_ENCODING,
  5082. "Invalid unknown encoding not faulted");
  5083. }
  5084. END_TEST
  5085. START_TEST(test_unknown_encoding_invalid_surrogate) {
  5086. const char *text = "<?xml version='1.0' encoding='invalid-surrogate'?>\n"
  5087. "<doc>Hello, \x82 world</doc>";
  5088. XML_SetUnknownEncodingHandler(g_parser, MiscEncodingHandler, NULL);
  5089. expect_failure(text, XML_ERROR_INVALID_TOKEN,
  5090. "Invalid unknown encoding not faulted");
  5091. }
  5092. END_TEST
  5093. START_TEST(test_unknown_encoding_invalid_high) {
  5094. const char *text = "<?xml version='1.0' encoding='invalid-high'?>\n"
  5095. "<doc>Hello, world</doc>";
  5096. XML_SetUnknownEncodingHandler(g_parser, MiscEncodingHandler, NULL);
  5097. expect_failure(text, XML_ERROR_UNKNOWN_ENCODING,
  5098. "Invalid unknown encoding not faulted");
  5099. }
  5100. END_TEST
  5101. START_TEST(test_unknown_encoding_invalid_attr_value) {
  5102. const char *text = "<?xml version='1.0' encoding='prefix-conv'?>\n"
  5103. "<doc attr='\xff\x30'/>";
  5104. XML_SetUnknownEncodingHandler(g_parser, MiscEncodingHandler, NULL);
  5105. expect_failure(text, XML_ERROR_INVALID_TOKEN,
  5106. "Invalid attribute valid not faulted");
  5107. }
  5108. END_TEST
  5109. /* Test an external entity parser set to use latin-1 detects UTF-16
  5110. * BOMs correctly.
  5111. */
  5112. enum ee_parse_flags { EE_PARSE_NONE = 0x00, EE_PARSE_FULL_BUFFER = 0x01 };
  5113. typedef struct ExtTest2 {
  5114. const char *parse_text;
  5115. int parse_len;
  5116. const XML_Char *encoding;
  5117. CharData *storage;
  5118. enum ee_parse_flags flags;
  5119. } ExtTest2;
  5120. static int XMLCALL
  5121. external_entity_loader2(XML_Parser parser, const XML_Char *context,
  5122. const XML_Char *base, const XML_Char *systemId,
  5123. const XML_Char *publicId) {
  5124. ExtTest2 *test_data = (ExtTest2 *)XML_GetUserData(parser);
  5125. XML_Parser extparser;
  5126. UNUSED_P(base);
  5127. UNUSED_P(systemId);
  5128. UNUSED_P(publicId);
  5129. extparser = XML_ExternalEntityParserCreate(parser, context, NULL);
  5130. if (extparser == NULL)
  5131. fail("Coulr not create external entity parser");
  5132. if (test_data->encoding != NULL) {
  5133. if (! XML_SetEncoding(extparser, test_data->encoding))
  5134. fail("XML_SetEncoding() ignored for external entity");
  5135. }
  5136. if (test_data->flags & EE_PARSE_FULL_BUFFER) {
  5137. if (XML_Parse(extparser, test_data->parse_text, test_data->parse_len,
  5138. XML_TRUE)
  5139. == XML_STATUS_ERROR) {
  5140. xml_failure(extparser);
  5141. }
  5142. } else if (_XML_Parse_SINGLE_BYTES(extparser, test_data->parse_text,
  5143. test_data->parse_len, XML_TRUE)
  5144. == XML_STATUS_ERROR) {
  5145. xml_failure(extparser);
  5146. }
  5147. XML_ParserFree(extparser);
  5148. return XML_STATUS_OK;
  5149. }
  5150. /* Test that UTF-16 BOM does not select UTF-16 given explicit encoding */
  5151. static void XMLCALL
  5152. ext2_accumulate_characters(void *userData, const XML_Char *s, int len) {
  5153. ExtTest2 *test_data = (ExtTest2 *)userData;
  5154. accumulate_characters(test_data->storage, s, len);
  5155. }
  5156. START_TEST(test_ext_entity_latin1_utf16le_bom) {
  5157. const char *text = "<!DOCTYPE doc [\n"
  5158. " <!ENTITY en SYSTEM 'http://example.org/dummy.ent'>\n"
  5159. "]>\n"
  5160. "<doc>&en;</doc>";
  5161. ExtTest2 test_data
  5162. = {/* If UTF-16, 0xfeff is the BOM and 0x204c is black left bullet */
  5163. /* If Latin-1, 0xff = Y-diaeresis, 0xfe = lowercase thorn,
  5164. * 0x4c = L and 0x20 is a space
  5165. */
  5166. "\xff\xfe\x4c\x20", 4, XCS("iso-8859-1"), NULL, EE_PARSE_NONE};
  5167. #ifdef XML_UNICODE
  5168. const XML_Char *expected = XCS("\x00ff\x00feL ");
  5169. #else
  5170. /* In UTF-8, y-diaeresis is 0xc3 0xbf, lowercase thorn is 0xc3 0xbe */
  5171. const XML_Char *expected = XCS("\xc3\xbf\xc3\xbeL ");
  5172. #endif
  5173. CharData storage;
  5174. CharData_Init(&storage);
  5175. test_data.storage = &storage;
  5176. XML_SetExternalEntityRefHandler(g_parser, external_entity_loader2);
  5177. XML_SetUserData(g_parser, &test_data);
  5178. XML_SetCharacterDataHandler(g_parser, ext2_accumulate_characters);
  5179. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  5180. == XML_STATUS_ERROR)
  5181. xml_failure(g_parser);
  5182. CharData_CheckXMLChars(&storage, expected);
  5183. }
  5184. END_TEST
  5185. START_TEST(test_ext_entity_latin1_utf16be_bom) {
  5186. const char *text = "<!DOCTYPE doc [\n"
  5187. " <!ENTITY en SYSTEM 'http://example.org/dummy.ent'>\n"
  5188. "]>\n"
  5189. "<doc>&en;</doc>";
  5190. ExtTest2 test_data
  5191. = {/* If UTF-16, 0xfeff is the BOM and 0x204c is black left bullet */
  5192. /* If Latin-1, 0xff = Y-diaeresis, 0xfe = lowercase thorn,
  5193. * 0x4c = L and 0x20 is a space
  5194. */
  5195. "\xfe\xff\x20\x4c", 4, XCS("iso-8859-1"), NULL, EE_PARSE_NONE};
  5196. #ifdef XML_UNICODE
  5197. const XML_Char *expected = XCS("\x00fe\x00ff L");
  5198. #else
  5199. /* In UTF-8, y-diaeresis is 0xc3 0xbf, lowercase thorn is 0xc3 0xbe */
  5200. const XML_Char *expected = XCS("\xc3\xbe\xc3\xbf L");
  5201. #endif
  5202. CharData storage;
  5203. CharData_Init(&storage);
  5204. test_data.storage = &storage;
  5205. XML_SetExternalEntityRefHandler(g_parser, external_entity_loader2);
  5206. XML_SetUserData(g_parser, &test_data);
  5207. XML_SetCharacterDataHandler(g_parser, ext2_accumulate_characters);
  5208. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  5209. == XML_STATUS_ERROR)
  5210. xml_failure(g_parser);
  5211. CharData_CheckXMLChars(&storage, expected);
  5212. }
  5213. END_TEST
  5214. /* Parsing the full buffer rather than a byte at a time makes a
  5215. * difference to the encoding scanning code, so repeat the above tests
  5216. * without breaking them down by byte.
  5217. */
  5218. START_TEST(test_ext_entity_latin1_utf16le_bom2) {
  5219. const char *text = "<!DOCTYPE doc [\n"
  5220. " <!ENTITY en SYSTEM 'http://example.org/dummy.ent'>\n"
  5221. "]>\n"
  5222. "<doc>&en;</doc>";
  5223. ExtTest2 test_data
  5224. = {/* If UTF-16, 0xfeff is the BOM and 0x204c is black left bullet */
  5225. /* If Latin-1, 0xff = Y-diaeresis, 0xfe = lowercase thorn,
  5226. * 0x4c = L and 0x20 is a space
  5227. */
  5228. "\xff\xfe\x4c\x20", 4, XCS("iso-8859-1"), NULL, EE_PARSE_FULL_BUFFER};
  5229. #ifdef XML_UNICODE
  5230. const XML_Char *expected = XCS("\x00ff\x00feL ");
  5231. #else
  5232. /* In UTF-8, y-diaeresis is 0xc3 0xbf, lowercase thorn is 0xc3 0xbe */
  5233. const XML_Char *expected = XCS("\xc3\xbf\xc3\xbeL ");
  5234. #endif
  5235. CharData storage;
  5236. CharData_Init(&storage);
  5237. test_data.storage = &storage;
  5238. XML_SetExternalEntityRefHandler(g_parser, external_entity_loader2);
  5239. XML_SetUserData(g_parser, &test_data);
  5240. XML_SetCharacterDataHandler(g_parser, ext2_accumulate_characters);
  5241. if (XML_Parse(g_parser, text, (int)strlen(text), XML_TRUE)
  5242. == XML_STATUS_ERROR)
  5243. xml_failure(g_parser);
  5244. CharData_CheckXMLChars(&storage, expected);
  5245. }
  5246. END_TEST
  5247. START_TEST(test_ext_entity_latin1_utf16be_bom2) {
  5248. const char *text = "<!DOCTYPE doc [\n"
  5249. " <!ENTITY en SYSTEM 'http://example.org/dummy.ent'>\n"
  5250. "]>\n"
  5251. "<doc>&en;</doc>";
  5252. ExtTest2 test_data
  5253. = {/* If UTF-16, 0xfeff is the BOM and 0x204c is black left bullet */
  5254. /* If Latin-1, 0xff = Y-diaeresis, 0xfe = lowercase thorn,
  5255. * 0x4c = L and 0x20 is a space
  5256. */
  5257. "\xfe\xff\x20\x4c", 4, XCS("iso-8859-1"), NULL, EE_PARSE_FULL_BUFFER};
  5258. #ifdef XML_UNICODE
  5259. const XML_Char *expected = XCS("\x00fe\x00ff L");
  5260. #else
  5261. /* In UTF-8, y-diaeresis is 0xc3 0xbf, lowercase thorn is 0xc3 0xbe */
  5262. const XML_Char *expected = "\xc3\xbe\xc3\xbf L";
  5263. #endif
  5264. CharData storage;
  5265. CharData_Init(&storage);
  5266. test_data.storage = &storage;
  5267. XML_SetExternalEntityRefHandler(g_parser, external_entity_loader2);
  5268. XML_SetUserData(g_parser, &test_data);
  5269. XML_SetCharacterDataHandler(g_parser, ext2_accumulate_characters);
  5270. if (XML_Parse(g_parser, text, (int)strlen(text), XML_TRUE)
  5271. == XML_STATUS_ERROR)
  5272. xml_failure(g_parser);
  5273. CharData_CheckXMLChars(&storage, expected);
  5274. }
  5275. END_TEST
  5276. /* Test little-endian UTF-16 given an explicit big-endian encoding */
  5277. START_TEST(test_ext_entity_utf16_be) {
  5278. const char *text = "<!DOCTYPE doc [\n"
  5279. " <!ENTITY en SYSTEM 'http://example.org/dummy.ent'>\n"
  5280. "]>\n"
  5281. "<doc>&en;</doc>";
  5282. ExtTest2 test_data
  5283. = {"<\0e\0/\0>\0", 8, XCS("utf-16be"), NULL, EE_PARSE_NONE};
  5284. #ifdef XML_UNICODE
  5285. const XML_Char *expected = XCS("\x3c00\x6500\x2f00\x3e00");
  5286. #else
  5287. const XML_Char *expected = XCS("\xe3\xb0\x80" /* U+3C00 */
  5288. "\xe6\x94\x80" /* U+6500 */
  5289. "\xe2\xbc\x80" /* U+2F00 */
  5290. "\xe3\xb8\x80"); /* U+3E00 */
  5291. #endif
  5292. CharData storage;
  5293. CharData_Init(&storage);
  5294. test_data.storage = &storage;
  5295. XML_SetExternalEntityRefHandler(g_parser, external_entity_loader2);
  5296. XML_SetUserData(g_parser, &test_data);
  5297. XML_SetCharacterDataHandler(g_parser, ext2_accumulate_characters);
  5298. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  5299. == XML_STATUS_ERROR)
  5300. xml_failure(g_parser);
  5301. CharData_CheckXMLChars(&storage, expected);
  5302. }
  5303. END_TEST
  5304. /* Test big-endian UTF-16 given an explicit little-endian encoding */
  5305. START_TEST(test_ext_entity_utf16_le) {
  5306. const char *text = "<!DOCTYPE doc [\n"
  5307. " <!ENTITY en SYSTEM 'http://example.org/dummy.ent'>\n"
  5308. "]>\n"
  5309. "<doc>&en;</doc>";
  5310. ExtTest2 test_data
  5311. = {"\0<\0e\0/\0>", 8, XCS("utf-16le"), NULL, EE_PARSE_NONE};
  5312. #ifdef XML_UNICODE
  5313. const XML_Char *expected = XCS("\x3c00\x6500\x2f00\x3e00");
  5314. #else
  5315. const XML_Char *expected = XCS("\xe3\xb0\x80" /* U+3C00 */
  5316. "\xe6\x94\x80" /* U+6500 */
  5317. "\xe2\xbc\x80" /* U+2F00 */
  5318. "\xe3\xb8\x80"); /* U+3E00 */
  5319. #endif
  5320. CharData storage;
  5321. CharData_Init(&storage);
  5322. test_data.storage = &storage;
  5323. XML_SetExternalEntityRefHandler(g_parser, external_entity_loader2);
  5324. XML_SetUserData(g_parser, &test_data);
  5325. XML_SetCharacterDataHandler(g_parser, ext2_accumulate_characters);
  5326. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  5327. == XML_STATUS_ERROR)
  5328. xml_failure(g_parser);
  5329. CharData_CheckXMLChars(&storage, expected);
  5330. }
  5331. END_TEST
  5332. /* Test little-endian UTF-16 given no explicit encoding.
  5333. * The existing default encoding (UTF-8) is assumed to hold without a
  5334. * BOM to contradict it, so the entity value will in fact provoke an
  5335. * error because 0x00 is not a valid XML character. We parse the
  5336. * whole buffer in one go rather than feeding it in byte by byte to
  5337. * exercise different code paths in the initial scanning routines.
  5338. */
  5339. typedef struct ExtFaults2 {
  5340. const char *parse_text;
  5341. int parse_len;
  5342. const char *fail_text;
  5343. const XML_Char *encoding;
  5344. enum XML_Error error;
  5345. } ExtFaults2;
  5346. static int XMLCALL
  5347. external_entity_faulter2(XML_Parser parser, const XML_Char *context,
  5348. const XML_Char *base, const XML_Char *systemId,
  5349. const XML_Char *publicId) {
  5350. ExtFaults2 *test_data = (ExtFaults2 *)XML_GetUserData(parser);
  5351. XML_Parser extparser;
  5352. UNUSED_P(base);
  5353. UNUSED_P(systemId);
  5354. UNUSED_P(publicId);
  5355. extparser = XML_ExternalEntityParserCreate(parser, context, NULL);
  5356. if (extparser == NULL)
  5357. fail("Could not create external entity parser");
  5358. if (test_data->encoding != NULL) {
  5359. if (! XML_SetEncoding(extparser, test_data->encoding))
  5360. fail("XML_SetEncoding() ignored for external entity");
  5361. }
  5362. if (XML_Parse(extparser, test_data->parse_text, test_data->parse_len,
  5363. XML_TRUE)
  5364. != XML_STATUS_ERROR)
  5365. fail(test_data->fail_text);
  5366. if (XML_GetErrorCode(extparser) != test_data->error)
  5367. xml_failure(extparser);
  5368. XML_ParserFree(extparser);
  5369. return XML_STATUS_ERROR;
  5370. }
  5371. START_TEST(test_ext_entity_utf16_unknown) {
  5372. const char *text = "<!DOCTYPE doc [\n"
  5373. " <!ENTITY en SYSTEM 'http://example.org/dummy.ent'>\n"
  5374. "]>\n"
  5375. "<doc>&en;</doc>";
  5376. ExtFaults2 test_data
  5377. = {"a\0b\0c\0", 6, "Invalid character in entity not faulted", NULL,
  5378. XML_ERROR_INVALID_TOKEN};
  5379. XML_SetExternalEntityRefHandler(g_parser, external_entity_faulter2);
  5380. XML_SetUserData(g_parser, &test_data);
  5381. expect_failure(text, XML_ERROR_EXTERNAL_ENTITY_HANDLING,
  5382. "Invalid character should not have been accepted");
  5383. }
  5384. END_TEST
  5385. /* Test not-quite-UTF-8 BOM (0xEF 0xBB 0xBF) */
  5386. START_TEST(test_ext_entity_utf8_non_bom) {
  5387. const char *text = "<!DOCTYPE doc [\n"
  5388. " <!ENTITY en SYSTEM 'http://example.org/dummy.ent'>\n"
  5389. "]>\n"
  5390. "<doc>&en;</doc>";
  5391. ExtTest2 test_data
  5392. = {"\xef\xbb\x80", /* Arabic letter DAD medial form, U+FEC0 */
  5393. 3, NULL, NULL, EE_PARSE_NONE};
  5394. #ifdef XML_UNICODE
  5395. const XML_Char *expected = XCS("\xfec0");
  5396. #else
  5397. const XML_Char *expected = XCS("\xef\xbb\x80");
  5398. #endif
  5399. CharData storage;
  5400. CharData_Init(&storage);
  5401. test_data.storage = &storage;
  5402. XML_SetExternalEntityRefHandler(g_parser, external_entity_loader2);
  5403. XML_SetUserData(g_parser, &test_data);
  5404. XML_SetCharacterDataHandler(g_parser, ext2_accumulate_characters);
  5405. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  5406. == XML_STATUS_ERROR)
  5407. xml_failure(g_parser);
  5408. CharData_CheckXMLChars(&storage, expected);
  5409. }
  5410. END_TEST
  5411. /* Test that UTF-8 in a CDATA section is correctly passed through */
  5412. START_TEST(test_utf8_in_cdata_section) {
  5413. const char *text = "<doc><![CDATA[one \xc3\xa9 two]]></doc>";
  5414. #ifdef XML_UNICODE
  5415. const XML_Char *expected = XCS("one \x00e9 two");
  5416. #else
  5417. const XML_Char *expected = XCS("one \xc3\xa9 two");
  5418. #endif
  5419. run_character_check(text, expected);
  5420. }
  5421. END_TEST
  5422. /* Test that little-endian UTF-16 in a CDATA section is handled */
  5423. START_TEST(test_utf8_in_cdata_section_2) {
  5424. const char *text = "<doc><![CDATA[\xc3\xa9]\xc3\xa9two]]></doc>";
  5425. #ifdef XML_UNICODE
  5426. const XML_Char *expected = XCS("\x00e9]\x00e9two");
  5427. #else
  5428. const XML_Char *expected = XCS("\xc3\xa9]\xc3\xa9two");
  5429. #endif
  5430. run_character_check(text, expected);
  5431. }
  5432. END_TEST
  5433. START_TEST(test_utf8_in_start_tags) {
  5434. struct test_case {
  5435. bool goodName;
  5436. bool goodNameStart;
  5437. const char *tagName;
  5438. };
  5439. // The idea with the tests below is this:
  5440. // We want to cover 1-, 2- and 3-byte sequences, 4-byte sequences
  5441. // go to isNever and are hence not a concern.
  5442. //
  5443. // We start with a character that is a valid name character
  5444. // (or even name-start character, see XML 1.0r4 spec) and then we flip
  5445. // single bits at places where (1) the result leaves the UTF-8 encoding space
  5446. // and (2) we stay in the same n-byte sequence family.
  5447. //
  5448. // The flipped bits are highlighted in angle brackets in comments,
  5449. // e.g. "[<1>011 1001]" means we had [0011 1001] but we now flipped
  5450. // the most significant bit to 1 to leave UTF-8 encoding space.
  5451. struct test_case cases[] = {
  5452. // 1-byte UTF-8: [0xxx xxxx]
  5453. {true, true, "\x3A"}, // [0011 1010] = ASCII colon ':'
  5454. {false, false, "\xBA"}, // [<1>011 1010]
  5455. {true, false, "\x39"}, // [0011 1001] = ASCII nine '9'
  5456. {false, false, "\xB9"}, // [<1>011 1001]
  5457. // 2-byte UTF-8: [110x xxxx] [10xx xxxx]
  5458. {true, true, "\xDB\xA5"}, // [1101 1011] [1010 0101] =
  5459. // Arabic small waw U+06E5
  5460. {false, false, "\x9B\xA5"}, // [1<0>01 1011] [1010 0101]
  5461. {false, false, "\xDB\x25"}, // [1101 1011] [<0>010 0101]
  5462. {false, false, "\xDB\xE5"}, // [1101 1011] [1<1>10 0101]
  5463. {true, false, "\xCC\x81"}, // [1100 1100] [1000 0001] =
  5464. // combining char U+0301
  5465. {false, false, "\x8C\x81"}, // [1<0>00 1100] [1000 0001]
  5466. {false, false, "\xCC\x01"}, // [1100 1100] [<0>000 0001]
  5467. {false, false, "\xCC\xC1"}, // [1100 1100] [1<1>00 0001]
  5468. // 3-byte UTF-8: [1110 xxxx] [10xx xxxx] [10xxxxxx]
  5469. {true, true, "\xE0\xA4\x85"}, // [1110 0000] [1010 0100] [1000 0101] =
  5470. // Devanagari Letter A U+0905
  5471. {false, false, "\xA0\xA4\x85"}, // [1<0>10 0000] [1010 0100] [1000 0101]
  5472. {false, false, "\xE0\x24\x85"}, // [1110 0000] [<0>010 0100] [1000 0101]
  5473. {false, false, "\xE0\xE4\x85"}, // [1110 0000] [1<1>10 0100] [1000 0101]
  5474. {false, false, "\xE0\xA4\x05"}, // [1110 0000] [1010 0100] [<0>000 0101]
  5475. {false, false, "\xE0\xA4\xC5"}, // [1110 0000] [1010 0100] [1<1>00 0101]
  5476. {true, false, "\xE0\xA4\x81"}, // [1110 0000] [1010 0100] [1000 0001] =
  5477. // combining char U+0901
  5478. {false, false, "\xA0\xA4\x81"}, // [1<0>10 0000] [1010 0100] [1000 0001]
  5479. {false, false, "\xE0\x24\x81"}, // [1110 0000] [<0>010 0100] [1000 0001]
  5480. {false, false, "\xE0\xE4\x81"}, // [1110 0000] [1<1>10 0100] [1000 0001]
  5481. {false, false, "\xE0\xA4\x01"}, // [1110 0000] [1010 0100] [<0>000 0001]
  5482. {false, false, "\xE0\xA4\xC1"}, // [1110 0000] [1010 0100] [1<1>00 0001]
  5483. };
  5484. const bool atNameStart[] = {true, false};
  5485. size_t i = 0;
  5486. char doc[1024];
  5487. size_t failCount = 0;
  5488. for (; i < sizeof(cases) / sizeof(cases[0]); i++) {
  5489. size_t j = 0;
  5490. for (; j < sizeof(atNameStart) / sizeof(atNameStart[0]); j++) {
  5491. const bool expectedSuccess
  5492. = atNameStart[j] ? cases[i].goodNameStart : cases[i].goodName;
  5493. sprintf(doc, "<%s%s><!--", atNameStart[j] ? "" : "a", cases[i].tagName);
  5494. XML_Parser parser = XML_ParserCreate(NULL);
  5495. const enum XML_Status status
  5496. = XML_Parse(parser, doc, (int)strlen(doc), /*isFinal=*/XML_FALSE);
  5497. bool success = true;
  5498. if ((status == XML_STATUS_OK) != expectedSuccess) {
  5499. success = false;
  5500. }
  5501. if ((status == XML_STATUS_ERROR)
  5502. && (XML_GetErrorCode(parser) != XML_ERROR_INVALID_TOKEN)) {
  5503. success = false;
  5504. }
  5505. if (! success) {
  5506. fprintf(
  5507. stderr,
  5508. "FAIL case %2u (%sat name start, %u-byte sequence, error code %d)\n",
  5509. (unsigned)i + 1u, atNameStart[j] ? " " : "not ",
  5510. (unsigned)strlen(cases[i].tagName), XML_GetErrorCode(parser));
  5511. failCount++;
  5512. }
  5513. XML_ParserFree(parser);
  5514. }
  5515. }
  5516. if (failCount > 0) {
  5517. fail("UTF-8 regression detected");
  5518. }
  5519. }
  5520. END_TEST
  5521. /* Test trailing spaces in elements are accepted */
  5522. static void XMLCALL
  5523. record_element_end_handler(void *userData, const XML_Char *name) {
  5524. CharData *storage = (CharData *)userData;
  5525. CharData_AppendXMLChars(storage, XCS("/"), 1);
  5526. CharData_AppendXMLChars(storage, name, -1);
  5527. }
  5528. START_TEST(test_trailing_spaces_in_elements) {
  5529. const char *text = "<doc >Hi</doc >";
  5530. const XML_Char *expected = XCS("doc/doc");
  5531. CharData storage;
  5532. CharData_Init(&storage);
  5533. XML_SetElementHandler(g_parser, record_element_start_handler,
  5534. record_element_end_handler);
  5535. XML_SetUserData(g_parser, &storage);
  5536. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  5537. == XML_STATUS_ERROR)
  5538. xml_failure(g_parser);
  5539. CharData_CheckXMLChars(&storage, expected);
  5540. }
  5541. END_TEST
  5542. START_TEST(test_utf16_attribute) {
  5543. const char text[] =
  5544. /* <d {KHO KHWAI}{CHO CHAN}='a'/>
  5545. * where {KHO KHWAI} = U+0E04 = 0xe0 0xb8 0x84 in UTF-8
  5546. * and {CHO CHAN} = U+0E08 = 0xe0 0xb8 0x88 in UTF-8
  5547. */
  5548. "<\0d\0 \0\x04\x0e\x08\x0e=\0'\0a\0'\0/\0>\0";
  5549. const XML_Char *expected = XCS("a");
  5550. CharData storage;
  5551. CharData_Init(&storage);
  5552. XML_SetStartElementHandler(g_parser, accumulate_attribute);
  5553. XML_SetUserData(g_parser, &storage);
  5554. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)sizeof(text) - 1, XML_TRUE)
  5555. == XML_STATUS_ERROR)
  5556. xml_failure(g_parser);
  5557. CharData_CheckXMLChars(&storage, expected);
  5558. }
  5559. END_TEST
  5560. START_TEST(test_utf16_second_attr) {
  5561. /* <d a='1' {KHO KHWAI}{CHO CHAN}='2'/>
  5562. * where {KHO KHWAI} = U+0E04 = 0xe0 0xb8 0x84 in UTF-8
  5563. * and {CHO CHAN} = U+0E08 = 0xe0 0xb8 0x88 in UTF-8
  5564. */
  5565. const char text[] = "<\0d\0 \0a\0=\0'\0\x31\0'\0 \0"
  5566. "\x04\x0e\x08\x0e=\0'\0\x32\0'\0/\0>\0";
  5567. const XML_Char *expected = XCS("1");
  5568. CharData storage;
  5569. CharData_Init(&storage);
  5570. XML_SetStartElementHandler(g_parser, accumulate_attribute);
  5571. XML_SetUserData(g_parser, &storage);
  5572. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)sizeof(text) - 1, XML_TRUE)
  5573. == XML_STATUS_ERROR)
  5574. xml_failure(g_parser);
  5575. CharData_CheckXMLChars(&storage, expected);
  5576. }
  5577. END_TEST
  5578. START_TEST(test_attr_after_solidus) {
  5579. const char *text = "<doc attr1='a' / attr2='b'>";
  5580. expect_failure(text, XML_ERROR_INVALID_TOKEN, "Misplaced / not faulted");
  5581. }
  5582. END_TEST
  5583. static void XMLCALL
  5584. accumulate_entity_decl(void *userData, const XML_Char *entityName,
  5585. int is_parameter_entity, const XML_Char *value,
  5586. int value_length, const XML_Char *base,
  5587. const XML_Char *systemId, const XML_Char *publicId,
  5588. const XML_Char *notationName) {
  5589. CharData *storage = (CharData *)userData;
  5590. UNUSED_P(is_parameter_entity);
  5591. UNUSED_P(base);
  5592. UNUSED_P(systemId);
  5593. UNUSED_P(publicId);
  5594. UNUSED_P(notationName);
  5595. CharData_AppendXMLChars(storage, entityName, -1);
  5596. CharData_AppendXMLChars(storage, XCS("="), 1);
  5597. CharData_AppendXMLChars(storage, value, value_length);
  5598. CharData_AppendXMLChars(storage, XCS("\n"), 1);
  5599. }
  5600. START_TEST(test_utf16_pe) {
  5601. /* <!DOCTYPE doc [
  5602. * <!ENTITY % {KHO KHWAI}{CHO CHAN} '<!ELEMENT doc (#PCDATA)>'>
  5603. * %{KHO KHWAI}{CHO CHAN};
  5604. * ]>
  5605. * <doc></doc>
  5606. *
  5607. * where {KHO KHWAI} = U+0E04 = 0xe0 0xb8 0x84 in UTF-8
  5608. * and {CHO CHAN} = U+0E08 = 0xe0 0xb8 0x88 in UTF-8
  5609. */
  5610. const char text[] = "\0<\0!\0D\0O\0C\0T\0Y\0P\0E\0 \0d\0o\0c\0 \0[\0\n"
  5611. "\0<\0!\0E\0N\0T\0I\0T\0Y\0 \0%\0 \x0e\x04\x0e\x08\0 "
  5612. "\0'\0<\0!\0E\0L\0E\0M\0E\0N\0T\0 "
  5613. "\0d\0o\0c\0 \0(\0#\0P\0C\0D\0A\0T\0A\0)\0>\0'\0>\0\n"
  5614. "\0%\x0e\x04\x0e\x08\0;\0\n"
  5615. "\0]\0>\0\n"
  5616. "\0<\0d\0o\0c\0>\0<\0/\0d\0o\0c\0>";
  5617. #ifdef XML_UNICODE
  5618. const XML_Char *expected = XCS("\x0e04\x0e08=<!ELEMENT doc (#PCDATA)>\n");
  5619. #else
  5620. const XML_Char *expected
  5621. = XCS("\xe0\xb8\x84\xe0\xb8\x88=<!ELEMENT doc (#PCDATA)>\n");
  5622. #endif
  5623. CharData storage;
  5624. CharData_Init(&storage);
  5625. XML_SetUserData(g_parser, &storage);
  5626. XML_SetEntityDeclHandler(g_parser, accumulate_entity_decl);
  5627. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)sizeof(text) - 1, XML_TRUE)
  5628. == XML_STATUS_ERROR)
  5629. xml_failure(g_parser);
  5630. CharData_CheckXMLChars(&storage, expected);
  5631. }
  5632. END_TEST
  5633. /* Test that duff attribute description keywords are rejected */
  5634. START_TEST(test_bad_attr_desc_keyword) {
  5635. const char *text = "<!DOCTYPE doc [\n"
  5636. " <!ATTLIST doc attr CDATA #!IMPLIED>\n"
  5637. "]>\n"
  5638. "<doc />";
  5639. expect_failure(text, XML_ERROR_INVALID_TOKEN,
  5640. "Bad keyword !IMPLIED not faulted");
  5641. }
  5642. END_TEST
  5643. /* Test that an invalid attribute description keyword consisting of
  5644. * UTF-16 characters with their top bytes non-zero are correctly
  5645. * faulted
  5646. */
  5647. START_TEST(test_bad_attr_desc_keyword_utf16) {
  5648. /* <!DOCTYPE d [
  5649. * <!ATTLIST d a CDATA #{KHO KHWAI}{CHO CHAN}>
  5650. * ]><d/>
  5651. *
  5652. * where {KHO KHWAI} = U+0E04 = 0xe0 0xb8 0x84 in UTF-8
  5653. * and {CHO CHAN} = U+0E08 = 0xe0 0xb8 0x88 in UTF-8
  5654. */
  5655. const char text[]
  5656. = "\0<\0!\0D\0O\0C\0T\0Y\0P\0E\0 \0d\0 \0[\0\n"
  5657. "\0<\0!\0A\0T\0T\0L\0I\0S\0T\0 \0d\0 \0a\0 \0C\0D\0A\0T\0A\0 "
  5658. "\0#\x0e\x04\x0e\x08\0>\0\n"
  5659. "\0]\0>\0<\0d\0/\0>";
  5660. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)sizeof(text) - 1, XML_TRUE)
  5661. != XML_STATUS_ERROR)
  5662. fail("Invalid UTF16 attribute keyword not faulted");
  5663. if (XML_GetErrorCode(g_parser) != XML_ERROR_SYNTAX)
  5664. xml_failure(g_parser);
  5665. }
  5666. END_TEST
  5667. /* Test that invalid syntax in a <!DOCTYPE> is rejected. Do this
  5668. * using prefix-encoding (see above) to trigger specific code paths
  5669. */
  5670. START_TEST(test_bad_doctype) {
  5671. const char *text = "<?xml version='1.0' encoding='prefix-conv'?>\n"
  5672. "<!DOCTYPE doc [ \x80\x44 ]><doc/>";
  5673. XML_SetUnknownEncodingHandler(g_parser, MiscEncodingHandler, NULL);
  5674. expect_failure(text, XML_ERROR_SYNTAX,
  5675. "Invalid bytes in DOCTYPE not faulted");
  5676. }
  5677. END_TEST
  5678. START_TEST(test_bad_doctype_utf8) {
  5679. const char *text = "<!DOCTYPE \xDB\x25"
  5680. "doc><doc/>"; // [1101 1011] [<0>010 0101]
  5681. expect_failure(text, XML_ERROR_INVALID_TOKEN,
  5682. "Invalid UTF-8 in DOCTYPE not faulted");
  5683. }
  5684. END_TEST
  5685. START_TEST(test_bad_doctype_utf16) {
  5686. const char text[] =
  5687. /* <!DOCTYPE doc [ \x06f2 ]><doc/>
  5688. *
  5689. * U+06F2 = EXTENDED ARABIC-INDIC DIGIT TWO, a valid number
  5690. * (name character) but not a valid letter (name start character)
  5691. */
  5692. "\0<\0!\0D\0O\0C\0T\0Y\0P\0E\0 \0d\0o\0c\0 \0[\0 "
  5693. "\x06\xf2"
  5694. "\0 \0]\0>\0<\0d\0o\0c\0/\0>";
  5695. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)sizeof(text) - 1, XML_TRUE)
  5696. != XML_STATUS_ERROR)
  5697. fail("Invalid bytes in DOCTYPE not faulted");
  5698. if (XML_GetErrorCode(g_parser) != XML_ERROR_SYNTAX)
  5699. xml_failure(g_parser);
  5700. }
  5701. END_TEST
  5702. START_TEST(test_bad_doctype_plus) {
  5703. const char *text = "<!DOCTYPE 1+ [ <!ENTITY foo 'bar'> ]>\n"
  5704. "<1+>&foo;</1+>";
  5705. expect_failure(text, XML_ERROR_INVALID_TOKEN,
  5706. "'+' in document name not faulted");
  5707. }
  5708. END_TEST
  5709. START_TEST(test_bad_doctype_star) {
  5710. const char *text = "<!DOCTYPE 1* [ <!ENTITY foo 'bar'> ]>\n"
  5711. "<1*>&foo;</1*>";
  5712. expect_failure(text, XML_ERROR_INVALID_TOKEN,
  5713. "'*' in document name not faulted");
  5714. }
  5715. END_TEST
  5716. START_TEST(test_bad_doctype_query) {
  5717. const char *text = "<!DOCTYPE 1? [ <!ENTITY foo 'bar'> ]>\n"
  5718. "<1?>&foo;</1?>";
  5719. expect_failure(text, XML_ERROR_INVALID_TOKEN,
  5720. "'?' in document name not faulted");
  5721. }
  5722. END_TEST
  5723. START_TEST(test_unknown_encoding_bad_ignore) {
  5724. const char *text = "<?xml version='1.0' encoding='prefix-conv'?>"
  5725. "<!DOCTYPE doc SYSTEM 'foo'>"
  5726. "<doc><e>&entity;</e></doc>";
  5727. ExtFaults fault = {"<![IGNORE[<!ELEMENT \xffG (#PCDATA)*>]]>",
  5728. "Invalid character not faulted", XCS("prefix-conv"),
  5729. XML_ERROR_INVALID_TOKEN};
  5730. XML_SetUnknownEncodingHandler(g_parser, MiscEncodingHandler, NULL);
  5731. XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
  5732. XML_SetExternalEntityRefHandler(g_parser, external_entity_faulter);
  5733. XML_SetUserData(g_parser, &fault);
  5734. expect_failure(text, XML_ERROR_EXTERNAL_ENTITY_HANDLING,
  5735. "Bad IGNORE section with unknown encoding not failed");
  5736. }
  5737. END_TEST
  5738. START_TEST(test_entity_in_utf16_be_attr) {
  5739. const char text[] =
  5740. /* <e a='&#228; &#x00E4;'></e> */
  5741. "\0<\0e\0 \0a\0=\0'\0&\0#\0\x32\0\x32\0\x38\0;\0 "
  5742. "\0&\0#\0x\0\x30\0\x30\0E\0\x34\0;\0'\0>\0<\0/\0e\0>";
  5743. #ifdef XML_UNICODE
  5744. const XML_Char *expected = XCS("\x00e4 \x00e4");
  5745. #else
  5746. const XML_Char *expected = XCS("\xc3\xa4 \xc3\xa4");
  5747. #endif
  5748. CharData storage;
  5749. CharData_Init(&storage);
  5750. XML_SetUserData(g_parser, &storage);
  5751. XML_SetStartElementHandler(g_parser, accumulate_attribute);
  5752. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)sizeof(text) - 1, XML_TRUE)
  5753. == XML_STATUS_ERROR)
  5754. xml_failure(g_parser);
  5755. CharData_CheckXMLChars(&storage, expected);
  5756. }
  5757. END_TEST
  5758. START_TEST(test_entity_in_utf16_le_attr) {
  5759. const char text[] =
  5760. /* <e a='&#228; &#x00E4;'></e> */
  5761. "<\0e\0 \0a\0=\0'\0&\0#\0\x32\0\x32\0\x38\0;\0 \0"
  5762. "&\0#\0x\0\x30\0\x30\0E\0\x34\0;\0'\0>\0<\0/\0e\0>\0";
  5763. #ifdef XML_UNICODE
  5764. const XML_Char *expected = XCS("\x00e4 \x00e4");
  5765. #else
  5766. const XML_Char *expected = XCS("\xc3\xa4 \xc3\xa4");
  5767. #endif
  5768. CharData storage;
  5769. CharData_Init(&storage);
  5770. XML_SetUserData(g_parser, &storage);
  5771. XML_SetStartElementHandler(g_parser, accumulate_attribute);
  5772. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)sizeof(text) - 1, XML_TRUE)
  5773. == XML_STATUS_ERROR)
  5774. xml_failure(g_parser);
  5775. CharData_CheckXMLChars(&storage, expected);
  5776. }
  5777. END_TEST
  5778. START_TEST(test_entity_public_utf16_be) {
  5779. const char text[] =
  5780. /* <!DOCTYPE d [ */
  5781. "\0<\0!\0D\0O\0C\0T\0Y\0P\0E\0 \0d\0 \0[\0\n"
  5782. /* <!ENTITY % e PUBLIC 'foo' 'bar.ent'> */
  5783. "\0<\0!\0E\0N\0T\0I\0T\0Y\0 \0%\0 \0e\0 \0P\0U\0B\0L\0I\0C\0 "
  5784. "\0'\0f\0o\0o\0'\0 \0'\0b\0a\0r\0.\0e\0n\0t\0'\0>\0\n"
  5785. /* %e; */
  5786. "\0%\0e\0;\0\n"
  5787. /* ]> */
  5788. "\0]\0>\0\n"
  5789. /* <d>&j;</d> */
  5790. "\0<\0d\0>\0&\0j\0;\0<\0/\0d\0>";
  5791. ExtTest2 test_data = {/* <!ENTITY j 'baz'> */
  5792. "\0<\0!\0E\0N\0T\0I\0T\0Y\0 \0j\0 \0'\0b\0a\0z\0'\0>",
  5793. 34, NULL, NULL, EE_PARSE_NONE};
  5794. const XML_Char *expected = XCS("baz");
  5795. CharData storage;
  5796. CharData_Init(&storage);
  5797. test_data.storage = &storage;
  5798. XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
  5799. XML_SetExternalEntityRefHandler(g_parser, external_entity_loader2);
  5800. XML_SetUserData(g_parser, &test_data);
  5801. XML_SetCharacterDataHandler(g_parser, ext2_accumulate_characters);
  5802. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)sizeof(text) - 1, XML_TRUE)
  5803. == XML_STATUS_ERROR)
  5804. xml_failure(g_parser);
  5805. CharData_CheckXMLChars(&storage, expected);
  5806. }
  5807. END_TEST
  5808. START_TEST(test_entity_public_utf16_le) {
  5809. const char text[] =
  5810. /* <!DOCTYPE d [ */
  5811. "<\0!\0D\0O\0C\0T\0Y\0P\0E\0 \0d\0 \0[\0\n\0"
  5812. /* <!ENTITY % e PUBLIC 'foo' 'bar.ent'> */
  5813. "<\0!\0E\0N\0T\0I\0T\0Y\0 \0%\0 \0e\0 \0P\0U\0B\0L\0I\0C\0 \0"
  5814. "'\0f\0o\0o\0'\0 \0'\0b\0a\0r\0.\0e\0n\0t\0'\0>\0\n\0"
  5815. /* %e; */
  5816. "%\0e\0;\0\n\0"
  5817. /* ]> */
  5818. "]\0>\0\n\0"
  5819. /* <d>&j;</d> */
  5820. "<\0d\0>\0&\0j\0;\0<\0/\0d\0>\0";
  5821. ExtTest2 test_data = {/* <!ENTITY j 'baz'> */
  5822. "<\0!\0E\0N\0T\0I\0T\0Y\0 \0j\0 \0'\0b\0a\0z\0'\0>\0",
  5823. 34, NULL, NULL, EE_PARSE_NONE};
  5824. const XML_Char *expected = XCS("baz");
  5825. CharData storage;
  5826. CharData_Init(&storage);
  5827. test_data.storage = &storage;
  5828. XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
  5829. XML_SetExternalEntityRefHandler(g_parser, external_entity_loader2);
  5830. XML_SetUserData(g_parser, &test_data);
  5831. XML_SetCharacterDataHandler(g_parser, ext2_accumulate_characters);
  5832. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)sizeof(text) - 1, XML_TRUE)
  5833. == XML_STATUS_ERROR)
  5834. xml_failure(g_parser);
  5835. CharData_CheckXMLChars(&storage, expected);
  5836. }
  5837. END_TEST
  5838. /* Test that a doctype with neither an internal nor external subset is
  5839. * faulted
  5840. */
  5841. START_TEST(test_short_doctype) {
  5842. const char *text = "<!DOCTYPE doc></doc>";
  5843. expect_failure(text, XML_ERROR_INVALID_TOKEN,
  5844. "DOCTYPE without subset not rejected");
  5845. }
  5846. END_TEST
  5847. START_TEST(test_short_doctype_2) {
  5848. const char *text = "<!DOCTYPE doc PUBLIC></doc>";
  5849. expect_failure(text, XML_ERROR_SYNTAX,
  5850. "DOCTYPE without Public ID not rejected");
  5851. }
  5852. END_TEST
  5853. START_TEST(test_short_doctype_3) {
  5854. const char *text = "<!DOCTYPE doc SYSTEM></doc>";
  5855. expect_failure(text, XML_ERROR_SYNTAX,
  5856. "DOCTYPE without System ID not rejected");
  5857. }
  5858. END_TEST
  5859. START_TEST(test_long_doctype) {
  5860. const char *text = "<!DOCTYPE doc PUBLIC 'foo' 'bar' 'baz'></doc>";
  5861. expect_failure(text, XML_ERROR_SYNTAX, "DOCTYPE with extra ID not rejected");
  5862. }
  5863. END_TEST
  5864. START_TEST(test_bad_entity) {
  5865. const char *text = "<!DOCTYPE doc [\n"
  5866. " <!ENTITY foo PUBLIC>\n"
  5867. "]>\n"
  5868. "<doc/>";
  5869. expect_failure(text, XML_ERROR_SYNTAX,
  5870. "ENTITY without Public ID is not rejected");
  5871. }
  5872. END_TEST
  5873. /* Test unquoted value is faulted */
  5874. START_TEST(test_bad_entity_2) {
  5875. const char *text = "<!DOCTYPE doc [\n"
  5876. " <!ENTITY % foo bar>\n"
  5877. "]>\n"
  5878. "<doc/>";
  5879. expect_failure(text, XML_ERROR_SYNTAX,
  5880. "ENTITY without Public ID is not rejected");
  5881. }
  5882. END_TEST
  5883. START_TEST(test_bad_entity_3) {
  5884. const char *text = "<!DOCTYPE doc [\n"
  5885. " <!ENTITY % foo PUBLIC>\n"
  5886. "]>\n"
  5887. "<doc/>";
  5888. expect_failure(text, XML_ERROR_SYNTAX,
  5889. "Parameter ENTITY without Public ID is not rejected");
  5890. }
  5891. END_TEST
  5892. START_TEST(test_bad_entity_4) {
  5893. const char *text = "<!DOCTYPE doc [\n"
  5894. " <!ENTITY % foo SYSTEM>\n"
  5895. "]>\n"
  5896. "<doc/>";
  5897. expect_failure(text, XML_ERROR_SYNTAX,
  5898. "Parameter ENTITY without Public ID is not rejected");
  5899. }
  5900. END_TEST
  5901. START_TEST(test_bad_notation) {
  5902. const char *text = "<!DOCTYPE doc [\n"
  5903. " <!NOTATION n SYSTEM>\n"
  5904. "]>\n"
  5905. "<doc/>";
  5906. expect_failure(text, XML_ERROR_SYNTAX,
  5907. "Notation without System ID is not rejected");
  5908. }
  5909. END_TEST
  5910. /* Test for issue #11, wrongly suppressed default handler */
  5911. typedef struct default_check {
  5912. const XML_Char *expected;
  5913. const int expectedLen;
  5914. XML_Bool seen;
  5915. } DefaultCheck;
  5916. static void XMLCALL
  5917. checking_default_handler(void *userData, const XML_Char *s, int len) {
  5918. DefaultCheck *data = (DefaultCheck *)userData;
  5919. int i;
  5920. for (i = 0; data[i].expected != NULL; i++) {
  5921. if (data[i].expectedLen == len
  5922. && ! memcmp(data[i].expected, s, len * sizeof(XML_Char))) {
  5923. data[i].seen = XML_TRUE;
  5924. break;
  5925. }
  5926. }
  5927. }
  5928. START_TEST(test_default_doctype_handler) {
  5929. const char *text = "<!DOCTYPE doc PUBLIC 'pubname' 'test.dtd' [\n"
  5930. " <!ENTITY foo 'bar'>\n"
  5931. "]>\n"
  5932. "<doc>&foo;</doc>";
  5933. DefaultCheck test_data[] = {{XCS("'pubname'"), 9, XML_FALSE},
  5934. {XCS("'test.dtd'"), 10, XML_FALSE},
  5935. {NULL, 0, XML_FALSE}};
  5936. int i;
  5937. XML_SetUserData(g_parser, &test_data);
  5938. XML_SetDefaultHandler(g_parser, checking_default_handler);
  5939. XML_SetEntityDeclHandler(g_parser, dummy_entity_decl_handler);
  5940. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  5941. == XML_STATUS_ERROR)
  5942. xml_failure(g_parser);
  5943. for (i = 0; test_data[i].expected != NULL; i++)
  5944. if (! test_data[i].seen)
  5945. fail("Default handler not run for public !DOCTYPE");
  5946. }
  5947. END_TEST
  5948. START_TEST(test_empty_element_abort) {
  5949. const char *text = "<abort/>";
  5950. XML_SetStartElementHandler(g_parser, start_element_suspender);
  5951. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  5952. != XML_STATUS_ERROR)
  5953. fail("Expected to error on abort");
  5954. }
  5955. END_TEST
  5956. /*
  5957. * Namespaces tests.
  5958. */
  5959. static void
  5960. namespace_setup(void) {
  5961. g_parser = XML_ParserCreateNS(NULL, XCS(' '));
  5962. if (g_parser == NULL)
  5963. fail("Parser not created.");
  5964. }
  5965. static void
  5966. namespace_teardown(void) {
  5967. basic_teardown();
  5968. }
  5969. /* Check that an element name and attribute name match the expected values.
  5970. The expected values are passed as an array reference of string pointers
  5971. provided as the userData argument; the first is the expected
  5972. element name, and the second is the expected attribute name.
  5973. */
  5974. static int triplet_start_flag = XML_FALSE;
  5975. static int triplet_end_flag = XML_FALSE;
  5976. static void XMLCALL
  5977. triplet_start_checker(void *userData, const XML_Char *name,
  5978. const XML_Char **atts) {
  5979. XML_Char **elemstr = (XML_Char **)userData;
  5980. char buffer[1024];
  5981. if (xcstrcmp(elemstr[0], name) != 0) {
  5982. sprintf(buffer, "unexpected start string: '%" XML_FMT_STR "'", name);
  5983. fail(buffer);
  5984. }
  5985. if (xcstrcmp(elemstr[1], atts[0]) != 0) {
  5986. sprintf(buffer, "unexpected attribute string: '%" XML_FMT_STR "'", atts[0]);
  5987. fail(buffer);
  5988. }
  5989. triplet_start_flag = XML_TRUE;
  5990. }
  5991. /* Check that the element name passed to the end-element handler matches
  5992. the expected value. The expected value is passed as the first element
  5993. in an array of strings passed as the userData argument.
  5994. */
  5995. static void XMLCALL
  5996. triplet_end_checker(void *userData, const XML_Char *name) {
  5997. XML_Char **elemstr = (XML_Char **)userData;
  5998. if (xcstrcmp(elemstr[0], name) != 0) {
  5999. char buffer[1024];
  6000. sprintf(buffer, "unexpected end string: '%" XML_FMT_STR "'", name);
  6001. fail(buffer);
  6002. }
  6003. triplet_end_flag = XML_TRUE;
  6004. }
  6005. START_TEST(test_return_ns_triplet) {
  6006. const char *text = "<foo:e xmlns:foo='http://example.org/' bar:a='12'\n"
  6007. " xmlns:bar='http://example.org/'>";
  6008. const char *epilog = "</foo:e>";
  6009. const XML_Char *elemstr[]
  6010. = {XCS("http://example.org/ e foo"), XCS("http://example.org/ a bar")};
  6011. XML_SetReturnNSTriplet(g_parser, XML_TRUE);
  6012. XML_SetUserData(g_parser, (void *)elemstr);
  6013. XML_SetElementHandler(g_parser, triplet_start_checker, triplet_end_checker);
  6014. XML_SetNamespaceDeclHandler(g_parser, dummy_start_namespace_decl_handler,
  6015. dummy_end_namespace_decl_handler);
  6016. triplet_start_flag = XML_FALSE;
  6017. triplet_end_flag = XML_FALSE;
  6018. dummy_handler_flags = 0;
  6019. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_FALSE)
  6020. == XML_STATUS_ERROR)
  6021. xml_failure(g_parser);
  6022. if (! triplet_start_flag)
  6023. fail("triplet_start_checker not invoked");
  6024. /* Check that unsetting "return triplets" fails while still parsing */
  6025. XML_SetReturnNSTriplet(g_parser, XML_FALSE);
  6026. if (_XML_Parse_SINGLE_BYTES(g_parser, epilog, (int)strlen(epilog), XML_TRUE)
  6027. == XML_STATUS_ERROR)
  6028. xml_failure(g_parser);
  6029. if (! triplet_end_flag)
  6030. fail("triplet_end_checker not invoked");
  6031. if (dummy_handler_flags
  6032. != (DUMMY_START_NS_DECL_HANDLER_FLAG | DUMMY_END_NS_DECL_HANDLER_FLAG))
  6033. fail("Namespace handlers not called");
  6034. }
  6035. END_TEST
  6036. static void XMLCALL
  6037. overwrite_start_checker(void *userData, const XML_Char *name,
  6038. const XML_Char **atts) {
  6039. CharData *storage = (CharData *)userData;
  6040. CharData_AppendXMLChars(storage, XCS("start "), 6);
  6041. CharData_AppendXMLChars(storage, name, -1);
  6042. while (*atts != NULL) {
  6043. CharData_AppendXMLChars(storage, XCS("\nattribute "), 11);
  6044. CharData_AppendXMLChars(storage, *atts, -1);
  6045. atts += 2;
  6046. }
  6047. CharData_AppendXMLChars(storage, XCS("\n"), 1);
  6048. }
  6049. static void XMLCALL
  6050. overwrite_end_checker(void *userData, const XML_Char *name) {
  6051. CharData *storage = (CharData *)userData;
  6052. CharData_AppendXMLChars(storage, XCS("end "), 4);
  6053. CharData_AppendXMLChars(storage, name, -1);
  6054. CharData_AppendXMLChars(storage, XCS("\n"), 1);
  6055. }
  6056. static void
  6057. run_ns_tagname_overwrite_test(const char *text, const XML_Char *result) {
  6058. CharData storage;
  6059. CharData_Init(&storage);
  6060. XML_SetUserData(g_parser, &storage);
  6061. XML_SetElementHandler(g_parser, overwrite_start_checker,
  6062. overwrite_end_checker);
  6063. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  6064. == XML_STATUS_ERROR)
  6065. xml_failure(g_parser);
  6066. CharData_CheckXMLChars(&storage, result);
  6067. }
  6068. /* Regression test for SF bug #566334. */
  6069. START_TEST(test_ns_tagname_overwrite) {
  6070. const char *text = "<n:e xmlns:n='http://example.org/'>\n"
  6071. " <n:f n:attr='foo'/>\n"
  6072. " <n:g n:attr2='bar'/>\n"
  6073. "</n:e>";
  6074. const XML_Char *result = XCS("start http://example.org/ e\n")
  6075. XCS("start http://example.org/ f\n")
  6076. XCS("attribute http://example.org/ attr\n")
  6077. XCS("end http://example.org/ f\n")
  6078. XCS("start http://example.org/ g\n")
  6079. XCS("attribute http://example.org/ attr2\n")
  6080. XCS("end http://example.org/ g\n")
  6081. XCS("end http://example.org/ e\n");
  6082. run_ns_tagname_overwrite_test(text, result);
  6083. }
  6084. END_TEST
  6085. /* Regression test for SF bug #566334. */
  6086. START_TEST(test_ns_tagname_overwrite_triplet) {
  6087. const char *text = "<n:e xmlns:n='http://example.org/'>\n"
  6088. " <n:f n:attr='foo'/>\n"
  6089. " <n:g n:attr2='bar'/>\n"
  6090. "</n:e>";
  6091. const XML_Char *result = XCS("start http://example.org/ e n\n")
  6092. XCS("start http://example.org/ f n\n")
  6093. XCS("attribute http://example.org/ attr n\n")
  6094. XCS("end http://example.org/ f n\n")
  6095. XCS("start http://example.org/ g n\n")
  6096. XCS("attribute http://example.org/ attr2 n\n")
  6097. XCS("end http://example.org/ g n\n")
  6098. XCS("end http://example.org/ e n\n");
  6099. XML_SetReturnNSTriplet(g_parser, XML_TRUE);
  6100. run_ns_tagname_overwrite_test(text, result);
  6101. }
  6102. END_TEST
  6103. /* Regression test for SF bug #620343. */
  6104. static void XMLCALL
  6105. start_element_fail(void *userData, const XML_Char *name,
  6106. const XML_Char **atts) {
  6107. UNUSED_P(userData);
  6108. UNUSED_P(name);
  6109. UNUSED_P(atts);
  6110. /* We should never get here. */
  6111. fail("should never reach start_element_fail()");
  6112. }
  6113. static void XMLCALL
  6114. start_ns_clearing_start_element(void *userData, const XML_Char *prefix,
  6115. const XML_Char *uri) {
  6116. UNUSED_P(prefix);
  6117. UNUSED_P(uri);
  6118. XML_SetStartElementHandler((XML_Parser)userData, NULL);
  6119. }
  6120. START_TEST(test_start_ns_clears_start_element) {
  6121. /* This needs to use separate start/end tags; using the empty tag
  6122. syntax doesn't cause the problematic path through Expat to be
  6123. taken.
  6124. */
  6125. const char *text = "<e xmlns='http://example.org/'></e>";
  6126. XML_SetStartElementHandler(g_parser, start_element_fail);
  6127. XML_SetStartNamespaceDeclHandler(g_parser, start_ns_clearing_start_element);
  6128. XML_SetEndNamespaceDeclHandler(g_parser, dummy_end_namespace_decl_handler);
  6129. XML_UseParserAsHandlerArg(g_parser);
  6130. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  6131. == XML_STATUS_ERROR)
  6132. xml_failure(g_parser);
  6133. }
  6134. END_TEST
  6135. /* Regression test for SF bug #616863. */
  6136. static int XMLCALL
  6137. external_entity_handler(XML_Parser parser, const XML_Char *context,
  6138. const XML_Char *base, const XML_Char *systemId,
  6139. const XML_Char *publicId) {
  6140. intptr_t callno = 1 + (intptr_t)XML_GetUserData(parser);
  6141. const char *text;
  6142. XML_Parser p2;
  6143. UNUSED_P(base);
  6144. UNUSED_P(systemId);
  6145. UNUSED_P(publicId);
  6146. if (callno == 1)
  6147. text = ("<!ELEMENT doc (e+)>\n"
  6148. "<!ATTLIST doc xmlns CDATA #IMPLIED>\n"
  6149. "<!ELEMENT e EMPTY>\n");
  6150. else
  6151. text = ("<?xml version='1.0' encoding='us-ascii'?>"
  6152. "<e/>");
  6153. XML_SetUserData(parser, (void *)callno);
  6154. p2 = XML_ExternalEntityParserCreate(parser, context, NULL);
  6155. if (_XML_Parse_SINGLE_BYTES(p2, text, (int)strlen(text), XML_TRUE)
  6156. == XML_STATUS_ERROR) {
  6157. xml_failure(p2);
  6158. return XML_STATUS_ERROR;
  6159. }
  6160. XML_ParserFree(p2);
  6161. return XML_STATUS_OK;
  6162. }
  6163. START_TEST(test_default_ns_from_ext_subset_and_ext_ge) {
  6164. const char *text = "<?xml version='1.0'?>\n"
  6165. "<!DOCTYPE doc SYSTEM 'http://example.org/doc.dtd' [\n"
  6166. " <!ENTITY en SYSTEM 'http://example.org/entity.ent'>\n"
  6167. "]>\n"
  6168. "<doc xmlns='http://example.org/ns1'>\n"
  6169. "&en;\n"
  6170. "</doc>";
  6171. XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
  6172. XML_SetExternalEntityRefHandler(g_parser, external_entity_handler);
  6173. /* We actually need to set this handler to tickle this bug. */
  6174. XML_SetStartElementHandler(g_parser, dummy_start_element);
  6175. XML_SetUserData(g_parser, NULL);
  6176. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  6177. == XML_STATUS_ERROR)
  6178. xml_failure(g_parser);
  6179. }
  6180. END_TEST
  6181. /* Regression test #1 for SF bug #673791. */
  6182. START_TEST(test_ns_prefix_with_empty_uri_1) {
  6183. const char *text = "<doc xmlns:prefix='http://example.org/'>\n"
  6184. " <e xmlns:prefix=''/>\n"
  6185. "</doc>";
  6186. expect_failure(text, XML_ERROR_UNDECLARING_PREFIX,
  6187. "Did not report re-setting namespace"
  6188. " URI with prefix to ''.");
  6189. }
  6190. END_TEST
  6191. /* Regression test #2 for SF bug #673791. */
  6192. START_TEST(test_ns_prefix_with_empty_uri_2) {
  6193. const char *text = "<?xml version='1.0'?>\n"
  6194. "<docelem xmlns:pre=''/>";
  6195. expect_failure(text, XML_ERROR_UNDECLARING_PREFIX,
  6196. "Did not report setting namespace URI with prefix to ''.");
  6197. }
  6198. END_TEST
  6199. /* Regression test #3 for SF bug #673791. */
  6200. START_TEST(test_ns_prefix_with_empty_uri_3) {
  6201. const char *text = "<!DOCTYPE doc [\n"
  6202. " <!ELEMENT doc EMPTY>\n"
  6203. " <!ATTLIST doc\n"
  6204. " xmlns:prefix CDATA ''>\n"
  6205. "]>\n"
  6206. "<doc/>";
  6207. expect_failure(text, XML_ERROR_UNDECLARING_PREFIX,
  6208. "Didn't report attr default setting NS w/ prefix to ''.");
  6209. }
  6210. END_TEST
  6211. /* Regression test #4 for SF bug #673791. */
  6212. START_TEST(test_ns_prefix_with_empty_uri_4) {
  6213. const char *text = "<!DOCTYPE doc [\n"
  6214. " <!ELEMENT prefix:doc EMPTY>\n"
  6215. " <!ATTLIST prefix:doc\n"
  6216. " xmlns:prefix CDATA 'http://example.org/'>\n"
  6217. "]>\n"
  6218. "<prefix:doc/>";
  6219. /* Packaged info expected by the end element handler;
  6220. the weird structuring lets us re-use the triplet_end_checker()
  6221. function also used for another test. */
  6222. const XML_Char *elemstr[] = {XCS("http://example.org/ doc prefix")};
  6223. XML_SetReturnNSTriplet(g_parser, XML_TRUE);
  6224. XML_SetUserData(g_parser, (void *)elemstr);
  6225. XML_SetEndElementHandler(g_parser, triplet_end_checker);
  6226. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  6227. == XML_STATUS_ERROR)
  6228. xml_failure(g_parser);
  6229. }
  6230. END_TEST
  6231. /* Test with non-xmlns prefix */
  6232. START_TEST(test_ns_unbound_prefix) {
  6233. const char *text = "<!DOCTYPE doc [\n"
  6234. " <!ELEMENT prefix:doc EMPTY>\n"
  6235. " <!ATTLIST prefix:doc\n"
  6236. " notxmlns:prefix CDATA 'http://example.org/'>\n"
  6237. "]>\n"
  6238. "<prefix:doc/>";
  6239. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  6240. != XML_STATUS_ERROR)
  6241. fail("Unbound prefix incorrectly passed");
  6242. if (XML_GetErrorCode(g_parser) != XML_ERROR_UNBOUND_PREFIX)
  6243. xml_failure(g_parser);
  6244. }
  6245. END_TEST
  6246. START_TEST(test_ns_default_with_empty_uri) {
  6247. const char *text = "<doc xmlns='http://example.org/'>\n"
  6248. " <e xmlns=''/>\n"
  6249. "</doc>";
  6250. /* Add some handlers to exercise extra code paths */
  6251. XML_SetStartNamespaceDeclHandler(g_parser,
  6252. dummy_start_namespace_decl_handler);
  6253. XML_SetEndNamespaceDeclHandler(g_parser, dummy_end_namespace_decl_handler);
  6254. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  6255. == XML_STATUS_ERROR)
  6256. xml_failure(g_parser);
  6257. }
  6258. END_TEST
  6259. /* Regression test for SF bug #692964: two prefixes for one namespace. */
  6260. START_TEST(test_ns_duplicate_attrs_diff_prefixes) {
  6261. const char *text = "<doc xmlns:a='http://example.org/a'\n"
  6262. " xmlns:b='http://example.org/a'\n"
  6263. " a:a='v' b:a='v' />";
  6264. expect_failure(text, XML_ERROR_DUPLICATE_ATTRIBUTE,
  6265. "did not report multiple attributes with same URI+name");
  6266. }
  6267. END_TEST
  6268. START_TEST(test_ns_duplicate_hashes) {
  6269. /* The hash of an attribute is calculated as the hash of its URI
  6270. * concatenated with a space followed by its name (after the
  6271. * colon). We wish to generate attributes with the same hash
  6272. * value modulo the attribute table size so that we can check that
  6273. * the attribute hash table works correctly. The attribute hash
  6274. * table size will be the smallest power of two greater than the
  6275. * number of attributes, but at least eight. There is
  6276. * unfortunately no programmatic way of getting the hash or the
  6277. * table size at user level, but the test code coverage percentage
  6278. * will drop if the hashes cease to point to the same row.
  6279. *
  6280. * The cunning plan is to have few enough attributes to have a
  6281. * reliable table size of 8, and have the single letter attribute
  6282. * names be 8 characters apart, producing a hash which will be the
  6283. * same modulo 8.
  6284. */
  6285. const char *text = "<doc xmlns:a='http://example.org/a'\n"
  6286. " a:a='v' a:i='w' />";
  6287. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  6288. == XML_STATUS_ERROR)
  6289. xml_failure(g_parser);
  6290. }
  6291. END_TEST
  6292. /* Regression test for SF bug #695401: unbound prefix. */
  6293. START_TEST(test_ns_unbound_prefix_on_attribute) {
  6294. const char *text = "<doc a:attr=''/>";
  6295. expect_failure(text, XML_ERROR_UNBOUND_PREFIX,
  6296. "did not report unbound prefix on attribute");
  6297. }
  6298. END_TEST
  6299. /* Regression test for SF bug #695401: unbound prefix. */
  6300. START_TEST(test_ns_unbound_prefix_on_element) {
  6301. const char *text = "<a:doc/>";
  6302. expect_failure(text, XML_ERROR_UNBOUND_PREFIX,
  6303. "did not report unbound prefix on element");
  6304. }
  6305. END_TEST
  6306. /* Test that the parsing status is correctly reset by XML_ParserReset().
  6307. * We usE test_return_ns_triplet() for our example parse to improve
  6308. * coverage of tidying up code executed.
  6309. */
  6310. START_TEST(test_ns_parser_reset) {
  6311. XML_ParsingStatus status;
  6312. XML_GetParsingStatus(g_parser, &status);
  6313. if (status.parsing != XML_INITIALIZED)
  6314. fail("parsing status doesn't start INITIALIZED");
  6315. test_return_ns_triplet();
  6316. XML_GetParsingStatus(g_parser, &status);
  6317. if (status.parsing != XML_FINISHED)
  6318. fail("parsing status doesn't end FINISHED");
  6319. XML_ParserReset(g_parser, NULL);
  6320. XML_GetParsingStatus(g_parser, &status);
  6321. if (status.parsing != XML_INITIALIZED)
  6322. fail("parsing status doesn't reset to INITIALIZED");
  6323. }
  6324. END_TEST
  6325. /* Test that long element names with namespaces are handled correctly */
  6326. START_TEST(test_ns_long_element) {
  6327. const char *text
  6328. = "<foo:thisisalongenoughelementnametotriggerareallocation\n"
  6329. " xmlns:foo='http://example.org/' bar:a='12'\n"
  6330. " xmlns:bar='http://example.org/'>"
  6331. "</foo:thisisalongenoughelementnametotriggerareallocation>";
  6332. const XML_Char *elemstr[]
  6333. = {XCS("http://example.org/")
  6334. XCS(" thisisalongenoughelementnametotriggerareallocation foo"),
  6335. XCS("http://example.org/ a bar")};
  6336. XML_SetReturnNSTriplet(g_parser, XML_TRUE);
  6337. XML_SetUserData(g_parser, (void *)elemstr);
  6338. XML_SetElementHandler(g_parser, triplet_start_checker, triplet_end_checker);
  6339. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  6340. == XML_STATUS_ERROR)
  6341. xml_failure(g_parser);
  6342. }
  6343. END_TEST
  6344. /* Test mixed population of prefixed and unprefixed attributes */
  6345. START_TEST(test_ns_mixed_prefix_atts) {
  6346. const char *text = "<e a='12' bar:b='13'\n"
  6347. " xmlns:bar='http://example.org/'>"
  6348. "</e>";
  6349. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  6350. == XML_STATUS_ERROR)
  6351. xml_failure(g_parser);
  6352. }
  6353. END_TEST
  6354. /* Test having a long namespaced element name inside a short one.
  6355. * This exercises some internal buffer reallocation that is shared
  6356. * across elements with the same namespace URI.
  6357. */
  6358. START_TEST(test_ns_extend_uri_buffer) {
  6359. const char *text = "<foo:e xmlns:foo='http://example.org/'>"
  6360. " <foo:thisisalongenoughnametotriggerallocationaction"
  6361. " foo:a='12' />"
  6362. "</foo:e>";
  6363. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  6364. == XML_STATUS_ERROR)
  6365. xml_failure(g_parser);
  6366. }
  6367. END_TEST
  6368. /* Test that xmlns is correctly rejected as an attribute in the xmlns
  6369. * namespace, but not in other namespaces
  6370. */
  6371. START_TEST(test_ns_reserved_attributes) {
  6372. const char *text1
  6373. = "<foo:e xmlns:foo='http://example.org/' xmlns:xmlns='12' />";
  6374. const char *text2
  6375. = "<foo:e xmlns:foo='http://example.org/' foo:xmlns='12' />";
  6376. expect_failure(text1, XML_ERROR_RESERVED_PREFIX_XMLNS,
  6377. "xmlns not rejected as an attribute");
  6378. XML_ParserReset(g_parser, NULL);
  6379. if (_XML_Parse_SINGLE_BYTES(g_parser, text2, (int)strlen(text2), XML_TRUE)
  6380. == XML_STATUS_ERROR)
  6381. xml_failure(g_parser);
  6382. }
  6383. END_TEST
  6384. /* Test more reserved attributes */
  6385. START_TEST(test_ns_reserved_attributes_2) {
  6386. const char *text1 = "<foo:e xmlns:foo='http://example.org/'"
  6387. " xmlns:xml='http://example.org/' />";
  6388. const char *text2
  6389. = "<foo:e xmlns:foo='http://www.w3.org/XML/1998/namespace' />";
  6390. const char *text3 = "<foo:e xmlns:foo='http://www.w3.org/2000/xmlns/' />";
  6391. expect_failure(text1, XML_ERROR_RESERVED_PREFIX_XML,
  6392. "xml not rejected as an attribute");
  6393. XML_ParserReset(g_parser, NULL);
  6394. expect_failure(text2, XML_ERROR_RESERVED_NAMESPACE_URI,
  6395. "Use of w3.org URL not faulted");
  6396. XML_ParserReset(g_parser, NULL);
  6397. expect_failure(text3, XML_ERROR_RESERVED_NAMESPACE_URI,
  6398. "Use of w3.org xmlns URL not faulted");
  6399. }
  6400. END_TEST
  6401. /* Test string pool handling of namespace names of 2048 characters */
  6402. /* Exercises a particular string pool growth path */
  6403. START_TEST(test_ns_extremely_long_prefix) {
  6404. /* C99 compilers are only required to support 4095-character
  6405. * strings, so the following needs to be split in two to be safe
  6406. * for all compilers.
  6407. */
  6408. const char *text1
  6409. = "<doc "
  6410. /* 64 character on each line */
  6411. /* ...gives a total length of 2048 */
  6412. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  6413. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  6414. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  6415. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  6416. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  6417. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  6418. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  6419. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  6420. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  6421. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  6422. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  6423. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  6424. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  6425. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  6426. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  6427. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  6428. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  6429. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  6430. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  6431. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  6432. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  6433. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  6434. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  6435. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  6436. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  6437. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  6438. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  6439. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  6440. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  6441. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  6442. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  6443. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  6444. ":a='12'";
  6445. const char *text2
  6446. = " xmlns:"
  6447. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  6448. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  6449. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  6450. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  6451. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  6452. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  6453. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  6454. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  6455. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  6456. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  6457. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  6458. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  6459. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  6460. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  6461. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  6462. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  6463. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  6464. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  6465. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  6466. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  6467. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  6468. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  6469. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  6470. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  6471. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  6472. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  6473. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  6474. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  6475. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  6476. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  6477. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  6478. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  6479. "='foo'\n>"
  6480. "</doc>";
  6481. if (_XML_Parse_SINGLE_BYTES(g_parser, text1, (int)strlen(text1), XML_FALSE)
  6482. == XML_STATUS_ERROR)
  6483. xml_failure(g_parser);
  6484. if (_XML_Parse_SINGLE_BYTES(g_parser, text2, (int)strlen(text2), XML_TRUE)
  6485. == XML_STATUS_ERROR)
  6486. xml_failure(g_parser);
  6487. }
  6488. END_TEST
  6489. /* Test unknown encoding handlers in namespace setup */
  6490. START_TEST(test_ns_unknown_encoding_success) {
  6491. const char *text = "<?xml version='1.0' encoding='prefix-conv'?>\n"
  6492. "<foo:e xmlns:foo='http://example.org/'>Hi</foo:e>";
  6493. XML_SetUnknownEncodingHandler(g_parser, MiscEncodingHandler, NULL);
  6494. run_character_check(text, XCS("Hi"));
  6495. }
  6496. END_TEST
  6497. /* Test that too many colons are rejected */
  6498. START_TEST(test_ns_double_colon) {
  6499. const char *text = "<foo:e xmlns:foo='http://example.org/' foo:a:b='bar' />";
  6500. const enum XML_Status status
  6501. = _XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE);
  6502. #ifdef XML_NS
  6503. if ((status == XML_STATUS_OK)
  6504. || (XML_GetErrorCode(g_parser) != XML_ERROR_INVALID_TOKEN)) {
  6505. fail("Double colon in attribute name not faulted"
  6506. " (despite active namespace support)");
  6507. }
  6508. #else
  6509. if (status != XML_STATUS_OK) {
  6510. fail("Double colon in attribute name faulted"
  6511. " (despite inactive namespace support");
  6512. }
  6513. #endif
  6514. }
  6515. END_TEST
  6516. START_TEST(test_ns_double_colon_element) {
  6517. const char *text = "<foo:bar:e xmlns:foo='http://example.org/' />";
  6518. const enum XML_Status status
  6519. = _XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE);
  6520. #ifdef XML_NS
  6521. if ((status == XML_STATUS_OK)
  6522. || (XML_GetErrorCode(g_parser) != XML_ERROR_INVALID_TOKEN)) {
  6523. fail("Double colon in element name not faulted"
  6524. " (despite active namespace support)");
  6525. }
  6526. #else
  6527. if (status != XML_STATUS_OK) {
  6528. fail("Double colon in element name faulted"
  6529. " (despite inactive namespace support");
  6530. }
  6531. #endif
  6532. }
  6533. END_TEST
  6534. /* Test that non-name characters after a colon are rejected */
  6535. START_TEST(test_ns_bad_attr_leafname) {
  6536. const char *text = "<foo:e xmlns:foo='http://example.org/' foo:?ar='baz' />";
  6537. expect_failure(text, XML_ERROR_INVALID_TOKEN,
  6538. "Invalid character in leafname not faulted");
  6539. }
  6540. END_TEST
  6541. START_TEST(test_ns_bad_element_leafname) {
  6542. const char *text = "<foo:?oc xmlns:foo='http://example.org/' />";
  6543. expect_failure(text, XML_ERROR_INVALID_TOKEN,
  6544. "Invalid character in element leafname not faulted");
  6545. }
  6546. END_TEST
  6547. /* Test high-byte-set UTF-16 characters are valid in a leafname */
  6548. START_TEST(test_ns_utf16_leafname) {
  6549. const char text[] =
  6550. /* <n:e xmlns:n='URI' n:{KHO KHWAI}='a' />
  6551. * where {KHO KHWAI} = U+0E04 = 0xe0 0xb8 0x84 in UTF-8
  6552. */
  6553. "<\0n\0:\0e\0 \0x\0m\0l\0n\0s\0:\0n\0=\0'\0U\0R\0I\0'\0 \0"
  6554. "n\0:\0\x04\x0e=\0'\0a\0'\0 \0/\0>\0";
  6555. const XML_Char *expected = XCS("a");
  6556. CharData storage;
  6557. CharData_Init(&storage);
  6558. XML_SetStartElementHandler(g_parser, accumulate_attribute);
  6559. XML_SetUserData(g_parser, &storage);
  6560. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)sizeof(text) - 1, XML_TRUE)
  6561. == XML_STATUS_ERROR)
  6562. xml_failure(g_parser);
  6563. CharData_CheckXMLChars(&storage, expected);
  6564. }
  6565. END_TEST
  6566. START_TEST(test_ns_utf16_element_leafname) {
  6567. const char text[] =
  6568. /* <n:{KHO KHWAI} xmlns:n='URI'/>
  6569. * where {KHO KHWAI} = U+0E04 = 0xe0 0xb8 0x84 in UTF-8
  6570. */
  6571. "\0<\0n\0:\x0e\x04\0 \0x\0m\0l\0n\0s\0:\0n\0=\0'\0U\0R\0I\0'\0/\0>";
  6572. #ifdef XML_UNICODE
  6573. const XML_Char *expected = XCS("URI \x0e04");
  6574. #else
  6575. const XML_Char *expected = XCS("URI \xe0\xb8\x84");
  6576. #endif
  6577. CharData storage;
  6578. CharData_Init(&storage);
  6579. XML_SetStartElementHandler(g_parser, start_element_event_handler);
  6580. XML_SetUserData(g_parser, &storage);
  6581. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)sizeof(text) - 1, XML_TRUE)
  6582. == XML_STATUS_ERROR)
  6583. xml_failure(g_parser);
  6584. CharData_CheckXMLChars(&storage, expected);
  6585. }
  6586. END_TEST
  6587. START_TEST(test_ns_utf16_doctype) {
  6588. const char text[] =
  6589. /* <!DOCTYPE foo:{KHO KHWAI} [ <!ENTITY bar 'baz'> ]>\n
  6590. * where {KHO KHWAI} = U+0E04 = 0xe0 0xb8 0x84 in UTF-8
  6591. */
  6592. "\0<\0!\0D\0O\0C\0T\0Y\0P\0E\0 \0f\0o\0o\0:\x0e\x04\0 "
  6593. "\0[\0 \0<\0!\0E\0N\0T\0I\0T\0Y\0 \0b\0a\0r\0 \0'\0b\0a\0z\0'\0>\0 "
  6594. "\0]\0>\0\n"
  6595. /* <foo:{KHO KHWAI} xmlns:foo='URI'>&bar;</foo:{KHO KHWAI}> */
  6596. "\0<\0f\0o\0o\0:\x0e\x04\0 "
  6597. "\0x\0m\0l\0n\0s\0:\0f\0o\0o\0=\0'\0U\0R\0I\0'\0>"
  6598. "\0&\0b\0a\0r\0;"
  6599. "\0<\0/\0f\0o\0o\0:\x0e\x04\0>";
  6600. #ifdef XML_UNICODE
  6601. const XML_Char *expected = XCS("URI \x0e04");
  6602. #else
  6603. const XML_Char *expected = XCS("URI \xe0\xb8\x84");
  6604. #endif
  6605. CharData storage;
  6606. CharData_Init(&storage);
  6607. XML_SetUserData(g_parser, &storage);
  6608. XML_SetStartElementHandler(g_parser, start_element_event_handler);
  6609. XML_SetUnknownEncodingHandler(g_parser, MiscEncodingHandler, NULL);
  6610. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)sizeof(text) - 1, XML_TRUE)
  6611. == XML_STATUS_ERROR)
  6612. xml_failure(g_parser);
  6613. CharData_CheckXMLChars(&storage, expected);
  6614. }
  6615. END_TEST
  6616. START_TEST(test_ns_invalid_doctype) {
  6617. const char *text = "<!DOCTYPE foo:!bad [ <!ENTITY bar 'baz' ]>\n"
  6618. "<foo:!bad>&bar;</foo:!bad>";
  6619. expect_failure(text, XML_ERROR_INVALID_TOKEN,
  6620. "Invalid character in document local name not faulted");
  6621. }
  6622. END_TEST
  6623. START_TEST(test_ns_double_colon_doctype) {
  6624. const char *text = "<!DOCTYPE foo:a:doc [ <!ENTITY bar 'baz' ]>\n"
  6625. "<foo:a:doc>&bar;</foo:a:doc>";
  6626. expect_failure(text, XML_ERROR_SYNTAX,
  6627. "Double colon in document name not faulted");
  6628. }
  6629. END_TEST
  6630. START_TEST(test_ns_separator_in_uri) {
  6631. struct test_case {
  6632. enum XML_Status expectedStatus;
  6633. const char *doc;
  6634. };
  6635. struct test_case cases[] = {
  6636. {XML_STATUS_OK, "<doc xmlns='one_two' />"},
  6637. {XML_STATUS_ERROR, "<doc xmlns='one&#x0A;two' />"},
  6638. };
  6639. size_t i = 0;
  6640. size_t failCount = 0;
  6641. for (; i < sizeof(cases) / sizeof(cases[0]); i++) {
  6642. XML_Parser parser = XML_ParserCreateNS(NULL, '\n');
  6643. XML_SetElementHandler(parser, dummy_start_element, dummy_end_element);
  6644. if (XML_Parse(parser, cases[i].doc, (int)strlen(cases[i].doc),
  6645. /*isFinal*/ XML_TRUE)
  6646. != cases[i].expectedStatus) {
  6647. failCount++;
  6648. }
  6649. XML_ParserFree(parser);
  6650. }
  6651. if (failCount) {
  6652. fail("Namespace separator handling is broken");
  6653. }
  6654. }
  6655. END_TEST
  6656. /* Control variable; the number of times duff_allocator() will successfully
  6657. * allocate */
  6658. #define ALLOC_ALWAYS_SUCCEED (-1)
  6659. #define REALLOC_ALWAYS_SUCCEED (-1)
  6660. static intptr_t allocation_count = ALLOC_ALWAYS_SUCCEED;
  6661. static intptr_t reallocation_count = REALLOC_ALWAYS_SUCCEED;
  6662. /* Crocked allocator for allocation failure tests */
  6663. static void *
  6664. duff_allocator(size_t size) {
  6665. if (allocation_count == 0)
  6666. return NULL;
  6667. if (allocation_count != ALLOC_ALWAYS_SUCCEED)
  6668. allocation_count--;
  6669. return malloc(size);
  6670. }
  6671. /* Crocked reallocator for allocation failure tests */
  6672. static void *
  6673. duff_reallocator(void *ptr, size_t size) {
  6674. if (reallocation_count == 0)
  6675. return NULL;
  6676. if (reallocation_count != REALLOC_ALWAYS_SUCCEED)
  6677. reallocation_count--;
  6678. return realloc(ptr, size);
  6679. }
  6680. /* Test that a failure to allocate the parser structure fails gracefully */
  6681. START_TEST(test_misc_alloc_create_parser) {
  6682. XML_Memory_Handling_Suite memsuite = {duff_allocator, realloc, free};
  6683. unsigned int i;
  6684. const unsigned int max_alloc_count = 10;
  6685. /* Something this simple shouldn't need more than 10 allocations */
  6686. for (i = 0; i < max_alloc_count; i++) {
  6687. allocation_count = i;
  6688. g_parser = XML_ParserCreate_MM(NULL, &memsuite, NULL);
  6689. if (g_parser != NULL)
  6690. break;
  6691. }
  6692. if (i == 0)
  6693. fail("Parser unexpectedly ignored failing allocator");
  6694. else if (i == max_alloc_count)
  6695. fail("Parser not created with max allocation count");
  6696. }
  6697. END_TEST
  6698. /* Test memory allocation failures for a parser with an encoding */
  6699. START_TEST(test_misc_alloc_create_parser_with_encoding) {
  6700. XML_Memory_Handling_Suite memsuite = {duff_allocator, realloc, free};
  6701. unsigned int i;
  6702. const unsigned int max_alloc_count = 10;
  6703. /* Try several levels of allocation */
  6704. for (i = 0; i < max_alloc_count; i++) {
  6705. allocation_count = i;
  6706. g_parser = XML_ParserCreate_MM(XCS("us-ascii"), &memsuite, NULL);
  6707. if (g_parser != NULL)
  6708. break;
  6709. }
  6710. if (i == 0)
  6711. fail("Parser ignored failing allocator");
  6712. else if (i == max_alloc_count)
  6713. fail("Parser not created with max allocation count");
  6714. }
  6715. END_TEST
  6716. /* Test that freeing a NULL parser doesn't cause an explosion.
  6717. * (Not actually tested anywhere else)
  6718. */
  6719. START_TEST(test_misc_null_parser) {
  6720. XML_ParserFree(NULL);
  6721. }
  6722. END_TEST
  6723. /* Test that XML_ErrorString rejects out-of-range codes */
  6724. START_TEST(test_misc_error_string) {
  6725. if (XML_ErrorString((enum XML_Error) - 1) != NULL)
  6726. fail("Negative error code not rejected");
  6727. if (XML_ErrorString((enum XML_Error)100) != NULL)
  6728. fail("Large error code not rejected");
  6729. }
  6730. END_TEST
  6731. /* Test the version information is consistent */
  6732. /* Since we are working in XML_LChars (potentially 16-bits), we
  6733. * can't use the standard C library functions for character
  6734. * manipulation and have to roll our own.
  6735. */
  6736. static int
  6737. parse_version(const XML_LChar *version_text,
  6738. XML_Expat_Version *version_struct) {
  6739. if (! version_text)
  6740. return XML_FALSE;
  6741. while (*version_text != 0x00) {
  6742. if (*version_text >= ASCII_0 && *version_text <= ASCII_9)
  6743. break;
  6744. version_text++;
  6745. }
  6746. if (*version_text == 0x00)
  6747. return XML_FALSE;
  6748. /* version_struct->major = strtoul(version_text, 10, &version_text) */
  6749. version_struct->major = 0;
  6750. while (*version_text >= ASCII_0 && *version_text <= ASCII_9) {
  6751. version_struct->major
  6752. = 10 * version_struct->major + (*version_text++ - ASCII_0);
  6753. }
  6754. if (*version_text++ != ASCII_PERIOD)
  6755. return XML_FALSE;
  6756. /* Now for the minor version number */
  6757. version_struct->minor = 0;
  6758. while (*version_text >= ASCII_0 && *version_text <= ASCII_9) {
  6759. version_struct->minor
  6760. = 10 * version_struct->minor + (*version_text++ - ASCII_0);
  6761. }
  6762. if (*version_text++ != ASCII_PERIOD)
  6763. return XML_FALSE;
  6764. /* Finally the micro version number */
  6765. version_struct->micro = 0;
  6766. while (*version_text >= ASCII_0 && *version_text <= ASCII_9) {
  6767. version_struct->micro
  6768. = 10 * version_struct->micro + (*version_text++ - ASCII_0);
  6769. }
  6770. if (*version_text != 0x00)
  6771. return XML_FALSE;
  6772. return XML_TRUE;
  6773. }
  6774. static int
  6775. versions_equal(const XML_Expat_Version *first,
  6776. const XML_Expat_Version *second) {
  6777. return (first->major == second->major && first->minor == second->minor
  6778. && first->micro == second->micro);
  6779. }
  6780. START_TEST(test_misc_version) {
  6781. XML_Expat_Version read_version = XML_ExpatVersionInfo();
  6782. /* Silence compiler warning with the following assignment */
  6783. XML_Expat_Version parsed_version = {0, 0, 0};
  6784. const XML_LChar *version_text = XML_ExpatVersion();
  6785. if (version_text == NULL)
  6786. fail("Could not obtain version text");
  6787. assert(version_text != NULL);
  6788. if (! parse_version(version_text, &parsed_version))
  6789. fail("Unable to parse version text");
  6790. if (! versions_equal(&read_version, &parsed_version))
  6791. fail("Version mismatch");
  6792. #if ! defined(XML_UNICODE) || defined(XML_UNICODE_WCHAR_T)
  6793. if (xcstrcmp(version_text, XCS("expat_2.4.6"))) /* needs bump on releases */
  6794. fail("XML_*_VERSION in expat.h out of sync?\n");
  6795. #else
  6796. /* If we have XML_UNICODE defined but not XML_UNICODE_WCHAR_T
  6797. * then XML_LChar is defined as char, for some reason.
  6798. */
  6799. if (strcmp(version_text, "expat_2.2.5")) /* needs bump on releases */
  6800. fail("XML_*_VERSION in expat.h out of sync?\n");
  6801. #endif /* ! defined(XML_UNICODE) || defined(XML_UNICODE_WCHAR_T) */
  6802. }
  6803. END_TEST
  6804. /* Test feature information */
  6805. START_TEST(test_misc_features) {
  6806. const XML_Feature *features = XML_GetFeatureList();
  6807. /* Prevent problems with double-freeing parsers */
  6808. g_parser = NULL;
  6809. if (features == NULL) {
  6810. fail("Failed to get feature information");
  6811. } else {
  6812. /* Loop through the features checking what we can */
  6813. while (features->feature != XML_FEATURE_END) {
  6814. switch (features->feature) {
  6815. case XML_FEATURE_SIZEOF_XML_CHAR:
  6816. if (features->value != sizeof(XML_Char))
  6817. fail("Incorrect size of XML_Char");
  6818. break;
  6819. case XML_FEATURE_SIZEOF_XML_LCHAR:
  6820. if (features->value != sizeof(XML_LChar))
  6821. fail("Incorrect size of XML_LChar");
  6822. break;
  6823. default:
  6824. break;
  6825. }
  6826. features++;
  6827. }
  6828. }
  6829. }
  6830. END_TEST
  6831. /* Regression test for GitHub Issue #17: memory leak parsing attribute
  6832. * values with mixed bound and unbound namespaces.
  6833. */
  6834. START_TEST(test_misc_attribute_leak) {
  6835. const char *text = "<D xmlns:L=\"D\" l:a='' L:a=''/>";
  6836. XML_Memory_Handling_Suite memsuite
  6837. = {tracking_malloc, tracking_realloc, tracking_free};
  6838. g_parser = XML_ParserCreate_MM(XCS("UTF-8"), &memsuite, XCS("\n"));
  6839. expect_failure(text, XML_ERROR_UNBOUND_PREFIX, "Unbound prefixes not found");
  6840. XML_ParserFree(g_parser);
  6841. /* Prevent the teardown trying to double free */
  6842. g_parser = NULL;
  6843. if (! tracking_report())
  6844. fail("Memory leak found");
  6845. }
  6846. END_TEST
  6847. /* Test parser created for UTF-16LE is successful */
  6848. START_TEST(test_misc_utf16le) {
  6849. const char text[] =
  6850. /* <?xml version='1.0'?><q>Hi</q> */
  6851. "<\0?\0x\0m\0l\0 \0"
  6852. "v\0e\0r\0s\0i\0o\0n\0=\0'\0\x31\0.\0\x30\0'\0?\0>\0"
  6853. "<\0q\0>\0H\0i\0<\0/\0q\0>\0";
  6854. const XML_Char *expected = XCS("Hi");
  6855. CharData storage;
  6856. g_parser = XML_ParserCreate(XCS("UTF-16LE"));
  6857. if (g_parser == NULL)
  6858. fail("Parser not created");
  6859. CharData_Init(&storage);
  6860. XML_SetUserData(g_parser, &storage);
  6861. XML_SetCharacterDataHandler(g_parser, accumulate_characters);
  6862. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)sizeof(text) - 1, XML_TRUE)
  6863. == XML_STATUS_ERROR)
  6864. xml_failure(g_parser);
  6865. CharData_CheckXMLChars(&storage, expected);
  6866. }
  6867. END_TEST
  6868. typedef struct {
  6869. XML_Parser parser;
  6870. int deep;
  6871. } DataIssue240;
  6872. static void
  6873. start_element_issue_240(void *userData, const XML_Char *name,
  6874. const XML_Char **atts) {
  6875. DataIssue240 *mydata = (DataIssue240 *)userData;
  6876. UNUSED_P(name);
  6877. UNUSED_P(atts);
  6878. mydata->deep++;
  6879. }
  6880. static void
  6881. end_element_issue_240(void *userData, const XML_Char *name) {
  6882. DataIssue240 *mydata = (DataIssue240 *)userData;
  6883. UNUSED_P(name);
  6884. mydata->deep--;
  6885. if (mydata->deep == 0) {
  6886. XML_StopParser(mydata->parser, 0);
  6887. }
  6888. }
  6889. START_TEST(test_misc_stop_during_end_handler_issue_240_1) {
  6890. XML_Parser parser;
  6891. DataIssue240 *mydata;
  6892. enum XML_Status result;
  6893. const char *const doc1 = "<doc><e1/><e><foo/></e></doc>";
  6894. parser = XML_ParserCreate(NULL);
  6895. XML_SetElementHandler(parser, start_element_issue_240, end_element_issue_240);
  6896. mydata = (DataIssue240 *)malloc(sizeof(DataIssue240));
  6897. mydata->parser = parser;
  6898. mydata->deep = 0;
  6899. XML_SetUserData(parser, mydata);
  6900. result = XML_Parse(parser, doc1, (int)strlen(doc1), 1);
  6901. XML_ParserFree(parser);
  6902. free(mydata);
  6903. if (result != XML_STATUS_ERROR)
  6904. fail("Stopping the parser did not work as expected");
  6905. }
  6906. END_TEST
  6907. START_TEST(test_misc_stop_during_end_handler_issue_240_2) {
  6908. XML_Parser parser;
  6909. DataIssue240 *mydata;
  6910. enum XML_Status result;
  6911. const char *const doc2 = "<doc><elem/></doc>";
  6912. parser = XML_ParserCreate(NULL);
  6913. XML_SetElementHandler(parser, start_element_issue_240, end_element_issue_240);
  6914. mydata = (DataIssue240 *)malloc(sizeof(DataIssue240));
  6915. mydata->parser = parser;
  6916. mydata->deep = 0;
  6917. XML_SetUserData(parser, mydata);
  6918. result = XML_Parse(parser, doc2, (int)strlen(doc2), 1);
  6919. XML_ParserFree(parser);
  6920. free(mydata);
  6921. if (result != XML_STATUS_ERROR)
  6922. fail("Stopping the parser did not work as expected");
  6923. }
  6924. END_TEST
  6925. START_TEST(test_misc_deny_internal_entity_closing_doctype_issue_317) {
  6926. const char *const inputOne = "<!DOCTYPE d [\n"
  6927. "<!ENTITY % e ']><d/>'>\n"
  6928. "\n"
  6929. "%e;";
  6930. const char *const inputTwo = "<!DOCTYPE d [\n"
  6931. "<!ENTITY % e1 ']><d/>'><!ENTITY % e2 '&e1;'>\n"
  6932. "\n"
  6933. "%e2;";
  6934. const char *const inputThree = "<!DOCTYPE d [\n"
  6935. "<!ENTITY % e ']><d'>\n"
  6936. "\n"
  6937. "%e;";
  6938. const char *const inputIssue317 = "<!DOCTYPE doc [\n"
  6939. "<!ENTITY % foo ']>\n"
  6940. "<doc>Hell<oc (#PCDATA)*>'>\n"
  6941. "%foo;\n"
  6942. "]>\n"
  6943. "<doc>Hello, world</dVc>";
  6944. const char *const inputs[] = {inputOne, inputTwo, inputThree, inputIssue317};
  6945. size_t inputIndex = 0;
  6946. for (; inputIndex < sizeof(inputs) / sizeof(inputs[0]); inputIndex++) {
  6947. XML_Parser parser;
  6948. enum XML_Status parseResult;
  6949. int setParamEntityResult;
  6950. XML_Size lineNumber;
  6951. XML_Size columnNumber;
  6952. const char *const input = inputs[inputIndex];
  6953. parser = XML_ParserCreate(NULL);
  6954. setParamEntityResult
  6955. = XML_SetParamEntityParsing(parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
  6956. if (setParamEntityResult != 1)
  6957. fail("Failed to set XML_PARAM_ENTITY_PARSING_ALWAYS.");
  6958. parseResult = XML_Parse(parser, input, (int)strlen(input), 0);
  6959. if (parseResult != XML_STATUS_ERROR) {
  6960. parseResult = XML_Parse(parser, "", 0, 1);
  6961. if (parseResult != XML_STATUS_ERROR) {
  6962. fail("Parsing was expected to fail but succeeded.");
  6963. }
  6964. }
  6965. if (XML_GetErrorCode(parser) != XML_ERROR_INVALID_TOKEN)
  6966. fail("Error code does not match XML_ERROR_INVALID_TOKEN");
  6967. lineNumber = XML_GetCurrentLineNumber(parser);
  6968. if (lineNumber != 4)
  6969. fail("XML_GetCurrentLineNumber does not work as expected.");
  6970. columnNumber = XML_GetCurrentColumnNumber(parser);
  6971. if (columnNumber != 0)
  6972. fail("XML_GetCurrentColumnNumber does not work as expected.");
  6973. XML_ParserFree(parser);
  6974. }
  6975. }
  6976. END_TEST
  6977. static void
  6978. alloc_setup(void) {
  6979. XML_Memory_Handling_Suite memsuite = {duff_allocator, duff_reallocator, free};
  6980. /* Ensure the parser creation will go through */
  6981. allocation_count = ALLOC_ALWAYS_SUCCEED;
  6982. reallocation_count = REALLOC_ALWAYS_SUCCEED;
  6983. g_parser = XML_ParserCreate_MM(NULL, &memsuite, NULL);
  6984. if (g_parser == NULL)
  6985. fail("Parser not created");
  6986. }
  6987. static void
  6988. alloc_teardown(void) {
  6989. basic_teardown();
  6990. }
  6991. /* Test the effects of allocation failures on xml declaration processing */
  6992. START_TEST(test_alloc_parse_xdecl) {
  6993. const char *text = "<?xml version='1.0' encoding='utf-8'?>\n"
  6994. "<doc>Hello, world</doc>";
  6995. int i;
  6996. const int max_alloc_count = 15;
  6997. for (i = 0; i < max_alloc_count; i++) {
  6998. allocation_count = i;
  6999. XML_SetXmlDeclHandler(g_parser, dummy_xdecl_handler);
  7000. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  7001. != XML_STATUS_ERROR)
  7002. break;
  7003. /* Resetting the parser is insufficient, because some memory
  7004. * allocations are cached within the parser. Instead we use
  7005. * the teardown and setup routines to ensure that we have the
  7006. * right sort of parser back in our hands.
  7007. */
  7008. alloc_teardown();
  7009. alloc_setup();
  7010. }
  7011. if (i == 0)
  7012. fail("Parse succeeded despite failing allocator");
  7013. if (i == max_alloc_count)
  7014. fail("Parse failed with max allocations");
  7015. }
  7016. END_TEST
  7017. /* As above, but with an encoding big enough to cause storing the
  7018. * version information to expand the string pool being used.
  7019. */
  7020. static int XMLCALL
  7021. long_encoding_handler(void *userData, const XML_Char *encoding,
  7022. XML_Encoding *info) {
  7023. int i;
  7024. UNUSED_P(userData);
  7025. UNUSED_P(encoding);
  7026. for (i = 0; i < 256; i++)
  7027. info->map[i] = i;
  7028. info->data = NULL;
  7029. info->convert = NULL;
  7030. info->release = NULL;
  7031. return XML_STATUS_OK;
  7032. }
  7033. START_TEST(test_alloc_parse_xdecl_2) {
  7034. const char *text
  7035. = "<?xml version='1.0' encoding='"
  7036. /* Each line is 64 characters */
  7037. "ThisIsAStupidlyLongEncodingNameIntendedToTriggerPoolGrowth123456"
  7038. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  7039. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  7040. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  7041. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  7042. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  7043. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  7044. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  7045. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  7046. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  7047. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  7048. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  7049. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  7050. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  7051. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  7052. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMN"
  7053. "'?>"
  7054. "<doc>Hello, world</doc>";
  7055. int i;
  7056. const int max_alloc_count = 20;
  7057. for (i = 0; i < max_alloc_count; i++) {
  7058. allocation_count = i;
  7059. XML_SetXmlDeclHandler(g_parser, dummy_xdecl_handler);
  7060. XML_SetUnknownEncodingHandler(g_parser, long_encoding_handler, NULL);
  7061. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  7062. != XML_STATUS_ERROR)
  7063. break;
  7064. /* See comment in test_alloc_parse_xdecl() */
  7065. alloc_teardown();
  7066. alloc_setup();
  7067. }
  7068. if (i == 0)
  7069. fail("Parse succeeded despite failing allocator");
  7070. if (i == max_alloc_count)
  7071. fail("Parse failed with max allocations");
  7072. }
  7073. END_TEST
  7074. /* Test the effects of allocation failures on a straightforward parse */
  7075. START_TEST(test_alloc_parse_pi) {
  7076. const char *text = "<?xml version='1.0' encoding='utf-8'?>\n"
  7077. "<?pi unknown?>\n"
  7078. "<doc>"
  7079. "Hello, world"
  7080. "</doc>";
  7081. int i;
  7082. const int max_alloc_count = 15;
  7083. for (i = 0; i < max_alloc_count; i++) {
  7084. allocation_count = i;
  7085. XML_SetProcessingInstructionHandler(g_parser, dummy_pi_handler);
  7086. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  7087. != XML_STATUS_ERROR)
  7088. break;
  7089. /* See comment in test_alloc_parse_xdecl() */
  7090. alloc_teardown();
  7091. alloc_setup();
  7092. }
  7093. if (i == 0)
  7094. fail("Parse succeeded despite failing allocator");
  7095. if (i == max_alloc_count)
  7096. fail("Parse failed with max allocations");
  7097. }
  7098. END_TEST
  7099. START_TEST(test_alloc_parse_pi_2) {
  7100. const char *text = "<?xml version='1.0' encoding='utf-8'?>\n"
  7101. "<doc>"
  7102. "Hello, world"
  7103. "<?pi unknown?>\n"
  7104. "</doc>";
  7105. int i;
  7106. const int max_alloc_count = 15;
  7107. for (i = 0; i < max_alloc_count; i++) {
  7108. allocation_count = i;
  7109. XML_SetProcessingInstructionHandler(g_parser, dummy_pi_handler);
  7110. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  7111. != XML_STATUS_ERROR)
  7112. break;
  7113. /* See comment in test_alloc_parse_xdecl() */
  7114. alloc_teardown();
  7115. alloc_setup();
  7116. }
  7117. if (i == 0)
  7118. fail("Parse succeeded despite failing allocator");
  7119. if (i == max_alloc_count)
  7120. fail("Parse failed with max allocations");
  7121. }
  7122. END_TEST
  7123. START_TEST(test_alloc_parse_pi_3) {
  7124. const char *text
  7125. = "<?"
  7126. /* 64 characters per line */
  7127. "This processing instruction should be long enough to ensure that"
  7128. "it triggers the growth of an internal string pool when the "
  7129. "allocator fails at a cruicial moment FGHIJKLMNOPABCDEFGHIJKLMNOP"
  7130. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  7131. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  7132. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  7133. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  7134. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  7135. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  7136. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  7137. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  7138. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  7139. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  7140. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  7141. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  7142. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  7143. "Q?><doc/>";
  7144. int i;
  7145. const int max_alloc_count = 20;
  7146. for (i = 0; i < max_alloc_count; i++) {
  7147. allocation_count = i;
  7148. XML_SetProcessingInstructionHandler(g_parser, dummy_pi_handler);
  7149. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  7150. != XML_STATUS_ERROR)
  7151. break;
  7152. /* See comment in test_alloc_parse_xdecl() */
  7153. alloc_teardown();
  7154. alloc_setup();
  7155. }
  7156. if (i == 0)
  7157. fail("Parse succeeded despite failing allocator");
  7158. if (i == max_alloc_count)
  7159. fail("Parse failed with max allocations");
  7160. }
  7161. END_TEST
  7162. START_TEST(test_alloc_parse_comment) {
  7163. const char *text = "<?xml version='1.0' encoding='utf-8'?>\n"
  7164. "<!-- Test parsing this comment -->"
  7165. "<doc>Hi</doc>";
  7166. int i;
  7167. const int max_alloc_count = 15;
  7168. for (i = 0; i < max_alloc_count; i++) {
  7169. allocation_count = i;
  7170. XML_SetCommentHandler(g_parser, dummy_comment_handler);
  7171. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  7172. != XML_STATUS_ERROR)
  7173. break;
  7174. /* See comment in test_alloc_parse_xdecl() */
  7175. alloc_teardown();
  7176. alloc_setup();
  7177. }
  7178. if (i == 0)
  7179. fail("Parse succeeded despite failing allocator");
  7180. if (i == max_alloc_count)
  7181. fail("Parse failed with max allocations");
  7182. }
  7183. END_TEST
  7184. START_TEST(test_alloc_parse_comment_2) {
  7185. const char *text = "<?xml version='1.0' encoding='utf-8'?>\n"
  7186. "<doc>"
  7187. "Hello, world"
  7188. "<!-- Parse this comment too -->"
  7189. "</doc>";
  7190. int i;
  7191. const int max_alloc_count = 15;
  7192. for (i = 0; i < max_alloc_count; i++) {
  7193. allocation_count = i;
  7194. XML_SetCommentHandler(g_parser, dummy_comment_handler);
  7195. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  7196. != XML_STATUS_ERROR)
  7197. break;
  7198. /* See comment in test_alloc_parse_xdecl() */
  7199. alloc_teardown();
  7200. alloc_setup();
  7201. }
  7202. if (i == 0)
  7203. fail("Parse succeeded despite failing allocator");
  7204. if (i == max_alloc_count)
  7205. fail("Parse failed with max allocations");
  7206. }
  7207. END_TEST
  7208. static int XMLCALL
  7209. external_entity_duff_loader(XML_Parser parser, const XML_Char *context,
  7210. const XML_Char *base, const XML_Char *systemId,
  7211. const XML_Char *publicId) {
  7212. XML_Parser new_parser;
  7213. unsigned int i;
  7214. const unsigned int max_alloc_count = 10;
  7215. UNUSED_P(base);
  7216. UNUSED_P(systemId);
  7217. UNUSED_P(publicId);
  7218. /* Try a few different allocation levels */
  7219. for (i = 0; i < max_alloc_count; i++) {
  7220. allocation_count = i;
  7221. new_parser = XML_ExternalEntityParserCreate(parser, context, NULL);
  7222. if (new_parser != NULL) {
  7223. XML_ParserFree(new_parser);
  7224. break;
  7225. }
  7226. }
  7227. if (i == 0)
  7228. fail("External parser creation ignored failing allocator");
  7229. else if (i == max_alloc_count)
  7230. fail("Extern parser not created with max allocation count");
  7231. /* Make sure other random allocation doesn't now fail */
  7232. allocation_count = ALLOC_ALWAYS_SUCCEED;
  7233. /* Make sure the failure code path is executed too */
  7234. return XML_STATUS_ERROR;
  7235. }
  7236. /* Test that external parser creation running out of memory is
  7237. * correctly reported. Based on the external entity test cases.
  7238. */
  7239. START_TEST(test_alloc_create_external_parser) {
  7240. const char *text = "<?xml version='1.0' encoding='us-ascii'?>\n"
  7241. "<!DOCTYPE doc SYSTEM 'foo'>\n"
  7242. "<doc>&entity;</doc>";
  7243. char foo_text[] = "<!ELEMENT doc (#PCDATA)*>";
  7244. XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
  7245. XML_SetUserData(g_parser, foo_text);
  7246. XML_SetExternalEntityRefHandler(g_parser, external_entity_duff_loader);
  7247. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  7248. != XML_STATUS_ERROR) {
  7249. fail("External parser allocator returned success incorrectly");
  7250. }
  7251. }
  7252. END_TEST
  7253. /* More external parser memory allocation testing */
  7254. START_TEST(test_alloc_run_external_parser) {
  7255. const char *text = "<?xml version='1.0' encoding='us-ascii'?>\n"
  7256. "<!DOCTYPE doc SYSTEM 'foo'>\n"
  7257. "<doc>&entity;</doc>";
  7258. char foo_text[] = "<!ELEMENT doc (#PCDATA)*>";
  7259. unsigned int i;
  7260. const unsigned int max_alloc_count = 15;
  7261. for (i = 0; i < max_alloc_count; i++) {
  7262. XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
  7263. XML_SetUserData(g_parser, foo_text);
  7264. XML_SetExternalEntityRefHandler(g_parser, external_entity_null_loader);
  7265. allocation_count = i;
  7266. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  7267. != XML_STATUS_ERROR)
  7268. break;
  7269. /* See comment in test_alloc_parse_xdecl() */
  7270. alloc_teardown();
  7271. alloc_setup();
  7272. }
  7273. if (i == 0)
  7274. fail("Parsing ignored failing allocator");
  7275. else if (i == max_alloc_count)
  7276. fail("Parsing failed with allocation count 10");
  7277. }
  7278. END_TEST
  7279. static int XMLCALL
  7280. external_entity_dbl_handler(XML_Parser parser, const XML_Char *context,
  7281. const XML_Char *base, const XML_Char *systemId,
  7282. const XML_Char *publicId) {
  7283. intptr_t callno = (intptr_t)XML_GetUserData(parser);
  7284. const char *text;
  7285. XML_Parser new_parser;
  7286. int i;
  7287. const int max_alloc_count = 20;
  7288. UNUSED_P(base);
  7289. UNUSED_P(systemId);
  7290. UNUSED_P(publicId);
  7291. if (callno == 0) {
  7292. /* First time through, check how many calls to malloc occur */
  7293. text = ("<!ELEMENT doc (e+)>\n"
  7294. "<!ATTLIST doc xmlns CDATA #IMPLIED>\n"
  7295. "<!ELEMENT e EMPTY>\n");
  7296. allocation_count = 10000;
  7297. new_parser = XML_ExternalEntityParserCreate(parser, context, NULL);
  7298. if (new_parser == NULL) {
  7299. fail("Unable to allocate first external parser");
  7300. return XML_STATUS_ERROR;
  7301. }
  7302. /* Stash the number of calls in the user data */
  7303. XML_SetUserData(parser, (void *)(intptr_t)(10000 - allocation_count));
  7304. } else {
  7305. text = ("<?xml version='1.0' encoding='us-ascii'?>"
  7306. "<e/>");
  7307. /* Try at varying levels to exercise more code paths */
  7308. for (i = 0; i < max_alloc_count; i++) {
  7309. allocation_count = callno + i;
  7310. new_parser = XML_ExternalEntityParserCreate(parser, context, NULL);
  7311. if (new_parser != NULL)
  7312. break;
  7313. }
  7314. if (i == 0) {
  7315. fail("Second external parser unexpectedly created");
  7316. XML_ParserFree(new_parser);
  7317. return XML_STATUS_ERROR;
  7318. } else if (i == max_alloc_count) {
  7319. fail("Second external parser not created");
  7320. return XML_STATUS_ERROR;
  7321. }
  7322. }
  7323. allocation_count = ALLOC_ALWAYS_SUCCEED;
  7324. if (_XML_Parse_SINGLE_BYTES(new_parser, text, (int)strlen(text), XML_TRUE)
  7325. == XML_STATUS_ERROR) {
  7326. xml_failure(new_parser);
  7327. return XML_STATUS_ERROR;
  7328. }
  7329. XML_ParserFree(new_parser);
  7330. return XML_STATUS_OK;
  7331. }
  7332. /* Test that running out of memory in dtdCopy is correctly reported.
  7333. * Based on test_default_ns_from_ext_subset_and_ext_ge()
  7334. */
  7335. START_TEST(test_alloc_dtd_copy_default_atts) {
  7336. const char *text = "<?xml version='1.0'?>\n"
  7337. "<!DOCTYPE doc SYSTEM 'http://example.org/doc.dtd' [\n"
  7338. " <!ENTITY en SYSTEM 'http://example.org/entity.ent'>\n"
  7339. "]>\n"
  7340. "<doc xmlns='http://example.org/ns1'>\n"
  7341. "&en;\n"
  7342. "</doc>";
  7343. XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
  7344. XML_SetExternalEntityRefHandler(g_parser, external_entity_dbl_handler);
  7345. XML_SetUserData(g_parser, NULL);
  7346. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  7347. == XML_STATUS_ERROR)
  7348. xml_failure(g_parser);
  7349. }
  7350. END_TEST
  7351. static int XMLCALL
  7352. external_entity_dbl_handler_2(XML_Parser parser, const XML_Char *context,
  7353. const XML_Char *base, const XML_Char *systemId,
  7354. const XML_Char *publicId) {
  7355. intptr_t callno = (intptr_t)XML_GetUserData(parser);
  7356. const char *text;
  7357. XML_Parser new_parser;
  7358. enum XML_Status rv;
  7359. UNUSED_P(base);
  7360. UNUSED_P(systemId);
  7361. UNUSED_P(publicId);
  7362. if (callno == 0) {
  7363. /* Try different allocation levels for whole exercise */
  7364. text = ("<!ELEMENT doc (e+)>\n"
  7365. "<!ATTLIST doc xmlns CDATA #IMPLIED>\n"
  7366. "<!ELEMENT e EMPTY>\n");
  7367. XML_SetUserData(parser, (void *)(intptr_t)1);
  7368. new_parser = XML_ExternalEntityParserCreate(parser, context, NULL);
  7369. if (new_parser == NULL)
  7370. return XML_STATUS_ERROR;
  7371. rv = _XML_Parse_SINGLE_BYTES(new_parser, text, (int)strlen(text), XML_TRUE);
  7372. } else {
  7373. /* Just run through once */
  7374. text = ("<?xml version='1.0' encoding='us-ascii'?>"
  7375. "<e/>");
  7376. new_parser = XML_ExternalEntityParserCreate(parser, context, NULL);
  7377. if (new_parser == NULL)
  7378. return XML_STATUS_ERROR;
  7379. rv = _XML_Parse_SINGLE_BYTES(new_parser, text, (int)strlen(text), XML_TRUE);
  7380. }
  7381. XML_ParserFree(new_parser);
  7382. if (rv == XML_STATUS_ERROR)
  7383. return XML_STATUS_ERROR;
  7384. return XML_STATUS_OK;
  7385. }
  7386. /* Test more external entity allocation failure paths */
  7387. START_TEST(test_alloc_external_entity) {
  7388. const char *text = "<?xml version='1.0'?>\n"
  7389. "<!DOCTYPE doc SYSTEM 'http://example.org/doc.dtd' [\n"
  7390. " <!ENTITY en SYSTEM 'http://example.org/entity.ent'>\n"
  7391. "]>\n"
  7392. "<doc xmlns='http://example.org/ns1'>\n"
  7393. "&en;\n"
  7394. "</doc>";
  7395. int i;
  7396. const int alloc_test_max_repeats = 50;
  7397. for (i = 0; i < alloc_test_max_repeats; i++) {
  7398. allocation_count = -1;
  7399. XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
  7400. XML_SetExternalEntityRefHandler(g_parser, external_entity_dbl_handler_2);
  7401. XML_SetUserData(g_parser, NULL);
  7402. allocation_count = i;
  7403. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  7404. == XML_STATUS_OK)
  7405. break;
  7406. /* See comment in test_alloc_parse_xdecl() */
  7407. alloc_teardown();
  7408. alloc_setup();
  7409. }
  7410. allocation_count = -1;
  7411. if (i == 0)
  7412. fail("External entity parsed despite duff allocator");
  7413. if (i == alloc_test_max_repeats)
  7414. fail("External entity not parsed at max allocation count");
  7415. }
  7416. END_TEST
  7417. /* Test more allocation failure paths */
  7418. static int XMLCALL
  7419. external_entity_alloc_set_encoding(XML_Parser parser, const XML_Char *context,
  7420. const XML_Char *base,
  7421. const XML_Char *systemId,
  7422. const XML_Char *publicId) {
  7423. /* As for external_entity_loader() */
  7424. const char *text = "<?xml encoding='iso-8859-3'?>"
  7425. "\xC3\xA9";
  7426. XML_Parser ext_parser;
  7427. enum XML_Status status;
  7428. UNUSED_P(base);
  7429. UNUSED_P(systemId);
  7430. UNUSED_P(publicId);
  7431. ext_parser = XML_ExternalEntityParserCreate(parser, context, NULL);
  7432. if (ext_parser == NULL)
  7433. return XML_STATUS_ERROR;
  7434. if (! XML_SetEncoding(ext_parser, XCS("utf-8"))) {
  7435. XML_ParserFree(ext_parser);
  7436. return XML_STATUS_ERROR;
  7437. }
  7438. status
  7439. = _XML_Parse_SINGLE_BYTES(ext_parser, text, (int)strlen(text), XML_TRUE);
  7440. XML_ParserFree(ext_parser);
  7441. if (status == XML_STATUS_ERROR)
  7442. return XML_STATUS_ERROR;
  7443. return XML_STATUS_OK;
  7444. }
  7445. START_TEST(test_alloc_ext_entity_set_encoding) {
  7446. const char *text = "<!DOCTYPE doc [\n"
  7447. " <!ENTITY en SYSTEM 'http://example.org/dummy.ent'>\n"
  7448. "]>\n"
  7449. "<doc>&en;</doc>";
  7450. int i;
  7451. const int max_allocation_count = 30;
  7452. for (i = 0; i < max_allocation_count; i++) {
  7453. XML_SetExternalEntityRefHandler(g_parser,
  7454. external_entity_alloc_set_encoding);
  7455. allocation_count = i;
  7456. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  7457. == XML_STATUS_OK)
  7458. break;
  7459. allocation_count = -1;
  7460. /* See comment in test_alloc_parse_xdecl() */
  7461. alloc_teardown();
  7462. alloc_setup();
  7463. }
  7464. if (i == 0)
  7465. fail("Encoding check succeeded despite failing allocator");
  7466. if (i == max_allocation_count)
  7467. fail("Encoding failed at max allocation count");
  7468. }
  7469. END_TEST
  7470. static int XMLCALL
  7471. unknown_released_encoding_handler(void *data, const XML_Char *encoding,
  7472. XML_Encoding *info) {
  7473. UNUSED_P(data);
  7474. if (! xcstrcmp(encoding, XCS("unsupported-encoding"))) {
  7475. int i;
  7476. for (i = 0; i < 256; i++)
  7477. info->map[i] = i;
  7478. info->data = NULL;
  7479. info->convert = NULL;
  7480. info->release = dummy_release;
  7481. return XML_STATUS_OK;
  7482. }
  7483. return XML_STATUS_ERROR;
  7484. }
  7485. /* Test the effects of allocation failure in internal entities.
  7486. * Based on test_unknown_encoding_internal_entity
  7487. */
  7488. START_TEST(test_alloc_internal_entity) {
  7489. const char *text = "<?xml version='1.0' encoding='unsupported-encoding'?>\n"
  7490. "<!DOCTYPE test [<!ENTITY foo 'bar'>]>\n"
  7491. "<test a='&foo;'/>";
  7492. unsigned int i;
  7493. const unsigned int max_alloc_count = 20;
  7494. for (i = 0; i < max_alloc_count; i++) {
  7495. allocation_count = i;
  7496. XML_SetUnknownEncodingHandler(g_parser, unknown_released_encoding_handler,
  7497. NULL);
  7498. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  7499. != XML_STATUS_ERROR)
  7500. break;
  7501. /* See comment in test_alloc_parse_xdecl() */
  7502. alloc_teardown();
  7503. alloc_setup();
  7504. }
  7505. if (i == 0)
  7506. fail("Internal entity worked despite failing allocations");
  7507. else if (i == max_alloc_count)
  7508. fail("Internal entity failed at max allocation count");
  7509. }
  7510. END_TEST
  7511. /* Test the robustness against allocation failure of element handling
  7512. * Based on test_dtd_default_handling().
  7513. */
  7514. START_TEST(test_alloc_dtd_default_handling) {
  7515. const char *text = "<!DOCTYPE doc [\n"
  7516. "<!ENTITY e SYSTEM 'http://example.org/e'>\n"
  7517. "<!NOTATION n SYSTEM 'http://example.org/n'>\n"
  7518. "<!ENTITY e1 SYSTEM 'http://example.org/e' NDATA n>\n"
  7519. "<!ELEMENT doc (#PCDATA)>\n"
  7520. "<!ATTLIST doc a CDATA #IMPLIED>\n"
  7521. "<?pi in dtd?>\n"
  7522. "<!--comment in dtd-->\n"
  7523. "]>\n"
  7524. "<doc><![CDATA[text in doc]]></doc>";
  7525. const XML_Char *expected = XCS("\n\n\n\n\n\n\n\n\n<doc>text in doc</doc>");
  7526. CharData storage;
  7527. int i;
  7528. const int max_alloc_count = 25;
  7529. for (i = 0; i < max_alloc_count; i++) {
  7530. allocation_count = i;
  7531. dummy_handler_flags = 0;
  7532. XML_SetDefaultHandler(g_parser, accumulate_characters);
  7533. XML_SetDoctypeDeclHandler(g_parser, dummy_start_doctype_handler,
  7534. dummy_end_doctype_handler);
  7535. XML_SetEntityDeclHandler(g_parser, dummy_entity_decl_handler);
  7536. XML_SetNotationDeclHandler(g_parser, dummy_notation_decl_handler);
  7537. XML_SetElementDeclHandler(g_parser, dummy_element_decl_handler);
  7538. XML_SetAttlistDeclHandler(g_parser, dummy_attlist_decl_handler);
  7539. XML_SetProcessingInstructionHandler(g_parser, dummy_pi_handler);
  7540. XML_SetCommentHandler(g_parser, dummy_comment_handler);
  7541. XML_SetCdataSectionHandler(g_parser, dummy_start_cdata_handler,
  7542. dummy_end_cdata_handler);
  7543. XML_SetUnparsedEntityDeclHandler(g_parser,
  7544. dummy_unparsed_entity_decl_handler);
  7545. CharData_Init(&storage);
  7546. XML_SetUserData(g_parser, &storage);
  7547. XML_SetCharacterDataHandler(g_parser, accumulate_characters);
  7548. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  7549. != XML_STATUS_ERROR)
  7550. break;
  7551. /* See comment in test_alloc_parse_xdecl() */
  7552. alloc_teardown();
  7553. alloc_setup();
  7554. }
  7555. if (i == 0)
  7556. fail("Default DTD parsed despite allocation failures");
  7557. if (i == max_alloc_count)
  7558. fail("Default DTD not parsed with maximum alloc count");
  7559. CharData_CheckXMLChars(&storage, expected);
  7560. if (dummy_handler_flags
  7561. != (DUMMY_START_DOCTYPE_HANDLER_FLAG | DUMMY_END_DOCTYPE_HANDLER_FLAG
  7562. | DUMMY_ENTITY_DECL_HANDLER_FLAG | DUMMY_NOTATION_DECL_HANDLER_FLAG
  7563. | DUMMY_ELEMENT_DECL_HANDLER_FLAG | DUMMY_ATTLIST_DECL_HANDLER_FLAG
  7564. | DUMMY_COMMENT_HANDLER_FLAG | DUMMY_PI_HANDLER_FLAG
  7565. | DUMMY_START_CDATA_HANDLER_FLAG | DUMMY_END_CDATA_HANDLER_FLAG
  7566. | DUMMY_UNPARSED_ENTITY_DECL_HANDLER_FLAG))
  7567. fail("Not all handlers were called");
  7568. }
  7569. END_TEST
  7570. /* Test robustness of XML_SetEncoding() with a failing allocator */
  7571. START_TEST(test_alloc_explicit_encoding) {
  7572. int i;
  7573. const int max_alloc_count = 5;
  7574. for (i = 0; i < max_alloc_count; i++) {
  7575. allocation_count = i;
  7576. if (XML_SetEncoding(g_parser, XCS("us-ascii")) == XML_STATUS_OK)
  7577. break;
  7578. }
  7579. if (i == 0)
  7580. fail("Encoding set despite failing allocator");
  7581. else if (i == max_alloc_count)
  7582. fail("Encoding not set at max allocation count");
  7583. }
  7584. END_TEST
  7585. /* Test robustness of XML_SetBase against a failing allocator */
  7586. START_TEST(test_alloc_set_base) {
  7587. const XML_Char *new_base = XCS("/local/file/name.xml");
  7588. int i;
  7589. const int max_alloc_count = 5;
  7590. for (i = 0; i < max_alloc_count; i++) {
  7591. allocation_count = i;
  7592. if (XML_SetBase(g_parser, new_base) == XML_STATUS_OK)
  7593. break;
  7594. }
  7595. if (i == 0)
  7596. fail("Base set despite failing allocator");
  7597. else if (i == max_alloc_count)
  7598. fail("Base not set with max allocation count");
  7599. }
  7600. END_TEST
  7601. /* Test buffer extension in the face of a duff reallocator */
  7602. START_TEST(test_alloc_realloc_buffer) {
  7603. const char *text = get_buffer_test_text;
  7604. void *buffer;
  7605. int i;
  7606. const int max_realloc_count = 10;
  7607. /* Get a smallish buffer */
  7608. for (i = 0; i < max_realloc_count; i++) {
  7609. reallocation_count = i;
  7610. buffer = XML_GetBuffer(g_parser, 1536);
  7611. if (buffer == NULL)
  7612. fail("1.5K buffer reallocation failed");
  7613. assert(buffer != NULL);
  7614. memcpy(buffer, text, strlen(text));
  7615. if (XML_ParseBuffer(g_parser, (int)strlen(text), XML_FALSE)
  7616. == XML_STATUS_OK)
  7617. break;
  7618. /* See comment in test_alloc_parse_xdecl() */
  7619. alloc_teardown();
  7620. alloc_setup();
  7621. }
  7622. reallocation_count = -1;
  7623. if (i == 0)
  7624. fail("Parse succeeded with no reallocation");
  7625. else if (i == max_realloc_count)
  7626. fail("Parse failed with max reallocation count");
  7627. }
  7628. END_TEST
  7629. /* Same test for external entity parsers */
  7630. static int XMLCALL
  7631. external_entity_reallocator(XML_Parser parser, const XML_Char *context,
  7632. const XML_Char *base, const XML_Char *systemId,
  7633. const XML_Char *publicId) {
  7634. const char *text = get_buffer_test_text;
  7635. XML_Parser ext_parser;
  7636. void *buffer;
  7637. enum XML_Status status;
  7638. UNUSED_P(base);
  7639. UNUSED_P(systemId);
  7640. UNUSED_P(publicId);
  7641. ext_parser = XML_ExternalEntityParserCreate(parser, context, NULL);
  7642. if (ext_parser == NULL)
  7643. fail("Could not create external entity parser");
  7644. reallocation_count = (intptr_t)XML_GetUserData(parser);
  7645. buffer = XML_GetBuffer(ext_parser, 1536);
  7646. if (buffer == NULL)
  7647. fail("Buffer allocation failed");
  7648. assert(buffer != NULL);
  7649. memcpy(buffer, text, strlen(text));
  7650. status = XML_ParseBuffer(ext_parser, (int)strlen(text), XML_FALSE);
  7651. reallocation_count = -1;
  7652. XML_ParserFree(ext_parser);
  7653. return (status == XML_STATUS_OK) ? XML_STATUS_OK : XML_STATUS_ERROR;
  7654. }
  7655. START_TEST(test_alloc_ext_entity_realloc_buffer) {
  7656. const char *text = "<!DOCTYPE doc [\n"
  7657. " <!ENTITY en SYSTEM 'http://example.org/dummy.ent'>\n"
  7658. "]>\n"
  7659. "<doc>&en;</doc>";
  7660. int i;
  7661. const int max_realloc_count = 10;
  7662. for (i = 0; i < max_realloc_count; i++) {
  7663. XML_SetExternalEntityRefHandler(g_parser, external_entity_reallocator);
  7664. XML_SetUserData(g_parser, (void *)(intptr_t)i);
  7665. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  7666. == XML_STATUS_OK)
  7667. break;
  7668. /* See comment in test_alloc_parse_xdecl() */
  7669. alloc_teardown();
  7670. alloc_setup();
  7671. }
  7672. if (i == 0)
  7673. fail("Succeeded with no reallocations");
  7674. if (i == max_realloc_count)
  7675. fail("Failed with max reallocations");
  7676. }
  7677. END_TEST
  7678. /* Test elements with many attributes are handled correctly */
  7679. START_TEST(test_alloc_realloc_many_attributes) {
  7680. const char *text = "<!DOCTYPE doc [\n"
  7681. "<!ATTLIST doc za CDATA 'default'>\n"
  7682. "<!ATTLIST doc zb CDATA 'def2'>\n"
  7683. "<!ATTLIST doc zc CDATA 'def3'>\n"
  7684. "]>\n"
  7685. "<doc a='1'"
  7686. " b='2'"
  7687. " c='3'"
  7688. " d='4'"
  7689. " e='5'"
  7690. " f='6'"
  7691. " g='7'"
  7692. " h='8'"
  7693. " i='9'"
  7694. " j='10'"
  7695. " k='11'"
  7696. " l='12'"
  7697. " m='13'"
  7698. " n='14'"
  7699. " p='15'"
  7700. " q='16'"
  7701. " r='17'"
  7702. " s='18'>"
  7703. "</doc>";
  7704. int i;
  7705. const int max_realloc_count = 10;
  7706. for (i = 0; i < max_realloc_count; i++) {
  7707. reallocation_count = i;
  7708. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  7709. != XML_STATUS_ERROR)
  7710. break;
  7711. /* See comment in test_alloc_parse_xdecl() */
  7712. alloc_teardown();
  7713. alloc_setup();
  7714. }
  7715. if (i == 0)
  7716. fail("Parse succeeded despite no reallocations");
  7717. if (i == max_realloc_count)
  7718. fail("Parse failed at max reallocations");
  7719. }
  7720. END_TEST
  7721. /* Test handling of a public entity with failing allocator */
  7722. START_TEST(test_alloc_public_entity_value) {
  7723. const char *text = "<!DOCTYPE doc SYSTEM 'http://example.org/'>\n"
  7724. "<doc></doc>\n";
  7725. char dtd_text[]
  7726. = "<!ELEMENT doc EMPTY>\n"
  7727. "<!ENTITY % e1 PUBLIC 'foo' 'bar.ent'>\n"
  7728. "<!ENTITY % "
  7729. /* Each line is 64 characters */
  7730. "ThisIsAStupidlyLongParameterNameIntendedToTriggerPoolGrowth12345"
  7731. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  7732. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  7733. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  7734. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  7735. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  7736. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  7737. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  7738. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  7739. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  7740. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  7741. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  7742. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  7743. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  7744. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  7745. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  7746. " '%e1;'>\n"
  7747. "%e1;\n";
  7748. int i;
  7749. const int max_alloc_count = 50;
  7750. for (i = 0; i < max_alloc_count; i++) {
  7751. allocation_count = i;
  7752. dummy_handler_flags = 0;
  7753. XML_SetUserData(g_parser, dtd_text);
  7754. XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
  7755. XML_SetExternalEntityRefHandler(g_parser, external_entity_public);
  7756. /* Provoke a particular code path */
  7757. XML_SetEntityDeclHandler(g_parser, dummy_entity_decl_handler);
  7758. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  7759. != XML_STATUS_ERROR)
  7760. break;
  7761. /* See comment in test_alloc_parse_xdecl() */
  7762. alloc_teardown();
  7763. alloc_setup();
  7764. }
  7765. if (i == 0)
  7766. fail("Parsing worked despite failing allocation");
  7767. if (i == max_alloc_count)
  7768. fail("Parsing failed at max allocation count");
  7769. if (dummy_handler_flags != DUMMY_ENTITY_DECL_HANDLER_FLAG)
  7770. fail("Entity declaration handler not called");
  7771. }
  7772. END_TEST
  7773. START_TEST(test_alloc_realloc_subst_public_entity_value) {
  7774. const char *text = "<!DOCTYPE doc SYSTEM 'http://example.org/'>\n"
  7775. "<doc></doc>\n";
  7776. char dtd_text[]
  7777. = "<!ELEMENT doc EMPTY>\n"
  7778. "<!ENTITY % "
  7779. /* Each line is 64 characters */
  7780. "ThisIsAStupidlyLongParameterNameIntendedToTriggerPoolGrowth12345"
  7781. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  7782. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  7783. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  7784. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  7785. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  7786. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  7787. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  7788. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  7789. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  7790. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  7791. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  7792. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  7793. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  7794. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  7795. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  7796. " PUBLIC 'foo' 'bar.ent'>\n"
  7797. "%ThisIsAStupidlyLongParameterNameIntendedToTriggerPoolGrowth12345"
  7798. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  7799. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  7800. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  7801. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  7802. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  7803. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  7804. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  7805. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  7806. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  7807. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  7808. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  7809. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  7810. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  7811. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  7812. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP;";
  7813. int i;
  7814. const int max_realloc_count = 10;
  7815. for (i = 0; i < max_realloc_count; i++) {
  7816. reallocation_count = i;
  7817. XML_SetUserData(g_parser, dtd_text);
  7818. XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
  7819. XML_SetExternalEntityRefHandler(g_parser, external_entity_public);
  7820. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  7821. != XML_STATUS_ERROR)
  7822. break;
  7823. /* See comment in test_alloc_parse_xdecl() */
  7824. alloc_teardown();
  7825. alloc_setup();
  7826. }
  7827. if (i == 0)
  7828. fail("Parsing worked despite failing reallocation");
  7829. if (i == max_realloc_count)
  7830. fail("Parsing failed at max reallocation count");
  7831. }
  7832. END_TEST
  7833. START_TEST(test_alloc_parse_public_doctype) {
  7834. const char *text
  7835. = "<?xml version='1.0' encoding='utf-8'?>\n"
  7836. "<!DOCTYPE doc PUBLIC '"
  7837. /* 64 characters per line */
  7838. "http://example.com/a/long/enough/name/to/trigger/pool/growth/zz/"
  7839. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  7840. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  7841. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  7842. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  7843. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  7844. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  7845. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  7846. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  7847. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  7848. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  7849. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  7850. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  7851. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  7852. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  7853. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  7854. "' 'test'>\n"
  7855. "<doc></doc>";
  7856. int i;
  7857. const int max_alloc_count = 25;
  7858. for (i = 0; i < max_alloc_count; i++) {
  7859. allocation_count = i;
  7860. dummy_handler_flags = 0;
  7861. XML_SetDoctypeDeclHandler(g_parser, dummy_start_doctype_decl_handler,
  7862. dummy_end_doctype_decl_handler);
  7863. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  7864. != XML_STATUS_ERROR)
  7865. break;
  7866. /* See comment in test_alloc_parse_xdecl() */
  7867. alloc_teardown();
  7868. alloc_setup();
  7869. }
  7870. if (i == 0)
  7871. fail("Parse succeeded despite failing allocator");
  7872. if (i == max_alloc_count)
  7873. fail("Parse failed at maximum allocation count");
  7874. if (dummy_handler_flags
  7875. != (DUMMY_START_DOCTYPE_DECL_HANDLER_FLAG
  7876. | DUMMY_END_DOCTYPE_DECL_HANDLER_FLAG))
  7877. fail("Doctype handler functions not called");
  7878. }
  7879. END_TEST
  7880. START_TEST(test_alloc_parse_public_doctype_long_name) {
  7881. const char *text
  7882. = "<?xml version='1.0' encoding='utf-8'?>\n"
  7883. "<!DOCTYPE doc PUBLIC 'http://example.com/foo' '"
  7884. /* 64 characters per line */
  7885. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNOP"
  7886. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNOP"
  7887. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNOP"
  7888. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNOP"
  7889. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNOP"
  7890. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNOP"
  7891. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNOP"
  7892. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNOP"
  7893. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNOP"
  7894. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNOP"
  7895. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNOP"
  7896. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNOP"
  7897. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNOP"
  7898. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNOP"
  7899. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNOP"
  7900. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNOP"
  7901. "'>\n"
  7902. "<doc></doc>";
  7903. int i;
  7904. const int max_alloc_count = 25;
  7905. for (i = 0; i < max_alloc_count; i++) {
  7906. allocation_count = i;
  7907. XML_SetDoctypeDeclHandler(g_parser, dummy_start_doctype_decl_handler,
  7908. dummy_end_doctype_decl_handler);
  7909. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  7910. != XML_STATUS_ERROR)
  7911. break;
  7912. /* See comment in test_alloc_parse_xdecl() */
  7913. alloc_teardown();
  7914. alloc_setup();
  7915. }
  7916. if (i == 0)
  7917. fail("Parse succeeded despite failing allocator");
  7918. if (i == max_alloc_count)
  7919. fail("Parse failed at maximum allocation count");
  7920. }
  7921. END_TEST
  7922. static int XMLCALL
  7923. external_entity_alloc(XML_Parser parser, const XML_Char *context,
  7924. const XML_Char *base, const XML_Char *systemId,
  7925. const XML_Char *publicId) {
  7926. const char *text = (const char *)XML_GetUserData(parser);
  7927. XML_Parser ext_parser;
  7928. int parse_res;
  7929. UNUSED_P(base);
  7930. UNUSED_P(systemId);
  7931. UNUSED_P(publicId);
  7932. ext_parser = XML_ExternalEntityParserCreate(parser, context, NULL);
  7933. if (ext_parser == NULL)
  7934. return XML_STATUS_ERROR;
  7935. parse_res
  7936. = _XML_Parse_SINGLE_BYTES(ext_parser, text, (int)strlen(text), XML_TRUE);
  7937. XML_ParserFree(ext_parser);
  7938. return parse_res;
  7939. }
  7940. /* Test foreign DTD handling */
  7941. START_TEST(test_alloc_set_foreign_dtd) {
  7942. const char *text1 = "<?xml version='1.0' encoding='us-ascii'?>\n"
  7943. "<doc>&entity;</doc>";
  7944. char text2[] = "<!ELEMENT doc (#PCDATA)*>";
  7945. int i;
  7946. const int max_alloc_count = 25;
  7947. for (i = 0; i < max_alloc_count; i++) {
  7948. allocation_count = i;
  7949. XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
  7950. XML_SetUserData(g_parser, &text2);
  7951. XML_SetExternalEntityRefHandler(g_parser, external_entity_alloc);
  7952. if (XML_UseForeignDTD(g_parser, XML_TRUE) != XML_ERROR_NONE)
  7953. fail("Could not set foreign DTD");
  7954. if (_XML_Parse_SINGLE_BYTES(g_parser, text1, (int)strlen(text1), XML_TRUE)
  7955. != XML_STATUS_ERROR)
  7956. break;
  7957. /* See comment in test_alloc_parse_xdecl() */
  7958. alloc_teardown();
  7959. alloc_setup();
  7960. }
  7961. if (i == 0)
  7962. fail("Parse succeeded despite failing allocator");
  7963. if (i == max_alloc_count)
  7964. fail("Parse failed at maximum allocation count");
  7965. }
  7966. END_TEST
  7967. /* Test based on ibm/valid/P32/ibm32v04.xml */
  7968. START_TEST(test_alloc_attribute_enum_value) {
  7969. const char *text = "<?xml version='1.0' standalone='no'?>\n"
  7970. "<!DOCTYPE animal SYSTEM 'test.dtd'>\n"
  7971. "<animal>This is a \n <a/> \n\nyellow tiger</animal>";
  7972. char dtd_text[] = "<!ELEMENT animal (#PCDATA|a)*>\n"
  7973. "<!ELEMENT a EMPTY>\n"
  7974. "<!ATTLIST animal xml:space (default|preserve) 'preserve'>";
  7975. int i;
  7976. const int max_alloc_count = 30;
  7977. for (i = 0; i < max_alloc_count; i++) {
  7978. allocation_count = i;
  7979. XML_SetExternalEntityRefHandler(g_parser, external_entity_alloc);
  7980. XML_SetUserData(g_parser, dtd_text);
  7981. XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
  7982. /* An attribute list handler provokes a different code path */
  7983. XML_SetAttlistDeclHandler(g_parser, dummy_attlist_decl_handler);
  7984. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  7985. != XML_STATUS_ERROR)
  7986. break;
  7987. /* See comment in test_alloc_parse_xdecl() */
  7988. alloc_teardown();
  7989. alloc_setup();
  7990. }
  7991. if (i == 0)
  7992. fail("Parse succeeded despite failing allocator");
  7993. if (i == max_alloc_count)
  7994. fail("Parse failed at maximum allocation count");
  7995. }
  7996. END_TEST
  7997. /* Test attribute enums sufficient to overflow the string pool */
  7998. START_TEST(test_alloc_realloc_attribute_enum_value) {
  7999. const char *text = "<?xml version='1.0' standalone='no'?>\n"
  8000. "<!DOCTYPE animal SYSTEM 'test.dtd'>\n"
  8001. "<animal>This is a yellow tiger</animal>";
  8002. /* We wish to define a collection of attribute enums that will
  8003. * cause the string pool storing them to have to expand. This
  8004. * means more than 1024 bytes, including the parentheses and
  8005. * separator bars.
  8006. */
  8007. char dtd_text[]
  8008. = "<!ELEMENT animal (#PCDATA)*>\n"
  8009. "<!ATTLIST animal thing "
  8010. "(default"
  8011. /* Each line is 64 characters */
  8012. "|ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
  8013. "|BBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
  8014. "|CBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
  8015. "|DBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
  8016. "|EBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
  8017. "|FBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
  8018. "|GBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
  8019. "|HBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
  8020. "|IBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
  8021. "|JBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
  8022. "|KBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
  8023. "|LBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
  8024. "|MBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
  8025. "|NBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
  8026. "|OBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
  8027. "|PBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO)"
  8028. " 'default'>";
  8029. int i;
  8030. const int max_realloc_count = 10;
  8031. for (i = 0; i < max_realloc_count; i++) {
  8032. reallocation_count = i;
  8033. XML_SetExternalEntityRefHandler(g_parser, external_entity_alloc);
  8034. XML_SetUserData(g_parser, dtd_text);
  8035. XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
  8036. /* An attribute list handler provokes a different code path */
  8037. XML_SetAttlistDeclHandler(g_parser, dummy_attlist_decl_handler);
  8038. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  8039. != XML_STATUS_ERROR)
  8040. break;
  8041. /* See comment in test_alloc_parse_xdecl() */
  8042. alloc_teardown();
  8043. alloc_setup();
  8044. }
  8045. if (i == 0)
  8046. fail("Parse succeeded despite failing reallocator");
  8047. if (i == max_realloc_count)
  8048. fail("Parse failed at maximum reallocation count");
  8049. }
  8050. END_TEST
  8051. /* Test attribute enums in a #IMPLIED attribute forcing pool growth */
  8052. START_TEST(test_alloc_realloc_implied_attribute) {
  8053. /* Forcing this particular code path is a balancing act. The
  8054. * addition of the closing parenthesis and terminal NUL must be
  8055. * what pushes the string of enums over the 1024-byte limit,
  8056. * otherwise a different code path will pick up the realloc.
  8057. */
  8058. const char *text
  8059. = "<!DOCTYPE doc [\n"
  8060. "<!ELEMENT doc EMPTY>\n"
  8061. "<!ATTLIST doc a "
  8062. /* Each line is 64 characters */
  8063. "(ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
  8064. "|BBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
  8065. "|CBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
  8066. "|DBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
  8067. "|EBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
  8068. "|FBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
  8069. "|GBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
  8070. "|HBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
  8071. "|IBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
  8072. "|JBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
  8073. "|KBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
  8074. "|LBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
  8075. "|MBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
  8076. "|NBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
  8077. "|OBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
  8078. "|PBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMN)"
  8079. " #IMPLIED>\n"
  8080. "]><doc/>";
  8081. int i;
  8082. const int max_realloc_count = 10;
  8083. for (i = 0; i < max_realloc_count; i++) {
  8084. reallocation_count = i;
  8085. XML_SetAttlistDeclHandler(g_parser, dummy_attlist_decl_handler);
  8086. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  8087. != XML_STATUS_ERROR)
  8088. break;
  8089. /* See comment in test_alloc_parse_xdecl() */
  8090. alloc_teardown();
  8091. alloc_setup();
  8092. }
  8093. if (i == 0)
  8094. fail("Parse succeeded despite failing reallocator");
  8095. if (i == max_realloc_count)
  8096. fail("Parse failed at maximum reallocation count");
  8097. }
  8098. END_TEST
  8099. /* Test attribute enums in a defaulted attribute forcing pool growth */
  8100. START_TEST(test_alloc_realloc_default_attribute) {
  8101. /* Forcing this particular code path is a balancing act. The
  8102. * addition of the closing parenthesis and terminal NUL must be
  8103. * what pushes the string of enums over the 1024-byte limit,
  8104. * otherwise a different code path will pick up the realloc.
  8105. */
  8106. const char *text
  8107. = "<!DOCTYPE doc [\n"
  8108. "<!ELEMENT doc EMPTY>\n"
  8109. "<!ATTLIST doc a "
  8110. /* Each line is 64 characters */
  8111. "(ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
  8112. "|BBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
  8113. "|CBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
  8114. "|DBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
  8115. "|EBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
  8116. "|FBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
  8117. "|GBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
  8118. "|HBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
  8119. "|IBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
  8120. "|JBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
  8121. "|KBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
  8122. "|LBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
  8123. "|MBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
  8124. "|NBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
  8125. "|OBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO"
  8126. "|PBCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMN)"
  8127. " 'ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNO'"
  8128. ">\n]><doc/>";
  8129. int i;
  8130. const int max_realloc_count = 10;
  8131. for (i = 0; i < max_realloc_count; i++) {
  8132. reallocation_count = i;
  8133. XML_SetAttlistDeclHandler(g_parser, dummy_attlist_decl_handler);
  8134. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  8135. != XML_STATUS_ERROR)
  8136. break;
  8137. /* See comment in test_alloc_parse_xdecl() */
  8138. alloc_teardown();
  8139. alloc_setup();
  8140. }
  8141. if (i == 0)
  8142. fail("Parse succeeded despite failing reallocator");
  8143. if (i == max_realloc_count)
  8144. fail("Parse failed at maximum reallocation count");
  8145. }
  8146. END_TEST
  8147. /* Test long notation name with dodgy allocator */
  8148. START_TEST(test_alloc_notation) {
  8149. const char *text
  8150. = "<!DOCTYPE doc [\n"
  8151. "<!NOTATION "
  8152. /* Each line is 64 characters */
  8153. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8154. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8155. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8156. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8157. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8158. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8159. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8160. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8161. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8162. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8163. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8164. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8165. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8166. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8167. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8168. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8169. " SYSTEM 'http://example.org/n'>\n"
  8170. "<!ENTITY e SYSTEM 'http://example.org/e' NDATA "
  8171. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8172. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8173. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8174. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8175. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8176. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8177. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8178. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8179. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8180. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8181. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8182. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8183. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8184. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8185. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8186. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8187. ">\n"
  8188. "<!ELEMENT doc EMPTY>\n"
  8189. "]>\n<doc/>";
  8190. int i;
  8191. const int max_alloc_count = 20;
  8192. for (i = 0; i < max_alloc_count; i++) {
  8193. allocation_count = i;
  8194. dummy_handler_flags = 0;
  8195. XML_SetNotationDeclHandler(g_parser, dummy_notation_decl_handler);
  8196. XML_SetEntityDeclHandler(g_parser, dummy_entity_decl_handler);
  8197. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  8198. != XML_STATUS_ERROR)
  8199. break;
  8200. /* See comment in test_alloc_parse_xdecl() */
  8201. alloc_teardown();
  8202. alloc_setup();
  8203. }
  8204. if (i == 0)
  8205. fail("Parse succeeded despite allocation failures");
  8206. if (i == max_alloc_count)
  8207. fail("Parse failed at maximum allocation count");
  8208. if (dummy_handler_flags
  8209. != (DUMMY_ENTITY_DECL_HANDLER_FLAG | DUMMY_NOTATION_DECL_HANDLER_FLAG))
  8210. fail("Entity declaration handler not called");
  8211. }
  8212. END_TEST
  8213. /* Test public notation with dodgy allocator */
  8214. START_TEST(test_alloc_public_notation) {
  8215. const char *text
  8216. = "<!DOCTYPE doc [\n"
  8217. "<!NOTATION note PUBLIC '"
  8218. /* 64 characters per line */
  8219. "http://example.com/a/long/enough/name/to/trigger/pool/growth/zz/"
  8220. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  8221. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  8222. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  8223. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  8224. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  8225. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  8226. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  8227. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  8228. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  8229. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  8230. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  8231. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  8232. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  8233. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  8234. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  8235. "' 'foo'>\n"
  8236. "<!ENTITY e SYSTEM 'http://example.com/e' NDATA note>\n"
  8237. "<!ELEMENT doc EMPTY>\n"
  8238. "]>\n<doc/>";
  8239. int i;
  8240. const int max_alloc_count = 20;
  8241. for (i = 0; i < max_alloc_count; i++) {
  8242. allocation_count = i;
  8243. dummy_handler_flags = 0;
  8244. XML_SetNotationDeclHandler(g_parser, dummy_notation_decl_handler);
  8245. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  8246. != XML_STATUS_ERROR)
  8247. break;
  8248. /* See comment in test_alloc_parse_xdecl() */
  8249. alloc_teardown();
  8250. alloc_setup();
  8251. }
  8252. if (i == 0)
  8253. fail("Parse succeeded despite allocation failures");
  8254. if (i == max_alloc_count)
  8255. fail("Parse failed at maximum allocation count");
  8256. if (dummy_handler_flags != DUMMY_NOTATION_DECL_HANDLER_FLAG)
  8257. fail("Notation handler not called");
  8258. }
  8259. END_TEST
  8260. /* Test public notation with dodgy allocator */
  8261. START_TEST(test_alloc_system_notation) {
  8262. const char *text
  8263. = "<!DOCTYPE doc [\n"
  8264. "<!NOTATION note SYSTEM '"
  8265. /* 64 characters per line */
  8266. "http://example.com/a/long/enough/name/to/trigger/pool/growth/zz/"
  8267. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  8268. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  8269. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  8270. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  8271. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  8272. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  8273. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  8274. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  8275. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  8276. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  8277. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  8278. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  8279. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  8280. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  8281. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  8282. "'>\n"
  8283. "<!ENTITY e SYSTEM 'http://example.com/e' NDATA note>\n"
  8284. "<!ELEMENT doc EMPTY>\n"
  8285. "]>\n<doc/>";
  8286. int i;
  8287. const int max_alloc_count = 20;
  8288. for (i = 0; i < max_alloc_count; i++) {
  8289. allocation_count = i;
  8290. dummy_handler_flags = 0;
  8291. XML_SetNotationDeclHandler(g_parser, dummy_notation_decl_handler);
  8292. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  8293. != XML_STATUS_ERROR)
  8294. break;
  8295. /* See comment in test_alloc_parse_xdecl() */
  8296. alloc_teardown();
  8297. alloc_setup();
  8298. }
  8299. if (i == 0)
  8300. fail("Parse succeeded despite allocation failures");
  8301. if (i == max_alloc_count)
  8302. fail("Parse failed at maximum allocation count");
  8303. if (dummy_handler_flags != DUMMY_NOTATION_DECL_HANDLER_FLAG)
  8304. fail("Notation handler not called");
  8305. }
  8306. END_TEST
  8307. START_TEST(test_alloc_nested_groups) {
  8308. const char *text
  8309. = "<!DOCTYPE doc [\n"
  8310. "<!ELEMENT doc "
  8311. /* Sixteen elements per line */
  8312. "(e,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,"
  8313. "(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?"
  8314. "))))))))))))))))))))))))))))))))>\n"
  8315. "<!ELEMENT e EMPTY>"
  8316. "]>\n"
  8317. "<doc><e/></doc>";
  8318. CharData storage;
  8319. int i;
  8320. const int max_alloc_count = 20;
  8321. for (i = 0; i < max_alloc_count; i++) {
  8322. allocation_count = i;
  8323. CharData_Init(&storage);
  8324. XML_SetElementDeclHandler(g_parser, dummy_element_decl_handler);
  8325. XML_SetStartElementHandler(g_parser, record_element_start_handler);
  8326. XML_SetUserData(g_parser, &storage);
  8327. dummy_handler_flags = 0;
  8328. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  8329. != XML_STATUS_ERROR)
  8330. break;
  8331. /* See comment in test_alloc_parse_xdecl() */
  8332. alloc_teardown();
  8333. alloc_setup();
  8334. }
  8335. if (i == 0)
  8336. fail("Parse succeeded despite failing reallocator");
  8337. if (i == max_alloc_count)
  8338. fail("Parse failed at maximum reallocation count");
  8339. CharData_CheckXMLChars(&storage, XCS("doce"));
  8340. if (dummy_handler_flags != DUMMY_ELEMENT_DECL_HANDLER_FLAG)
  8341. fail("Element handler not fired");
  8342. }
  8343. END_TEST
  8344. START_TEST(test_alloc_realloc_nested_groups) {
  8345. const char *text
  8346. = "<!DOCTYPE doc [\n"
  8347. "<!ELEMENT doc "
  8348. /* Sixteen elements per line */
  8349. "(e,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,"
  8350. "(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?,(e?"
  8351. "))))))))))))))))))))))))))))))))>\n"
  8352. "<!ELEMENT e EMPTY>"
  8353. "]>\n"
  8354. "<doc><e/></doc>";
  8355. CharData storage;
  8356. int i;
  8357. const int max_realloc_count = 10;
  8358. for (i = 0; i < max_realloc_count; i++) {
  8359. reallocation_count = i;
  8360. CharData_Init(&storage);
  8361. XML_SetElementDeclHandler(g_parser, dummy_element_decl_handler);
  8362. XML_SetStartElementHandler(g_parser, record_element_start_handler);
  8363. XML_SetUserData(g_parser, &storage);
  8364. dummy_handler_flags = 0;
  8365. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  8366. != XML_STATUS_ERROR)
  8367. break;
  8368. /* See comment in test_alloc_parse_xdecl() */
  8369. alloc_teardown();
  8370. alloc_setup();
  8371. }
  8372. if (i == 0)
  8373. fail("Parse succeeded despite failing reallocator");
  8374. if (i == max_realloc_count)
  8375. fail("Parse failed at maximum reallocation count");
  8376. CharData_CheckXMLChars(&storage, XCS("doce"));
  8377. if (dummy_handler_flags != DUMMY_ELEMENT_DECL_HANDLER_FLAG)
  8378. fail("Element handler not fired");
  8379. }
  8380. END_TEST
  8381. START_TEST(test_alloc_large_group) {
  8382. const char *text = "<!DOCTYPE doc [\n"
  8383. "<!ELEMENT doc ("
  8384. "a1|a2|a3|a4|a5|a6|a7|a8|"
  8385. "b1|b2|b3|b4|b5|b6|b7|b8|"
  8386. "c1|c2|c3|c4|c5|c6|c7|c8|"
  8387. "d1|d2|d3|d4|d5|d6|d7|d8|"
  8388. "e1"
  8389. ")+>\n"
  8390. "]>\n"
  8391. "<doc>\n"
  8392. "<a1/>\n"
  8393. "</doc>\n";
  8394. int i;
  8395. const int max_alloc_count = 50;
  8396. for (i = 0; i < max_alloc_count; i++) {
  8397. allocation_count = i;
  8398. XML_SetElementDeclHandler(g_parser, dummy_element_decl_handler);
  8399. dummy_handler_flags = 0;
  8400. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  8401. != XML_STATUS_ERROR)
  8402. break;
  8403. /* See comment in test_alloc_parse_xdecl() */
  8404. alloc_teardown();
  8405. alloc_setup();
  8406. }
  8407. if (i == 0)
  8408. fail("Parse succeeded despite failing allocator");
  8409. if (i == max_alloc_count)
  8410. fail("Parse failed at maximum allocation count");
  8411. if (dummy_handler_flags != DUMMY_ELEMENT_DECL_HANDLER_FLAG)
  8412. fail("Element handler flag not raised");
  8413. }
  8414. END_TEST
  8415. START_TEST(test_alloc_realloc_group_choice) {
  8416. const char *text = "<!DOCTYPE doc [\n"
  8417. "<!ELEMENT doc ("
  8418. "a1|a2|a3|a4|a5|a6|a7|a8|"
  8419. "b1|b2|b3|b4|b5|b6|b7|b8|"
  8420. "c1|c2|c3|c4|c5|c6|c7|c8|"
  8421. "d1|d2|d3|d4|d5|d6|d7|d8|"
  8422. "e1"
  8423. ")+>\n"
  8424. "]>\n"
  8425. "<doc>\n"
  8426. "<a1/>\n"
  8427. "<b2 attr='foo'>This is a foo</b2>\n"
  8428. "<c3></c3>\n"
  8429. "</doc>\n";
  8430. int i;
  8431. const int max_realloc_count = 10;
  8432. for (i = 0; i < max_realloc_count; i++) {
  8433. reallocation_count = i;
  8434. XML_SetElementDeclHandler(g_parser, dummy_element_decl_handler);
  8435. dummy_handler_flags = 0;
  8436. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  8437. != XML_STATUS_ERROR)
  8438. break;
  8439. /* See comment in test_alloc_parse_xdecl() */
  8440. alloc_teardown();
  8441. alloc_setup();
  8442. }
  8443. if (i == 0)
  8444. fail("Parse succeeded despite failing reallocator");
  8445. if (i == max_realloc_count)
  8446. fail("Parse failed at maximum reallocation count");
  8447. if (dummy_handler_flags != DUMMY_ELEMENT_DECL_HANDLER_FLAG)
  8448. fail("Element handler flag not raised");
  8449. }
  8450. END_TEST
  8451. START_TEST(test_alloc_pi_in_epilog) {
  8452. const char *text = "<doc></doc>\n"
  8453. "<?pi in epilog?>";
  8454. int i;
  8455. const int max_alloc_count = 15;
  8456. for (i = 0; i < max_alloc_count; i++) {
  8457. allocation_count = i;
  8458. XML_SetProcessingInstructionHandler(g_parser, dummy_pi_handler);
  8459. dummy_handler_flags = 0;
  8460. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  8461. != XML_STATUS_ERROR)
  8462. break;
  8463. /* See comment in test_alloc_parse_xdecl() */
  8464. alloc_teardown();
  8465. alloc_setup();
  8466. }
  8467. if (i == 0)
  8468. fail("Parse completed despite failing allocator");
  8469. if (i == max_alloc_count)
  8470. fail("Parse failed at maximum allocation count");
  8471. if (dummy_handler_flags != DUMMY_PI_HANDLER_FLAG)
  8472. fail("Processing instruction handler not invoked");
  8473. }
  8474. END_TEST
  8475. START_TEST(test_alloc_comment_in_epilog) {
  8476. const char *text = "<doc></doc>\n"
  8477. "<!-- comment in epilog -->";
  8478. int i;
  8479. const int max_alloc_count = 15;
  8480. for (i = 0; i < max_alloc_count; i++) {
  8481. allocation_count = i;
  8482. XML_SetCommentHandler(g_parser, dummy_comment_handler);
  8483. dummy_handler_flags = 0;
  8484. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  8485. != XML_STATUS_ERROR)
  8486. break;
  8487. /* See comment in test_alloc_parse_xdecl() */
  8488. alloc_teardown();
  8489. alloc_setup();
  8490. }
  8491. if (i == 0)
  8492. fail("Parse completed despite failing allocator");
  8493. if (i == max_alloc_count)
  8494. fail("Parse failed at maximum allocation count");
  8495. if (dummy_handler_flags != DUMMY_COMMENT_HANDLER_FLAG)
  8496. fail("Processing instruction handler not invoked");
  8497. }
  8498. END_TEST
  8499. START_TEST(test_alloc_realloc_long_attribute_value) {
  8500. const char *text
  8501. = "<!DOCTYPE doc [<!ENTITY foo '"
  8502. /* Each line is 64 characters */
  8503. "This entity will be substituted as an attribute value, and is "
  8504. "calculated to be exactly long enough that the terminating NUL "
  8505. "that the library adds internally will trigger the string pool to"
  8506. "grow. GHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8507. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8508. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8509. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8510. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8511. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8512. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8513. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8514. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8515. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8516. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8517. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8518. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8519. "'>]>\n"
  8520. "<doc a='&foo;'></doc>";
  8521. int i;
  8522. const int max_realloc_count = 10;
  8523. for (i = 0; i < max_realloc_count; i++) {
  8524. reallocation_count = i;
  8525. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  8526. != XML_STATUS_ERROR)
  8527. break;
  8528. /* See comment in test_alloc_parse_xdecl() */
  8529. alloc_teardown();
  8530. alloc_setup();
  8531. }
  8532. if (i == 0)
  8533. fail("Parse succeeded despite failing reallocator");
  8534. if (i == max_realloc_count)
  8535. fail("Parse failed at maximum reallocation count");
  8536. }
  8537. END_TEST
  8538. START_TEST(test_alloc_attribute_whitespace) {
  8539. const char *text = "<doc a=' '></doc>";
  8540. int i;
  8541. const int max_alloc_count = 15;
  8542. for (i = 0; i < max_alloc_count; i++) {
  8543. allocation_count = i;
  8544. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  8545. != XML_STATUS_ERROR)
  8546. break;
  8547. /* See comment in test_alloc_parse_xdecl() */
  8548. alloc_teardown();
  8549. alloc_setup();
  8550. }
  8551. if (i == 0)
  8552. fail("Parse succeeded despite failing allocator");
  8553. if (i == max_alloc_count)
  8554. fail("Parse failed at maximum allocation count");
  8555. }
  8556. END_TEST
  8557. START_TEST(test_alloc_attribute_predefined_entity) {
  8558. const char *text = "<doc a='&amp;'></doc>";
  8559. int i;
  8560. const int max_alloc_count = 15;
  8561. for (i = 0; i < max_alloc_count; i++) {
  8562. allocation_count = i;
  8563. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  8564. != XML_STATUS_ERROR)
  8565. break;
  8566. /* See comment in test_alloc_parse_xdecl() */
  8567. alloc_teardown();
  8568. alloc_setup();
  8569. }
  8570. if (i == 0)
  8571. fail("Parse succeeded despite failing allocator");
  8572. if (i == max_alloc_count)
  8573. fail("Parse failed at maximum allocation count");
  8574. }
  8575. END_TEST
  8576. /* Test that a character reference at the end of a suitably long
  8577. * default value for an attribute can trigger pool growth, and recovers
  8578. * if the allocator fails on it.
  8579. */
  8580. START_TEST(test_alloc_long_attr_default_with_char_ref) {
  8581. const char *text
  8582. = "<!DOCTYPE doc [<!ATTLIST doc a CDATA '"
  8583. /* 64 characters per line */
  8584. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8585. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8586. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8587. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8588. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8589. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8590. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8591. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8592. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8593. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8594. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8595. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8596. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8597. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8598. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8599. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHI"
  8600. "&#x31;'>]>\n"
  8601. "<doc/>";
  8602. int i;
  8603. const int max_alloc_count = 20;
  8604. for (i = 0; i < max_alloc_count; i++) {
  8605. allocation_count = i;
  8606. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  8607. != XML_STATUS_ERROR)
  8608. break;
  8609. /* See comment in test_alloc_parse_xdecl() */
  8610. alloc_teardown();
  8611. alloc_setup();
  8612. }
  8613. if (i == 0)
  8614. fail("Parse succeeded despite failing allocator");
  8615. if (i == max_alloc_count)
  8616. fail("Parse failed at maximum allocation count");
  8617. }
  8618. END_TEST
  8619. /* Test that a long character reference substitution triggers a pool
  8620. * expansion correctly for an attribute value.
  8621. */
  8622. START_TEST(test_alloc_long_attr_value) {
  8623. const char *text
  8624. = "<!DOCTYPE test [<!ENTITY foo '\n"
  8625. /* 64 characters per line */
  8626. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8627. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8628. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8629. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8630. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8631. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8632. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8633. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8634. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8635. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8636. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8637. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8638. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8639. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8640. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8641. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8642. "'>]>\n"
  8643. "<test a='&foo;'/>";
  8644. int i;
  8645. const int max_alloc_count = 25;
  8646. for (i = 0; i < max_alloc_count; i++) {
  8647. allocation_count = i;
  8648. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  8649. != XML_STATUS_ERROR)
  8650. break;
  8651. /* See comment in test_alloc_parse_xdecl() */
  8652. alloc_teardown();
  8653. alloc_setup();
  8654. }
  8655. if (i == 0)
  8656. fail("Parse succeeded despite failing allocator");
  8657. if (i == max_alloc_count)
  8658. fail("Parse failed at maximum allocation count");
  8659. }
  8660. END_TEST
  8661. /* Test that an error in a nested parameter entity substitution is
  8662. * handled correctly. It seems unlikely that the code path being
  8663. * exercised can be reached purely by carefully crafted XML, but an
  8664. * allocation error in the right place will definitely do it.
  8665. */
  8666. START_TEST(test_alloc_nested_entities) {
  8667. const char *text = "<!DOCTYPE doc SYSTEM 'http://example.org/one.ent'>\n"
  8668. "<doc />";
  8669. ExtFaults test_data
  8670. = {"<!ENTITY % pe1 '"
  8671. /* 64 characters per line */
  8672. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8673. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8674. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8675. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8676. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8677. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8678. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8679. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8680. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8681. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8682. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8683. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8684. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8685. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8686. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8687. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8688. "'>\n"
  8689. "<!ENTITY % pe2 '%pe1;'>\n"
  8690. "%pe2;",
  8691. "Memory Fail not faulted", NULL, XML_ERROR_NO_MEMORY};
  8692. /* Causes an allocation error in a nested storeEntityValue() */
  8693. allocation_count = 12;
  8694. XML_SetUserData(g_parser, &test_data);
  8695. XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
  8696. XML_SetExternalEntityRefHandler(g_parser, external_entity_faulter);
  8697. expect_failure(text, XML_ERROR_EXTERNAL_ENTITY_HANDLING,
  8698. "Entity allocation failure not noted");
  8699. }
  8700. END_TEST
  8701. START_TEST(test_alloc_realloc_param_entity_newline) {
  8702. const char *text = "<!DOCTYPE doc SYSTEM 'http://example.org/'>\n"
  8703. "<doc/>";
  8704. char dtd_text[]
  8705. = "<!ENTITY % pe '<!ATTLIST doc att CDATA \""
  8706. /* 64 characters per line */
  8707. "This default value is carefully crafted so that the carriage "
  8708. "return right at the end of the entity string causes an internal "
  8709. "string pool to have to grow. This allows us to test the alloc "
  8710. "failure path from that point. OPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8711. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8712. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8713. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8714. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8715. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8716. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8717. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8718. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8719. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8720. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8721. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8722. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDE"
  8723. "\">\n'>"
  8724. "%pe;\n";
  8725. int i;
  8726. const int max_realloc_count = 5;
  8727. for (i = 0; i < max_realloc_count; i++) {
  8728. reallocation_count = i;
  8729. XML_SetUserData(g_parser, dtd_text);
  8730. XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
  8731. XML_SetExternalEntityRefHandler(g_parser, external_entity_alloc);
  8732. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  8733. != XML_STATUS_ERROR)
  8734. break;
  8735. /* See comment in test_alloc_parse_xdecl() */
  8736. alloc_teardown();
  8737. alloc_setup();
  8738. }
  8739. if (i == 0)
  8740. fail("Parse succeeded despite failing reallocator");
  8741. if (i == max_realloc_count)
  8742. fail("Parse failed at maximum reallocation count");
  8743. }
  8744. END_TEST
  8745. START_TEST(test_alloc_realloc_ce_extends_pe) {
  8746. const char *text = "<!DOCTYPE doc SYSTEM 'http://example.org/'>\n"
  8747. "<doc/>";
  8748. char dtd_text[]
  8749. = "<!ENTITY % pe '<!ATTLIST doc att CDATA \""
  8750. /* 64 characters per line */
  8751. "This default value is carefully crafted so that the character "
  8752. "entity at the end causes an internal string pool to have to "
  8753. "grow. This allows us to test the allocation failure path from "
  8754. "that point onwards. EFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8755. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8756. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8757. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8758. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8759. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8760. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8761. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8762. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8763. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8764. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8765. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  8766. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFG&#x51;"
  8767. "\">\n'>"
  8768. "%pe;\n";
  8769. int i;
  8770. const int max_realloc_count = 5;
  8771. for (i = 0; i < max_realloc_count; i++) {
  8772. reallocation_count = i;
  8773. XML_SetUserData(g_parser, dtd_text);
  8774. XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
  8775. XML_SetExternalEntityRefHandler(g_parser, external_entity_alloc);
  8776. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  8777. != XML_STATUS_ERROR)
  8778. break;
  8779. /* See comment in test_alloc_parse_xdecl() */
  8780. alloc_teardown();
  8781. alloc_setup();
  8782. }
  8783. if (i == 0)
  8784. fail("Parse succeeded despite failing reallocator");
  8785. if (i == max_realloc_count)
  8786. fail("Parse failed at maximum reallocation count");
  8787. }
  8788. END_TEST
  8789. START_TEST(test_alloc_realloc_attributes) {
  8790. const char *text = "<!DOCTYPE doc [\n"
  8791. " <!ATTLIST doc\n"
  8792. " a1 (a|b|c) 'a'\n"
  8793. " a2 (foo|bar) #IMPLIED\n"
  8794. " a3 NMTOKEN #IMPLIED\n"
  8795. " a4 NMTOKENS #IMPLIED\n"
  8796. " a5 ID #IMPLIED\n"
  8797. " a6 IDREF #IMPLIED\n"
  8798. " a7 IDREFS #IMPLIED\n"
  8799. " a8 ENTITY #IMPLIED\n"
  8800. " a9 ENTITIES #IMPLIED\n"
  8801. " a10 CDATA #IMPLIED\n"
  8802. " >]>\n"
  8803. "<doc>wombat</doc>\n";
  8804. int i;
  8805. const int max_realloc_count = 5;
  8806. for (i = 0; i < max_realloc_count; i++) {
  8807. reallocation_count = i;
  8808. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  8809. != XML_STATUS_ERROR)
  8810. break;
  8811. /* See comment in test_alloc_parse_xdecl() */
  8812. alloc_teardown();
  8813. alloc_setup();
  8814. }
  8815. if (i == 0)
  8816. fail("Parse succeeded despite failing reallocator");
  8817. if (i == max_realloc_count)
  8818. fail("Parse failed at maximum reallocation count");
  8819. }
  8820. END_TEST
  8821. START_TEST(test_alloc_long_doc_name) {
  8822. const char *text =
  8823. /* 64 characters per line */
  8824. "<LongRootElementNameThatWillCauseTheNextAllocationToExpandTheStr"
  8825. "ingPoolForTheDTDQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  8826. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  8827. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  8828. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  8829. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  8830. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  8831. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  8832. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  8833. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  8834. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  8835. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  8836. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  8837. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  8838. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  8839. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  8840. " a='1'/>";
  8841. int i;
  8842. const int max_alloc_count = 20;
  8843. for (i = 0; i < max_alloc_count; i++) {
  8844. allocation_count = i;
  8845. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  8846. != XML_STATUS_ERROR)
  8847. break;
  8848. /* See comment in test_alloc_parse_xdecl() */
  8849. alloc_teardown();
  8850. alloc_setup();
  8851. }
  8852. if (i == 0)
  8853. fail("Parsing worked despite failing reallocations");
  8854. else if (i == max_alloc_count)
  8855. fail("Parsing failed even at max reallocation count");
  8856. }
  8857. END_TEST
  8858. START_TEST(test_alloc_long_base) {
  8859. const char *text = "<!DOCTYPE doc [\n"
  8860. " <!ENTITY e SYSTEM 'foo'>\n"
  8861. "]>\n"
  8862. "<doc>&e;</doc>";
  8863. char entity_text[] = "Hello world";
  8864. const XML_Char *base =
  8865. /* 64 characters per line */
  8866. /* clang-format off */
  8867. XCS("LongBaseURI/that/will/overflow/an/internal/buffer/and/cause/it/t")
  8868. XCS("o/have/to/grow/PQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/")
  8869. XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/")
  8870. XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/")
  8871. XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/")
  8872. XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/")
  8873. XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/")
  8874. XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/")
  8875. XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/")
  8876. XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/")
  8877. XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/")
  8878. XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/")
  8879. XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/")
  8880. XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/")
  8881. XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/")
  8882. XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/");
  8883. /* clang-format on */
  8884. int i;
  8885. const int max_alloc_count = 25;
  8886. for (i = 0; i < max_alloc_count; i++) {
  8887. allocation_count = i;
  8888. XML_SetUserData(g_parser, entity_text);
  8889. XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
  8890. XML_SetExternalEntityRefHandler(g_parser, external_entity_alloc);
  8891. if (XML_SetBase(g_parser, base) == XML_STATUS_ERROR) {
  8892. XML_ParserReset(g_parser, NULL);
  8893. continue;
  8894. }
  8895. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  8896. != XML_STATUS_ERROR)
  8897. break;
  8898. /* See comment in test_alloc_parse_xdecl() */
  8899. alloc_teardown();
  8900. alloc_setup();
  8901. }
  8902. if (i == 0)
  8903. fail("Parsing worked despite failing allocations");
  8904. else if (i == max_alloc_count)
  8905. fail("Parsing failed even at max allocation count");
  8906. }
  8907. END_TEST
  8908. START_TEST(test_alloc_long_public_id) {
  8909. const char *text
  8910. = "<!DOCTYPE doc [\n"
  8911. " <!ENTITY e PUBLIC '"
  8912. /* 64 characters per line */
  8913. "LongPublicIDThatShouldResultInAnInternalStringPoolGrowingAtASpec"
  8914. "ificMomentKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
  8915. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
  8916. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
  8917. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
  8918. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
  8919. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
  8920. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
  8921. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
  8922. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
  8923. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
  8924. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
  8925. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
  8926. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
  8927. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
  8928. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
  8929. "' 'bar'>\n"
  8930. "]>\n"
  8931. "<doc>&e;</doc>";
  8932. char entity_text[] = "Hello world";
  8933. int i;
  8934. const int max_alloc_count = 40;
  8935. for (i = 0; i < max_alloc_count; i++) {
  8936. allocation_count = i;
  8937. XML_SetUserData(g_parser, entity_text);
  8938. XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
  8939. XML_SetExternalEntityRefHandler(g_parser, external_entity_alloc);
  8940. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  8941. != XML_STATUS_ERROR)
  8942. break;
  8943. /* See comment in test_alloc_parse_xdecl() */
  8944. alloc_teardown();
  8945. alloc_setup();
  8946. }
  8947. if (i == 0)
  8948. fail("Parsing worked despite failing allocations");
  8949. else if (i == max_alloc_count)
  8950. fail("Parsing failed even at max allocation count");
  8951. }
  8952. END_TEST
  8953. START_TEST(test_alloc_long_entity_value) {
  8954. const char *text
  8955. = "<!DOCTYPE doc [\n"
  8956. " <!ENTITY e1 '"
  8957. /* 64 characters per line */
  8958. "Long entity value that should provoke a string pool to grow whil"
  8959. "e setting up to parse the external entity below. xyz0123456789AB"
  8960. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
  8961. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
  8962. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
  8963. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
  8964. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
  8965. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
  8966. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
  8967. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
  8968. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
  8969. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
  8970. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
  8971. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
  8972. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
  8973. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
  8974. "'>\n"
  8975. " <!ENTITY e2 SYSTEM 'bar'>\n"
  8976. "]>\n"
  8977. "<doc>&e2;</doc>";
  8978. char entity_text[] = "Hello world";
  8979. int i;
  8980. const int max_alloc_count = 40;
  8981. for (i = 0; i < max_alloc_count; i++) {
  8982. allocation_count = i;
  8983. XML_SetUserData(g_parser, entity_text);
  8984. XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
  8985. XML_SetExternalEntityRefHandler(g_parser, external_entity_alloc);
  8986. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  8987. != XML_STATUS_ERROR)
  8988. break;
  8989. /* See comment in test_alloc_parse_xdecl() */
  8990. alloc_teardown();
  8991. alloc_setup();
  8992. }
  8993. if (i == 0)
  8994. fail("Parsing worked despite failing allocations");
  8995. else if (i == max_alloc_count)
  8996. fail("Parsing failed even at max allocation count");
  8997. }
  8998. END_TEST
  8999. START_TEST(test_alloc_long_notation) {
  9000. const char *text
  9001. = "<!DOCTYPE doc [\n"
  9002. " <!NOTATION note SYSTEM '"
  9003. /* 64 characters per line */
  9004. "ALongNotationNameThatShouldProvokeStringPoolGrowthWhileCallingAn"
  9005. "ExternalEntityParserUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
  9006. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
  9007. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
  9008. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
  9009. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
  9010. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
  9011. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
  9012. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
  9013. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
  9014. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
  9015. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
  9016. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
  9017. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
  9018. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
  9019. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
  9020. "'>\n"
  9021. " <!ENTITY e1 SYSTEM 'foo' NDATA "
  9022. /* 64 characters per line */
  9023. "ALongNotationNameThatShouldProvokeStringPoolGrowthWhileCallingAn"
  9024. "ExternalEntityParserUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
  9025. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
  9026. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
  9027. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
  9028. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
  9029. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
  9030. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
  9031. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
  9032. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
  9033. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
  9034. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
  9035. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
  9036. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
  9037. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
  9038. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AB"
  9039. ">\n"
  9040. " <!ENTITY e2 SYSTEM 'bar'>\n"
  9041. "]>\n"
  9042. "<doc>&e2;</doc>";
  9043. ExtOption options[]
  9044. = {{XCS("foo"), "Entity Foo"}, {XCS("bar"), "Entity Bar"}, {NULL, NULL}};
  9045. int i;
  9046. const int max_alloc_count = 40;
  9047. for (i = 0; i < max_alloc_count; i++) {
  9048. allocation_count = i;
  9049. XML_SetUserData(g_parser, options);
  9050. XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
  9051. XML_SetExternalEntityRefHandler(g_parser, external_entity_optioner);
  9052. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  9053. != XML_STATUS_ERROR)
  9054. break;
  9055. /* See comment in test_alloc_parse_xdecl() */
  9056. alloc_teardown();
  9057. alloc_setup();
  9058. }
  9059. if (i == 0)
  9060. fail("Parsing worked despite failing allocations");
  9061. else if (i == max_alloc_count)
  9062. fail("Parsing failed even at max allocation count");
  9063. }
  9064. END_TEST
  9065. static void
  9066. nsalloc_setup(void) {
  9067. XML_Memory_Handling_Suite memsuite = {duff_allocator, duff_reallocator, free};
  9068. XML_Char ns_sep[2] = {' ', '\0'};
  9069. /* Ensure the parser creation will go through */
  9070. allocation_count = ALLOC_ALWAYS_SUCCEED;
  9071. reallocation_count = REALLOC_ALWAYS_SUCCEED;
  9072. g_parser = XML_ParserCreate_MM(NULL, &memsuite, ns_sep);
  9073. if (g_parser == NULL)
  9074. fail("Parser not created");
  9075. }
  9076. static void
  9077. nsalloc_teardown(void) {
  9078. basic_teardown();
  9079. }
  9080. /* Test the effects of allocation failure in simple namespace parsing.
  9081. * Based on test_ns_default_with_empty_uri()
  9082. */
  9083. START_TEST(test_nsalloc_xmlns) {
  9084. const char *text = "<doc xmlns='http://example.org/'>\n"
  9085. " <e xmlns=''/>\n"
  9086. "</doc>";
  9087. unsigned int i;
  9088. const unsigned int max_alloc_count = 30;
  9089. for (i = 0; i < max_alloc_count; i++) {
  9090. allocation_count = i;
  9091. /* Exercise more code paths with a default handler */
  9092. XML_SetDefaultHandler(g_parser, dummy_default_handler);
  9093. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  9094. != XML_STATUS_ERROR)
  9095. break;
  9096. /* Resetting the parser is insufficient, because some memory
  9097. * allocations are cached within the parser. Instead we use
  9098. * the teardown and setup routines to ensure that we have the
  9099. * right sort of parser back in our hands.
  9100. */
  9101. nsalloc_teardown();
  9102. nsalloc_setup();
  9103. }
  9104. if (i == 0)
  9105. fail("Parsing worked despite failing allocations");
  9106. else if (i == max_alloc_count)
  9107. fail("Parsing failed even at maximum allocation count");
  9108. }
  9109. END_TEST
  9110. /* Test XML_ParseBuffer interface with namespace and a dicky allocator */
  9111. START_TEST(test_nsalloc_parse_buffer) {
  9112. const char *text = "<doc>Hello</doc>";
  9113. void *buffer;
  9114. /* Try a parse before the start of the world */
  9115. /* (Exercises new code path) */
  9116. if (XML_ParseBuffer(g_parser, 0, XML_FALSE) != XML_STATUS_ERROR)
  9117. fail("Pre-init XML_ParseBuffer not faulted");
  9118. if (XML_GetErrorCode(g_parser) != XML_ERROR_NO_BUFFER)
  9119. fail("Pre-init XML_ParseBuffer faulted for wrong reason");
  9120. buffer = XML_GetBuffer(g_parser, 1 /* any small number greater than 0 */);
  9121. if (buffer == NULL)
  9122. fail("Could not acquire parse buffer");
  9123. allocation_count = 0;
  9124. if (XML_ParseBuffer(g_parser, 0, XML_FALSE) != XML_STATUS_ERROR)
  9125. fail("Pre-init XML_ParseBuffer not faulted");
  9126. if (XML_GetErrorCode(g_parser) != XML_ERROR_NO_MEMORY)
  9127. fail("Pre-init XML_ParseBuffer faulted for wrong reason");
  9128. /* Now with actual memory allocation */
  9129. allocation_count = ALLOC_ALWAYS_SUCCEED;
  9130. if (XML_ParseBuffer(g_parser, 0, XML_FALSE) != XML_STATUS_OK)
  9131. xml_failure(g_parser);
  9132. /* Check that resuming an unsuspended parser is faulted */
  9133. if (XML_ResumeParser(g_parser) != XML_STATUS_ERROR)
  9134. fail("Resuming unsuspended parser not faulted");
  9135. if (XML_GetErrorCode(g_parser) != XML_ERROR_NOT_SUSPENDED)
  9136. xml_failure(g_parser);
  9137. /* Get the parser into suspended state */
  9138. XML_SetCharacterDataHandler(g_parser, clearing_aborting_character_handler);
  9139. resumable = XML_TRUE;
  9140. buffer = XML_GetBuffer(g_parser, (int)strlen(text));
  9141. if (buffer == NULL)
  9142. fail("Could not acquire parse buffer");
  9143. assert(buffer != NULL);
  9144. memcpy(buffer, text, strlen(text));
  9145. if (XML_ParseBuffer(g_parser, (int)strlen(text), XML_TRUE)
  9146. != XML_STATUS_SUSPENDED)
  9147. xml_failure(g_parser);
  9148. if (XML_GetErrorCode(g_parser) != XML_ERROR_NONE)
  9149. xml_failure(g_parser);
  9150. if (XML_ParseBuffer(g_parser, (int)strlen(text), XML_TRUE)
  9151. != XML_STATUS_ERROR)
  9152. fail("Suspended XML_ParseBuffer not faulted");
  9153. if (XML_GetErrorCode(g_parser) != XML_ERROR_SUSPENDED)
  9154. xml_failure(g_parser);
  9155. if (XML_GetBuffer(g_parser, (int)strlen(text)) != NULL)
  9156. fail("Suspended XML_GetBuffer not faulted");
  9157. /* Get it going again and complete the world */
  9158. XML_SetCharacterDataHandler(g_parser, NULL);
  9159. if (XML_ResumeParser(g_parser) != XML_STATUS_OK)
  9160. xml_failure(g_parser);
  9161. if (XML_ParseBuffer(g_parser, (int)strlen(text), XML_TRUE)
  9162. != XML_STATUS_ERROR)
  9163. fail("Post-finishing XML_ParseBuffer not faulted");
  9164. if (XML_GetErrorCode(g_parser) != XML_ERROR_FINISHED)
  9165. xml_failure(g_parser);
  9166. if (XML_GetBuffer(g_parser, (int)strlen(text)) != NULL)
  9167. fail("Post-finishing XML_GetBuffer not faulted");
  9168. }
  9169. END_TEST
  9170. /* Check handling of long prefix names (pool growth) */
  9171. START_TEST(test_nsalloc_long_prefix) {
  9172. const char *text
  9173. = "<"
  9174. /* 64 characters per line */
  9175. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9176. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9177. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9178. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9179. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9180. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9181. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9182. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9183. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9184. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9185. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9186. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9187. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9188. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9189. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9190. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9191. ":foo xmlns:"
  9192. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9193. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9194. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9195. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9196. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9197. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9198. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9199. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9200. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9201. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9202. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9203. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9204. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9205. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9206. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9207. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9208. "='http://example.org/'>"
  9209. "</"
  9210. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9211. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9212. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9213. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9214. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9215. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9216. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9217. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9218. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9219. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9220. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9221. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9222. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9223. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9224. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9225. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9226. ":foo>";
  9227. int i;
  9228. const int max_alloc_count = 40;
  9229. for (i = 0; i < max_alloc_count; i++) {
  9230. allocation_count = i;
  9231. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  9232. != XML_STATUS_ERROR)
  9233. break;
  9234. /* See comment in test_nsalloc_xmlns() */
  9235. nsalloc_teardown();
  9236. nsalloc_setup();
  9237. }
  9238. if (i == 0)
  9239. fail("Parsing worked despite failing allocations");
  9240. else if (i == max_alloc_count)
  9241. fail("Parsing failed even at max allocation count");
  9242. }
  9243. END_TEST
  9244. /* Check handling of long uri names (pool growth) */
  9245. START_TEST(test_nsalloc_long_uri) {
  9246. const char *text
  9247. = "<foo:e xmlns:foo='http://example.org/"
  9248. /* 64 characters per line */
  9249. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
  9250. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
  9251. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
  9252. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
  9253. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
  9254. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
  9255. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
  9256. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
  9257. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
  9258. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
  9259. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
  9260. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
  9261. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
  9262. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
  9263. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
  9264. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
  9265. "' bar:a='12'\n"
  9266. "xmlns:bar='http://example.org/"
  9267. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
  9268. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
  9269. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
  9270. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
  9271. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
  9272. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
  9273. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
  9274. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
  9275. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
  9276. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
  9277. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
  9278. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
  9279. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
  9280. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
  9281. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
  9282. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789A/"
  9283. "'>"
  9284. "</foo:e>";
  9285. int i;
  9286. const int max_alloc_count = 40;
  9287. for (i = 0; i < max_alloc_count; i++) {
  9288. allocation_count = i;
  9289. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  9290. != XML_STATUS_ERROR)
  9291. break;
  9292. /* See comment in test_nsalloc_xmlns() */
  9293. nsalloc_teardown();
  9294. nsalloc_setup();
  9295. }
  9296. if (i == 0)
  9297. fail("Parsing worked despite failing allocations");
  9298. else if (i == max_alloc_count)
  9299. fail("Parsing failed even at max allocation count");
  9300. }
  9301. END_TEST
  9302. /* Test handling of long attribute names with prefixes */
  9303. START_TEST(test_nsalloc_long_attr) {
  9304. const char *text
  9305. = "<foo:e xmlns:foo='http://example.org/' bar:"
  9306. /* 64 characters per line */
  9307. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9308. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9309. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9310. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9311. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9312. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9313. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9314. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9315. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9316. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9317. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9318. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9319. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9320. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9321. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9322. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9323. "='12'\n"
  9324. "xmlns:bar='http://example.org/'>"
  9325. "</foo:e>";
  9326. int i;
  9327. const int max_alloc_count = 40;
  9328. for (i = 0; i < max_alloc_count; i++) {
  9329. allocation_count = i;
  9330. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  9331. != XML_STATUS_ERROR)
  9332. break;
  9333. /* See comment in test_nsalloc_xmlns() */
  9334. nsalloc_teardown();
  9335. nsalloc_setup();
  9336. }
  9337. if (i == 0)
  9338. fail("Parsing worked despite failing allocations");
  9339. else if (i == max_alloc_count)
  9340. fail("Parsing failed even at max allocation count");
  9341. }
  9342. END_TEST
  9343. /* Test handling of an attribute name with a long namespace prefix */
  9344. START_TEST(test_nsalloc_long_attr_prefix) {
  9345. const char *text
  9346. = "<foo:e xmlns:foo='http://example.org/' "
  9347. /* 64 characters per line */
  9348. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9349. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9350. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9351. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9352. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9353. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9354. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9355. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9356. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9357. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9358. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9359. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9360. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9361. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9362. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9363. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9364. ":a='12'\n"
  9365. "xmlns:"
  9366. /* 64 characters per line */
  9367. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9368. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9369. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9370. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9371. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9372. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9373. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9374. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9375. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9376. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9377. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9378. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9379. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9380. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9381. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9382. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9383. "='http://example.org/'>"
  9384. "</foo:e>";
  9385. const XML_Char *elemstr[] = {
  9386. /* clang-format off */
  9387. XCS("http://example.org/ e foo"),
  9388. XCS("http://example.org/ a ")
  9389. XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ")
  9390. XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ")
  9391. XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ")
  9392. XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ")
  9393. XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ")
  9394. XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ")
  9395. XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ")
  9396. XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ")
  9397. XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ")
  9398. XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ")
  9399. XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ")
  9400. XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ")
  9401. XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ")
  9402. XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ")
  9403. XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ")
  9404. XCS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ")
  9405. /* clang-format on */
  9406. };
  9407. int i;
  9408. const int max_alloc_count = 40;
  9409. for (i = 0; i < max_alloc_count; i++) {
  9410. allocation_count = i;
  9411. XML_SetReturnNSTriplet(g_parser, XML_TRUE);
  9412. XML_SetUserData(g_parser, (void *)elemstr);
  9413. XML_SetElementHandler(g_parser, triplet_start_checker, triplet_end_checker);
  9414. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  9415. != XML_STATUS_ERROR)
  9416. break;
  9417. /* See comment in test_nsalloc_xmlns() */
  9418. nsalloc_teardown();
  9419. nsalloc_setup();
  9420. }
  9421. if (i == 0)
  9422. fail("Parsing worked despite failing allocations");
  9423. else if (i == max_alloc_count)
  9424. fail("Parsing failed even at max allocation count");
  9425. }
  9426. END_TEST
  9427. /* Test attribute handling in the face of a dodgy reallocator */
  9428. START_TEST(test_nsalloc_realloc_attributes) {
  9429. const char *text = "<foo:e xmlns:foo='http://example.org/' bar:a='12'\n"
  9430. " xmlns:bar='http://example.org/'>"
  9431. "</foo:e>";
  9432. int i;
  9433. const int max_realloc_count = 10;
  9434. for (i = 0; i < max_realloc_count; i++) {
  9435. reallocation_count = i;
  9436. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  9437. != XML_STATUS_ERROR)
  9438. break;
  9439. /* See comment in test_nsalloc_xmlns() */
  9440. nsalloc_teardown();
  9441. nsalloc_setup();
  9442. }
  9443. if (i == 0)
  9444. fail("Parsing worked despite failing reallocations");
  9445. else if (i == max_realloc_count)
  9446. fail("Parsing failed at max reallocation count");
  9447. }
  9448. END_TEST
  9449. /* Test long element names with namespaces under a failing allocator */
  9450. START_TEST(test_nsalloc_long_element) {
  9451. const char *text
  9452. = "<foo:thisisalongenoughelementnametotriggerareallocation\n"
  9453. " xmlns:foo='http://example.org/' bar:a='12'\n"
  9454. " xmlns:bar='http://example.org/'>"
  9455. "</foo:thisisalongenoughelementnametotriggerareallocation>";
  9456. const XML_Char *elemstr[]
  9457. = {XCS("http://example.org/")
  9458. XCS(" thisisalongenoughelementnametotriggerareallocation foo"),
  9459. XCS("http://example.org/ a bar")};
  9460. int i;
  9461. const int max_alloc_count = 30;
  9462. for (i = 0; i < max_alloc_count; i++) {
  9463. allocation_count = i;
  9464. XML_SetReturnNSTriplet(g_parser, XML_TRUE);
  9465. XML_SetUserData(g_parser, (void *)elemstr);
  9466. XML_SetElementHandler(g_parser, triplet_start_checker, triplet_end_checker);
  9467. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  9468. != XML_STATUS_ERROR)
  9469. break;
  9470. /* See comment in test_nsalloc_xmlns() */
  9471. nsalloc_teardown();
  9472. nsalloc_setup();
  9473. }
  9474. if (i == 0)
  9475. fail("Parsing worked despite failing reallocations");
  9476. else if (i == max_alloc_count)
  9477. fail("Parsing failed at max reallocation count");
  9478. }
  9479. END_TEST
  9480. /* Test the effects of reallocation failure when reassigning a
  9481. * binding.
  9482. *
  9483. * XML_ParserReset does not free the BINDING structures used by a
  9484. * parser, but instead adds them to an internal free list to be reused
  9485. * as necessary. Likewise the URI buffers allocated for the binding
  9486. * aren't freed, but kept attached to their existing binding. If the
  9487. * new binding has a longer URI, it will need reallocation. This test
  9488. * provokes that reallocation, and tests the control path if it fails.
  9489. */
  9490. START_TEST(test_nsalloc_realloc_binding_uri) {
  9491. const char *first = "<doc xmlns='http://example.org/'>\n"
  9492. " <e xmlns='' />\n"
  9493. "</doc>";
  9494. const char *second
  9495. = "<doc xmlns='http://example.org/long/enough/URI/to/reallocate/'>\n"
  9496. " <e xmlns='' />\n"
  9497. "</doc>";
  9498. unsigned i;
  9499. const unsigned max_realloc_count = 10;
  9500. /* First, do a full parse that will leave bindings around */
  9501. if (_XML_Parse_SINGLE_BYTES(g_parser, first, (int)strlen(first), XML_TRUE)
  9502. == XML_STATUS_ERROR)
  9503. xml_failure(g_parser);
  9504. /* Now repeat with a longer URI and a duff reallocator */
  9505. for (i = 0; i < max_realloc_count; i++) {
  9506. XML_ParserReset(g_parser, NULL);
  9507. reallocation_count = i;
  9508. if (_XML_Parse_SINGLE_BYTES(g_parser, second, (int)strlen(second), XML_TRUE)
  9509. != XML_STATUS_ERROR)
  9510. break;
  9511. }
  9512. if (i == 0)
  9513. fail("Parsing worked despite failing reallocation");
  9514. else if (i == max_realloc_count)
  9515. fail("Parsing failed at max reallocation count");
  9516. }
  9517. END_TEST
  9518. /* Check handling of long prefix names (pool growth) */
  9519. START_TEST(test_nsalloc_realloc_long_prefix) {
  9520. const char *text
  9521. = "<"
  9522. /* 64 characters per line */
  9523. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9524. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9525. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9526. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9527. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9528. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9529. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9530. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9531. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9532. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9533. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9534. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9535. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9536. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9537. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9538. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9539. ":foo xmlns:"
  9540. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9541. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9542. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9543. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9544. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9545. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9546. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9547. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9548. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9549. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9550. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9551. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9552. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9553. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9554. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9555. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9556. "='http://example.org/'>"
  9557. "</"
  9558. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9559. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9560. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9561. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9562. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9563. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9564. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9565. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9566. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9567. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9568. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9569. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9570. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9571. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9572. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9573. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9574. ":foo>";
  9575. int i;
  9576. const int max_realloc_count = 12;
  9577. for (i = 0; i < max_realloc_count; i++) {
  9578. reallocation_count = i;
  9579. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  9580. != XML_STATUS_ERROR)
  9581. break;
  9582. /* See comment in test_nsalloc_xmlns() */
  9583. nsalloc_teardown();
  9584. nsalloc_setup();
  9585. }
  9586. if (i == 0)
  9587. fail("Parsing worked despite failing reallocations");
  9588. else if (i == max_realloc_count)
  9589. fail("Parsing failed even at max reallocation count");
  9590. }
  9591. END_TEST
  9592. /* Check handling of even long prefix names (different code path) */
  9593. START_TEST(test_nsalloc_realloc_longer_prefix) {
  9594. const char *text
  9595. = "<"
  9596. /* 64 characters per line */
  9597. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9598. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9599. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9600. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9601. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9602. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9603. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9604. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9605. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9606. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9607. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9608. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9609. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9610. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9611. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9612. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9613. "Q:foo xmlns:"
  9614. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9615. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9616. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9617. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9618. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9619. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9620. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9621. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9622. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9623. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9624. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9625. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9626. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9627. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9628. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9629. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9630. "Q='http://example.org/'>"
  9631. "</"
  9632. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9633. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9634. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9635. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9636. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9637. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9638. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9639. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9640. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9641. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9642. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9643. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9644. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9645. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9646. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9647. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9648. "Q:foo>";
  9649. int i;
  9650. const int max_realloc_count = 12;
  9651. for (i = 0; i < max_realloc_count; i++) {
  9652. reallocation_count = i;
  9653. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  9654. != XML_STATUS_ERROR)
  9655. break;
  9656. /* See comment in test_nsalloc_xmlns() */
  9657. nsalloc_teardown();
  9658. nsalloc_setup();
  9659. }
  9660. if (i == 0)
  9661. fail("Parsing worked despite failing reallocations");
  9662. else if (i == max_realloc_count)
  9663. fail("Parsing failed even at max reallocation count");
  9664. }
  9665. END_TEST
  9666. START_TEST(test_nsalloc_long_namespace) {
  9667. const char *text1
  9668. = "<"
  9669. /* 64 characters per line */
  9670. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9671. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9672. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9673. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9674. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9675. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9676. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9677. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9678. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9679. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9680. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9681. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9682. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9683. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9684. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9685. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9686. ":e xmlns:"
  9687. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9688. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9689. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9690. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9691. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9692. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9693. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9694. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9695. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9696. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9697. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9698. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9699. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9700. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9701. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9702. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9703. "='http://example.org/'>\n";
  9704. const char *text2
  9705. = "<"
  9706. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9707. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9708. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9709. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9710. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9711. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9712. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9713. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9714. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9715. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9716. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9717. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9718. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9719. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9720. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9721. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9722. ":f "
  9723. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9724. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9725. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9726. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9727. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9728. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9729. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9730. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9731. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9732. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9733. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9734. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9735. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9736. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9737. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9738. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9739. ":attr='foo'/>\n"
  9740. "</"
  9741. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9742. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9743. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9744. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9745. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9746. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9747. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9748. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9749. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9750. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9751. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9752. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9753. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9754. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9755. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9756. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9757. ":e>";
  9758. int i;
  9759. const int max_alloc_count = 40;
  9760. for (i = 0; i < max_alloc_count; i++) {
  9761. allocation_count = i;
  9762. if (_XML_Parse_SINGLE_BYTES(g_parser, text1, (int)strlen(text1), XML_FALSE)
  9763. != XML_STATUS_ERROR
  9764. && _XML_Parse_SINGLE_BYTES(g_parser, text2, (int)strlen(text2),
  9765. XML_TRUE)
  9766. != XML_STATUS_ERROR)
  9767. break;
  9768. /* See comment in test_nsalloc_xmlns() */
  9769. nsalloc_teardown();
  9770. nsalloc_setup();
  9771. }
  9772. if (i == 0)
  9773. fail("Parsing worked despite failing allocations");
  9774. else if (i == max_alloc_count)
  9775. fail("Parsing failed even at max allocation count");
  9776. }
  9777. END_TEST
  9778. /* Using a slightly shorter namespace name provokes allocations in
  9779. * slightly different places in the code.
  9780. */
  9781. START_TEST(test_nsalloc_less_long_namespace) {
  9782. const char *text
  9783. = "<"
  9784. /* 64 characters per line */
  9785. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9786. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9787. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9788. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9789. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9790. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9791. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9792. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz012345678"
  9793. ":e xmlns:"
  9794. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9795. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9796. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9797. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9798. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9799. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9800. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9801. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz012345678"
  9802. "='http://example.org/'>\n"
  9803. "<"
  9804. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9805. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9806. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9807. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9808. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9809. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9810. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9811. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz012345678"
  9812. ":f "
  9813. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9814. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9815. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9816. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9817. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9818. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9819. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9820. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz012345678"
  9821. ":att='foo'/>\n"
  9822. "</"
  9823. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9824. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9825. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9826. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9827. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9828. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9829. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789AZ"
  9830. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz012345678"
  9831. ":e>";
  9832. int i;
  9833. const int max_alloc_count = 40;
  9834. for (i = 0; i < max_alloc_count; i++) {
  9835. allocation_count = i;
  9836. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  9837. != XML_STATUS_ERROR)
  9838. break;
  9839. /* See comment in test_nsalloc_xmlns() */
  9840. nsalloc_teardown();
  9841. nsalloc_setup();
  9842. }
  9843. if (i == 0)
  9844. fail("Parsing worked despite failing allocations");
  9845. else if (i == max_alloc_count)
  9846. fail("Parsing failed even at max allocation count");
  9847. }
  9848. END_TEST
  9849. START_TEST(test_nsalloc_long_context) {
  9850. const char *text
  9851. = "<!DOCTYPE doc SYSTEM 'foo' [\n"
  9852. " <!ATTLIST doc baz ID #REQUIRED>\n"
  9853. " <!ENTITY en SYSTEM 'bar'>\n"
  9854. "]>\n"
  9855. "<doc xmlns='http://example.org/"
  9856. /* 64 characters per line */
  9857. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  9858. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  9859. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  9860. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  9861. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  9862. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  9863. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  9864. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  9865. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  9866. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  9867. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  9868. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  9869. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  9870. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  9871. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  9872. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKL"
  9873. "' baz='2'>\n"
  9874. "&en;"
  9875. "</doc>";
  9876. ExtOption options[] = {
  9877. {XCS("foo"), "<!ELEMENT e EMPTY>"}, {XCS("bar"), "<e/>"}, {NULL, NULL}};
  9878. int i;
  9879. const int max_alloc_count = 70;
  9880. for (i = 0; i < max_alloc_count; i++) {
  9881. allocation_count = i;
  9882. XML_SetUserData(g_parser, options);
  9883. XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
  9884. XML_SetExternalEntityRefHandler(g_parser, external_entity_optioner);
  9885. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  9886. != XML_STATUS_ERROR)
  9887. break;
  9888. /* See comment in test_nsalloc_xmlns() */
  9889. nsalloc_teardown();
  9890. nsalloc_setup();
  9891. }
  9892. if (i == 0)
  9893. fail("Parsing worked despite failing allocations");
  9894. else if (i == max_alloc_count)
  9895. fail("Parsing failed even at max allocation count");
  9896. }
  9897. END_TEST
  9898. /* This function is void; it will throw a fail() on error, so if it
  9899. * returns normally it must have succeeded.
  9900. */
  9901. static void
  9902. context_realloc_test(const char *text) {
  9903. ExtOption options[] = {
  9904. {XCS("foo"), "<!ELEMENT e EMPTY>"}, {XCS("bar"), "<e/>"}, {NULL, NULL}};
  9905. int i;
  9906. const int max_realloc_count = 6;
  9907. for (i = 0; i < max_realloc_count; i++) {
  9908. reallocation_count = i;
  9909. XML_SetUserData(g_parser, options);
  9910. XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
  9911. XML_SetExternalEntityRefHandler(g_parser, external_entity_optioner);
  9912. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  9913. != XML_STATUS_ERROR)
  9914. break;
  9915. /* See comment in test_nsalloc_xmlns() */
  9916. nsalloc_teardown();
  9917. nsalloc_setup();
  9918. }
  9919. if (i == 0)
  9920. fail("Parsing worked despite failing reallocations");
  9921. else if (i == max_realloc_count)
  9922. fail("Parsing failed even at max reallocation count");
  9923. }
  9924. START_TEST(test_nsalloc_realloc_long_context) {
  9925. const char *text
  9926. = "<!DOCTYPE doc SYSTEM 'foo' [\n"
  9927. " <!ENTITY en SYSTEM 'bar'>\n"
  9928. "]>\n"
  9929. "<doc xmlns='http://example.org/"
  9930. /* 64 characters per line */
  9931. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  9932. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  9933. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  9934. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  9935. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  9936. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  9937. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  9938. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  9939. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  9940. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  9941. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  9942. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  9943. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  9944. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  9945. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  9946. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKL"
  9947. "'>\n"
  9948. "&en;"
  9949. "</doc>";
  9950. context_realloc_test(text);
  9951. }
  9952. END_TEST
  9953. START_TEST(test_nsalloc_realloc_long_context_2) {
  9954. const char *text
  9955. = "<!DOCTYPE doc SYSTEM 'foo' [\n"
  9956. " <!ENTITY en SYSTEM 'bar'>\n"
  9957. "]>\n"
  9958. "<doc xmlns='http://example.org/"
  9959. /* 64 characters per line */
  9960. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  9961. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  9962. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  9963. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  9964. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  9965. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  9966. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  9967. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  9968. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  9969. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  9970. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  9971. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  9972. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  9973. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  9974. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  9975. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJK"
  9976. "'>\n"
  9977. "&en;"
  9978. "</doc>";
  9979. context_realloc_test(text);
  9980. }
  9981. END_TEST
  9982. START_TEST(test_nsalloc_realloc_long_context_3) {
  9983. const char *text
  9984. = "<!DOCTYPE doc SYSTEM 'foo' [\n"
  9985. " <!ENTITY en SYSTEM 'bar'>\n"
  9986. "]>\n"
  9987. "<doc xmlns='http://example.org/"
  9988. /* 64 characters per line */
  9989. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  9990. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  9991. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  9992. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  9993. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  9994. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  9995. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  9996. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  9997. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  9998. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  9999. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  10000. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  10001. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  10002. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  10003. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  10004. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGH"
  10005. "'>\n"
  10006. "&en;"
  10007. "</doc>";
  10008. context_realloc_test(text);
  10009. }
  10010. END_TEST
  10011. START_TEST(test_nsalloc_realloc_long_context_4) {
  10012. const char *text
  10013. = "<!DOCTYPE doc SYSTEM 'foo' [\n"
  10014. " <!ENTITY en SYSTEM 'bar'>\n"
  10015. "]>\n"
  10016. "<doc xmlns='http://example.org/"
  10017. /* 64 characters per line */
  10018. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  10019. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  10020. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  10021. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  10022. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  10023. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  10024. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  10025. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  10026. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  10027. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  10028. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  10029. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  10030. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  10031. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  10032. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  10033. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO"
  10034. "'>\n"
  10035. "&en;"
  10036. "</doc>";
  10037. context_realloc_test(text);
  10038. }
  10039. END_TEST
  10040. START_TEST(test_nsalloc_realloc_long_context_5) {
  10041. const char *text
  10042. = "<!DOCTYPE doc SYSTEM 'foo' [\n"
  10043. " <!ENTITY en SYSTEM 'bar'>\n"
  10044. "]>\n"
  10045. "<doc xmlns='http://example.org/"
  10046. /* 64 characters per line */
  10047. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  10048. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  10049. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  10050. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  10051. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  10052. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  10053. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  10054. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  10055. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  10056. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  10057. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  10058. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  10059. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  10060. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  10061. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  10062. "ABC"
  10063. "'>\n"
  10064. "&en;"
  10065. "</doc>";
  10066. context_realloc_test(text);
  10067. }
  10068. END_TEST
  10069. START_TEST(test_nsalloc_realloc_long_context_6) {
  10070. const char *text
  10071. = "<!DOCTYPE doc SYSTEM 'foo' [\n"
  10072. " <!ENTITY en SYSTEM 'bar'>\n"
  10073. "]>\n"
  10074. "<doc xmlns='http://example.org/"
  10075. /* 64 characters per line */
  10076. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  10077. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  10078. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  10079. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  10080. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  10081. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  10082. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  10083. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  10084. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  10085. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  10086. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  10087. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  10088. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  10089. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  10090. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNOP"
  10091. "'>\n"
  10092. "&en;"
  10093. "</doc>";
  10094. context_realloc_test(text);
  10095. }
  10096. END_TEST
  10097. START_TEST(test_nsalloc_realloc_long_context_7) {
  10098. const char *text
  10099. = "<!DOCTYPE doc SYSTEM 'foo' [\n"
  10100. " <!ENTITY en SYSTEM 'bar'>\n"
  10101. "]>\n"
  10102. "<doc xmlns='http://example.org/"
  10103. /* 64 characters per line */
  10104. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  10105. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  10106. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  10107. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  10108. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  10109. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  10110. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  10111. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  10112. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  10113. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  10114. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  10115. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  10116. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  10117. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  10118. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  10119. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLM"
  10120. "'>\n"
  10121. "&en;"
  10122. "</doc>";
  10123. context_realloc_test(text);
  10124. }
  10125. END_TEST
  10126. START_TEST(test_nsalloc_realloc_long_ge_name) {
  10127. const char *text
  10128. = "<!DOCTYPE doc SYSTEM 'foo' [\n"
  10129. " <!ENTITY "
  10130. /* 64 characters per line */
  10131. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10132. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10133. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10134. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10135. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10136. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10137. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10138. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10139. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10140. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10141. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10142. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10143. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10144. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10145. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10146. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10147. " SYSTEM 'bar'>\n"
  10148. "]>\n"
  10149. "<doc xmlns='http://example.org/baz'>\n"
  10150. "&"
  10151. /* 64 characters per line */
  10152. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10153. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10154. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10155. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10156. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10157. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10158. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10159. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10160. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10161. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10162. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10163. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10164. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10165. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10166. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10167. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10168. ";"
  10169. "</doc>";
  10170. ExtOption options[] = {
  10171. {XCS("foo"), "<!ELEMENT el EMPTY>"}, {XCS("bar"), "<el/>"}, {NULL, NULL}};
  10172. int i;
  10173. const int max_realloc_count = 10;
  10174. for (i = 0; i < max_realloc_count; i++) {
  10175. reallocation_count = i;
  10176. XML_SetUserData(g_parser, options);
  10177. XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
  10178. XML_SetExternalEntityRefHandler(g_parser, external_entity_optioner);
  10179. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  10180. != XML_STATUS_ERROR)
  10181. break;
  10182. /* See comment in test_nsalloc_xmlns() */
  10183. nsalloc_teardown();
  10184. nsalloc_setup();
  10185. }
  10186. if (i == 0)
  10187. fail("Parsing worked despite failing reallocations");
  10188. else if (i == max_realloc_count)
  10189. fail("Parsing failed even at max reallocation count");
  10190. }
  10191. END_TEST
  10192. /* Test that when a namespace is passed through the context mechanism
  10193. * to an external entity parser, the parsers handle reallocation
  10194. * failures correctly. The prefix is exactly the right length to
  10195. * provoke particular uncommon code paths.
  10196. */
  10197. START_TEST(test_nsalloc_realloc_long_context_in_dtd) {
  10198. const char *text1
  10199. = "<!DOCTYPE "
  10200. /* 64 characters per line */
  10201. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10202. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10203. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10204. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10205. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10206. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10207. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10208. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10209. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10210. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10211. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10212. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10213. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10214. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10215. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10216. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10217. ":doc [\n"
  10218. " <!ENTITY First SYSTEM 'foo/First'>\n"
  10219. "]>\n"
  10220. "<"
  10221. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10222. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10223. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10224. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10225. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10226. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10227. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10228. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10229. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10230. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10231. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10232. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10233. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10234. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10235. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10236. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10237. ":doc xmlns:"
  10238. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10239. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10240. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10241. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10242. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10243. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10244. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10245. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10246. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10247. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10248. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10249. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10250. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10251. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10252. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10253. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10254. "='foo/Second'>&First;";
  10255. const char *text2
  10256. = "</"
  10257. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10258. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10259. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10260. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10261. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10262. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10263. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10264. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10265. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10266. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10267. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10268. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10269. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10270. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10271. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10272. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10273. ":doc>";
  10274. ExtOption options[] = {{XCS("foo/First"), "Hello world"}, {NULL, NULL}};
  10275. int i;
  10276. const int max_realloc_count = 20;
  10277. for (i = 0; i < max_realloc_count; i++) {
  10278. reallocation_count = i;
  10279. XML_SetUserData(g_parser, options);
  10280. XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
  10281. XML_SetExternalEntityRefHandler(g_parser, external_entity_optioner);
  10282. if (_XML_Parse_SINGLE_BYTES(g_parser, text1, (int)strlen(text1), XML_FALSE)
  10283. != XML_STATUS_ERROR
  10284. && _XML_Parse_SINGLE_BYTES(g_parser, text2, (int)strlen(text2),
  10285. XML_TRUE)
  10286. != XML_STATUS_ERROR)
  10287. break;
  10288. /* See comment in test_nsalloc_xmlns() */
  10289. nsalloc_teardown();
  10290. nsalloc_setup();
  10291. }
  10292. if (i == 0)
  10293. fail("Parsing worked despite failing reallocations");
  10294. else if (i == max_realloc_count)
  10295. fail("Parsing failed even at max reallocation count");
  10296. }
  10297. END_TEST
  10298. START_TEST(test_nsalloc_long_default_in_ext) {
  10299. const char *text
  10300. = "<!DOCTYPE doc [\n"
  10301. " <!ATTLIST e a1 CDATA '"
  10302. /* 64 characters per line */
  10303. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10304. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10305. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10306. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10307. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10308. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10309. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10310. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10311. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10312. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10313. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10314. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10315. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10316. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10317. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10318. "ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP"
  10319. "'>\n"
  10320. " <!ENTITY x SYSTEM 'foo'>\n"
  10321. "]>\n"
  10322. "<doc>&x;</doc>";
  10323. ExtOption options[] = {{XCS("foo"), "<e/>"}, {NULL, NULL}};
  10324. int i;
  10325. const int max_alloc_count = 50;
  10326. for (i = 0; i < max_alloc_count; i++) {
  10327. allocation_count = i;
  10328. XML_SetUserData(g_parser, options);
  10329. XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
  10330. XML_SetExternalEntityRefHandler(g_parser, external_entity_optioner);
  10331. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  10332. != XML_STATUS_ERROR)
  10333. break;
  10334. /* See comment in test_nsalloc_xmlns() */
  10335. nsalloc_teardown();
  10336. nsalloc_setup();
  10337. }
  10338. if (i == 0)
  10339. fail("Parsing worked despite failing allocations");
  10340. else if (i == max_alloc_count)
  10341. fail("Parsing failed even at max allocation count");
  10342. }
  10343. END_TEST
  10344. START_TEST(test_nsalloc_long_systemid_in_ext) {
  10345. const char *text
  10346. = "<!DOCTYPE doc SYSTEM 'foo' [\n"
  10347. " <!ENTITY en SYSTEM '"
  10348. /* 64 characters per line */
  10349. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  10350. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  10351. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  10352. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  10353. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  10354. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  10355. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  10356. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  10357. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  10358. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  10359. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  10360. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  10361. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  10362. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  10363. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  10364. "ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"
  10365. "'>\n"
  10366. "]>\n"
  10367. "<doc>&en;</doc>";
  10368. ExtOption options[] = {
  10369. {XCS("foo"), "<!ELEMENT e EMPTY>"},
  10370. {/* clang-format off */
  10371. XCS("ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/")
  10372. XCS("ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/")
  10373. XCS("ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/")
  10374. XCS("ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/")
  10375. XCS("ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/")
  10376. XCS("ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/")
  10377. XCS("ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/")
  10378. XCS("ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/")
  10379. XCS("ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/")
  10380. XCS("ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/")
  10381. XCS("ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/")
  10382. XCS("ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/")
  10383. XCS("ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/")
  10384. XCS("ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/")
  10385. XCS("ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/")
  10386. XCS("ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/ABCDEFGHIJKLMNO/"),
  10387. /* clang-format on */
  10388. "<e/>"},
  10389. {NULL, NULL}};
  10390. int i;
  10391. const int max_alloc_count = 55;
  10392. for (i = 0; i < max_alloc_count; i++) {
  10393. allocation_count = i;
  10394. XML_SetUserData(g_parser, options);
  10395. XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
  10396. XML_SetExternalEntityRefHandler(g_parser, external_entity_optioner);
  10397. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  10398. != XML_STATUS_ERROR)
  10399. break;
  10400. /* See comment in test_nsalloc_xmlns() */
  10401. nsalloc_teardown();
  10402. nsalloc_setup();
  10403. }
  10404. if (i == 0)
  10405. fail("Parsing worked despite failing allocations");
  10406. else if (i == max_alloc_count)
  10407. fail("Parsing failed even at max allocation count");
  10408. }
  10409. END_TEST
  10410. /* Test the effects of allocation failure on parsing an element in a
  10411. * namespace. Based on test_nsalloc_long_context.
  10412. */
  10413. START_TEST(test_nsalloc_prefixed_element) {
  10414. const char *text = "<!DOCTYPE pfx:element SYSTEM 'foo' [\n"
  10415. " <!ATTLIST pfx:element baz ID #REQUIRED>\n"
  10416. " <!ENTITY en SYSTEM 'bar'>\n"
  10417. "]>\n"
  10418. "<pfx:element xmlns:pfx='http://example.org/' baz='2'>\n"
  10419. "&en;"
  10420. "</pfx:element>";
  10421. ExtOption options[] = {
  10422. {XCS("foo"), "<!ELEMENT e EMPTY>"}, {XCS("bar"), "<e/>"}, {NULL, NULL}};
  10423. int i;
  10424. const int max_alloc_count = 70;
  10425. for (i = 0; i < max_alloc_count; i++) {
  10426. allocation_count = i;
  10427. XML_SetUserData(g_parser, options);
  10428. XML_SetParamEntityParsing(g_parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
  10429. XML_SetExternalEntityRefHandler(g_parser, external_entity_optioner);
  10430. if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE)
  10431. != XML_STATUS_ERROR)
  10432. break;
  10433. /* See comment in test_nsalloc_xmlns() */
  10434. nsalloc_teardown();
  10435. nsalloc_setup();
  10436. }
  10437. if (i == 0)
  10438. fail("Success despite failing allocator");
  10439. else if (i == max_alloc_count)
  10440. fail("Failed even at full allocation count");
  10441. }
  10442. END_TEST
  10443. #if defined(XML_DTD)
  10444. typedef enum XML_Status (*XmlParseFunction)(XML_Parser, const char *, int, int);
  10445. struct AccountingTestCase {
  10446. const char *primaryText;
  10447. const char *firstExternalText; /* often NULL */
  10448. const char *secondExternalText; /* often NULL */
  10449. const unsigned long long expectedCountBytesIndirectExtra;
  10450. XML_Bool singleBytesWanted;
  10451. };
  10452. static int
  10453. accounting_external_entity_ref_handler(XML_Parser parser,
  10454. const XML_Char *context,
  10455. const XML_Char *base,
  10456. const XML_Char *systemId,
  10457. const XML_Char *publicId) {
  10458. UNUSED_P(context);
  10459. UNUSED_P(base);
  10460. UNUSED_P(publicId);
  10461. const struct AccountingTestCase *const testCase
  10462. = (const struct AccountingTestCase *)XML_GetUserData(parser);
  10463. const char *externalText = NULL;
  10464. if (xcstrcmp(systemId, XCS("first.ent")) == 0) {
  10465. externalText = testCase->firstExternalText;
  10466. } else if (xcstrcmp(systemId, XCS("second.ent")) == 0) {
  10467. externalText = testCase->secondExternalText;
  10468. } else {
  10469. assert(! "systemId is neither \"first.ent\" nor \"second.ent\"");
  10470. }
  10471. assert(externalText);
  10472. XML_Parser entParser = XML_ExternalEntityParserCreate(parser, context, 0);
  10473. assert(entParser);
  10474. const XmlParseFunction xmlParseFunction
  10475. = testCase->singleBytesWanted ? _XML_Parse_SINGLE_BYTES : XML_Parse;
  10476. const enum XML_Status status = xmlParseFunction(
  10477. entParser, externalText, (int)strlen(externalText), XML_TRUE);
  10478. XML_ParserFree(entParser);
  10479. return status;
  10480. }
  10481. START_TEST(test_accounting_precision) {
  10482. const XML_Bool filled_later = XML_TRUE; /* value is arbitrary */
  10483. struct AccountingTestCase cases[] = {
  10484. {"<e/>", NULL, NULL, 0, 0},
  10485. {"<e></e>", NULL, NULL, 0, 0},
  10486. /* Attributes */
  10487. {"<e k1=\"v2\" k2=\"v2\"/>", NULL, NULL, 0, filled_later},
  10488. {"<e k1=\"v2\" k2=\"v2\"></e>", NULL, NULL, 0, 0},
  10489. {"<p:e xmlns:p=\"https://domain.invalid/\" />", NULL, NULL, 0,
  10490. filled_later},
  10491. {"<e k=\"&amp;&apos;&gt;&lt;&quot;\" />", NULL, NULL,
  10492. sizeof(XML_Char) * 5 /* number of predefined entities */, filled_later},
  10493. {"<e1 xmlns='https://example.org/'>\n"
  10494. " <e2 xmlns=''/>\n"
  10495. "</e1>",
  10496. NULL, NULL, 0, filled_later},
  10497. /* Text */
  10498. {"<e>text</e>", NULL, NULL, 0, filled_later},
  10499. {"<e1><e2>text1<e3/>text2</e2></e1>", NULL, NULL, 0, filled_later},
  10500. {"<e>&amp;&apos;&gt;&lt;&quot;</e>", NULL, NULL,
  10501. sizeof(XML_Char) * 5 /* number of predefined entities */, filled_later},
  10502. {"<e>&#65;&#41;</e>", NULL, NULL, 0, filled_later},
  10503. /* Prolog */
  10504. {"<?xml version=\"1.0\"?><root/>", NULL, NULL, 0, filled_later},
  10505. /* Whitespace */
  10506. {" <e1> <e2> </e2> </e1> ", NULL, NULL, 0, filled_later},
  10507. {"<e1 ><e2 /></e1 >", NULL, NULL, 0, filled_later},
  10508. {"<e1><e2 k = \"v\"/><e3 k = 'v'/></e1>", NULL, NULL, 0, filled_later},
  10509. /* Comments */
  10510. {"<!-- Comment --><e><!-- Comment --></e>", NULL, NULL, 0, filled_later},
  10511. /* Processing instructions */
  10512. {"<?xml-stylesheet type=\"text/xsl\" href=\"https://domain.invalid/\" media=\"all\"?><e/>",
  10513. NULL, NULL, 0, filled_later},
  10514. {"<?pi0?><?pi1 ?><?pi2 ?><!DOCTYPE r SYSTEM 'first.ent'><r/>",
  10515. "<?pi3?><!ENTITY % e1 SYSTEM 'second.ent'><?pi4?>%e1;<?pi5?>", "<?pi6?>",
  10516. 0, filled_later},
  10517. /* CDATA */
  10518. {"<e><![CDATA[one two three]]></e>", NULL, NULL, 0, filled_later},
  10519. /* The following is the essence of this OSS-Fuzz finding:
  10520. https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=34302
  10521. https://oss-fuzz.com/testcase-detail/4860575394955264
  10522. */
  10523. {"<!DOCTYPE r [\n"
  10524. "<!ENTITY e \"111<![CDATA[2 <= 2]]>333\">\n"
  10525. "]>\n"
  10526. "<r>&e;</r>\n",
  10527. NULL, NULL, sizeof(XML_Char) * strlen("111<![CDATA[2 <= 2]]>333"),
  10528. filled_later},
  10529. /* Conditional sections */
  10530. {"<!DOCTYPE r [\n"
  10531. "<!ENTITY % draft 'INCLUDE'>\n"
  10532. "<!ENTITY % final 'IGNORE'>\n"
  10533. "<!ENTITY % import SYSTEM \"first.ent\">\n"
  10534. "%import;\n"
  10535. "]>\n"
  10536. "<r/>\n",
  10537. "<![%draft;[<!--1-->]]>\n"
  10538. "<![%final;[<!--22-->]]>",
  10539. NULL, sizeof(XML_Char) * (strlen("INCLUDE") + strlen("IGNORE")),
  10540. filled_later},
  10541. /* General entities */
  10542. {"<!DOCTYPE root [\n"
  10543. "<!ENTITY nine \"123456789\">\n"
  10544. "]>\n"
  10545. "<root>&nine;</root>",
  10546. NULL, NULL, sizeof(XML_Char) * strlen("123456789"), filled_later},
  10547. {"<!DOCTYPE root [\n"
  10548. "<!ENTITY nine \"123456789\">\n"
  10549. "]>\n"
  10550. "<root k1=\"&nine;\"/>",
  10551. NULL, NULL, sizeof(XML_Char) * strlen("123456789"), filled_later},
  10552. {"<!DOCTYPE root [\n"
  10553. "<!ENTITY nine \"123456789\">\n"
  10554. "<!ENTITY nine2 \"&nine;&nine;\">\n"
  10555. "]>\n"
  10556. "<root>&nine2;&nine2;&nine2;</root>",
  10557. NULL, NULL,
  10558. sizeof(XML_Char) * 3 /* calls to &nine2; */ * 2 /* calls to &nine; */
  10559. * (strlen("&nine;") + strlen("123456789")),
  10560. filled_later},
  10561. {"<!DOCTYPE r [\n"
  10562. " <!ENTITY five SYSTEM 'first.ent'>\n"
  10563. "]>\n"
  10564. "<r>&five;</r>",
  10565. "12345", NULL, 0, filled_later},
  10566. /* Parameter entities */
  10567. {"<!DOCTYPE r [\n"
  10568. "<!ENTITY % comment \"<!---->\">\n"
  10569. "%comment;\n"
  10570. "]>\n"
  10571. "<r/>",
  10572. NULL, NULL, sizeof(XML_Char) * strlen("<!---->"), filled_later},
  10573. {"<!DOCTYPE r [\n"
  10574. "<!ENTITY % ninedef \"&#60;!ENTITY nine &#34;123456789&#34;&#62;\">\n"
  10575. "%ninedef;\n"
  10576. "]>\n"
  10577. "<r>&nine;</r>",
  10578. NULL, NULL,
  10579. sizeof(XML_Char)
  10580. * (strlen("<!ENTITY nine \"123456789\">") + strlen("123456789")),
  10581. filled_later},
  10582. {"<!DOCTYPE r [\n"
  10583. "<!ENTITY % comment \"<!--1-->\">\n"
  10584. "<!ENTITY % comment2 \"&#37;comment;<!--22-->&#37;comment;\">\n"
  10585. "%comment2;\n"
  10586. "]>\n"
  10587. "<r/>\n",
  10588. NULL, NULL,
  10589. sizeof(XML_Char)
  10590. * (strlen("%comment;<!--22-->%comment;") + 2 * strlen("<!--1-->")),
  10591. filled_later},
  10592. {"<!DOCTYPE r [\n"
  10593. " <!ENTITY % five \"12345\">\n"
  10594. " <!ENTITY % five2def \"&#60;!ENTITY five2 &#34;[&#37;five;][&#37;five;]]]]&#34;&#62;\">\n"
  10595. " %five2def;\n"
  10596. "]>\n"
  10597. "<r>&five2;</r>",
  10598. NULL, NULL, /* from "%five2def;": */
  10599. sizeof(XML_Char)
  10600. * (strlen("<!ENTITY five2 \"[%five;][%five;]]]]\">")
  10601. + 2 /* calls to "%five;" */ * strlen("12345")
  10602. + /* from "&five2;": */ strlen("[12345][12345]]]]")),
  10603. filled_later},
  10604. {"<!DOCTYPE r SYSTEM \"first.ent\">\n"
  10605. "<r/>",
  10606. "<!ENTITY % comment '<!--1-->'>\n"
  10607. "<!ENTITY % comment2 '<!--22-->%comment;<!--22-->%comment;<!--22-->'>\n"
  10608. "%comment2;",
  10609. NULL,
  10610. sizeof(XML_Char)
  10611. * (strlen("<!--22-->%comment;<!--22-->%comment;<!--22-->")
  10612. + 2 /* calls to "%comment;" */ * strlen("<!---->")),
  10613. filled_later},
  10614. {"<!DOCTYPE r SYSTEM 'first.ent'>\n"
  10615. "<r/>",
  10616. "<!ENTITY % e1 PUBLIC 'foo' 'second.ent'>\n"
  10617. "<!ENTITY % e2 '<!--22-->%e1;<!--22-->'>\n"
  10618. "%e2;\n",
  10619. "<!--1-->", sizeof(XML_Char) * strlen("<!--22--><!--1--><!--22-->"),
  10620. filled_later},
  10621. {
  10622. "<!DOCTYPE r SYSTEM 'first.ent'>\n"
  10623. "<r/>",
  10624. "<!ENTITY % e1 SYSTEM 'second.ent'>\n"
  10625. "<!ENTITY % e2 '%e1;'>",
  10626. "<?xml version='1.0' encoding='utf-8'?>\n"
  10627. "hello\n"
  10628. "xml" /* without trailing newline! */,
  10629. 0,
  10630. filled_later,
  10631. },
  10632. {
  10633. "<!DOCTYPE r SYSTEM 'first.ent'>\n"
  10634. "<r/>",
  10635. "<!ENTITY % e1 SYSTEM 'second.ent'>\n"
  10636. "<!ENTITY % e2 '%e1;'>",
  10637. "<?xml version='1.0' encoding='utf-8'?>\n"
  10638. "hello\n"
  10639. "xml\n" /* with trailing newline! */,
  10640. 0,
  10641. filled_later,
  10642. },
  10643. {"<!DOCTYPE doc SYSTEM 'first.ent'>\n"
  10644. "<doc></doc>\n",
  10645. "<!ELEMENT doc EMPTY>\n"
  10646. "<!ENTITY % e1 SYSTEM 'second.ent'>\n"
  10647. "<!ENTITY % e2 '%e1;'>\n"
  10648. "%e1;\n",
  10649. "\xEF\xBB\xBF<!ATTLIST doc a1 CDATA 'value'>" /* UTF-8 BOM */,
  10650. strlen("\xEF\xBB\xBF<!ATTLIST doc a1 CDATA 'value'>"), filled_later},
  10651. {"<!DOCTYPE r [\n"
  10652. " <!ENTITY five SYSTEM 'first.ent'>\n"
  10653. "]>\n"
  10654. "<r>&five;</r>",
  10655. "\xEF\xBB\xBF" /* UTF-8 BOM */, NULL, 0, filled_later},
  10656. };
  10657. const size_t countCases = sizeof(cases) / sizeof(cases[0]);
  10658. size_t u = 0;
  10659. for (; u < countCases; u++) {
  10660. size_t v = 0;
  10661. for (; v < 2; v++) {
  10662. const XML_Bool singleBytesWanted = (v == 0) ? XML_FALSE : XML_TRUE;
  10663. const unsigned long long expectedCountBytesDirect
  10664. = strlen(cases[u].primaryText);
  10665. const unsigned long long expectedCountBytesIndirect
  10666. = (cases[u].firstExternalText ? strlen(cases[u].firstExternalText)
  10667. : 0)
  10668. + (cases[u].secondExternalText ? strlen(cases[u].secondExternalText)
  10669. : 0)
  10670. + cases[u].expectedCountBytesIndirectExtra;
  10671. XML_Parser parser = XML_ParserCreate(NULL);
  10672. XML_SetParamEntityParsing(parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
  10673. if (cases[u].firstExternalText) {
  10674. XML_SetExternalEntityRefHandler(parser,
  10675. accounting_external_entity_ref_handler);
  10676. XML_SetUserData(parser, (void *)&cases[u]);
  10677. cases[u].singleBytesWanted = singleBytesWanted;
  10678. }
  10679. const XmlParseFunction xmlParseFunction
  10680. = singleBytesWanted ? _XML_Parse_SINGLE_BYTES : XML_Parse;
  10681. enum XML_Status status
  10682. = xmlParseFunction(parser, cases[u].primaryText,
  10683. (int)strlen(cases[u].primaryText), XML_TRUE);
  10684. if (status != XML_STATUS_OK) {
  10685. _xml_failure(parser, __FILE__, __LINE__);
  10686. }
  10687. const unsigned long long actualCountBytesDirect
  10688. = testingAccountingGetCountBytesDirect(parser);
  10689. const unsigned long long actualCountBytesIndirect
  10690. = testingAccountingGetCountBytesIndirect(parser);
  10691. XML_ParserFree(parser);
  10692. if (actualCountBytesDirect != expectedCountBytesDirect) {
  10693. fprintf(
  10694. stderr,
  10695. "Document " EXPAT_FMT_SIZE_T("") " of " EXPAT_FMT_SIZE_T("") ", %s: Expected " EXPAT_FMT_ULL(
  10696. "") " count direct bytes, got " EXPAT_FMT_ULL("") " instead.\n",
  10697. u + 1, countCases, singleBytesWanted ? "single bytes" : "chunks",
  10698. expectedCountBytesDirect, actualCountBytesDirect);
  10699. fail("Count of direct bytes is off");
  10700. }
  10701. if (actualCountBytesIndirect != expectedCountBytesIndirect) {
  10702. fprintf(
  10703. stderr,
  10704. "Document " EXPAT_FMT_SIZE_T("") " of " EXPAT_FMT_SIZE_T("") ", %s: Expected " EXPAT_FMT_ULL(
  10705. "") " count indirect bytes, got " EXPAT_FMT_ULL("") " instead.\n",
  10706. u + 1, countCases, singleBytesWanted ? "single bytes" : "chunks",
  10707. expectedCountBytesIndirect, actualCountBytesIndirect);
  10708. fail("Count of indirect bytes is off");
  10709. }
  10710. }
  10711. }
  10712. }
  10713. END_TEST
  10714. START_TEST(test_billion_laughs_attack_protection_api) {
  10715. XML_Parser parserWithoutParent = XML_ParserCreate(NULL);
  10716. XML_Parser parserWithParent
  10717. = XML_ExternalEntityParserCreate(parserWithoutParent, NULL, NULL);
  10718. if (parserWithoutParent == NULL)
  10719. fail("parserWithoutParent is NULL");
  10720. if (parserWithParent == NULL)
  10721. fail("parserWithParent is NULL");
  10722. // XML_SetBillionLaughsAttackProtectionMaximumAmplification, error cases
  10723. if (XML_SetBillionLaughsAttackProtectionMaximumAmplification(NULL, 123.0f)
  10724. == XML_TRUE)
  10725. fail("Call with NULL parser is NOT supposed to succeed");
  10726. if (XML_SetBillionLaughsAttackProtectionMaximumAmplification(parserWithParent,
  10727. 123.0f)
  10728. == XML_TRUE)
  10729. fail("Call with non-root parser is NOT supposed to succeed");
  10730. if (XML_SetBillionLaughsAttackProtectionMaximumAmplification(
  10731. parserWithoutParent, NAN)
  10732. == XML_TRUE)
  10733. fail("Call with NaN limit is NOT supposed to succeed");
  10734. if (XML_SetBillionLaughsAttackProtectionMaximumAmplification(
  10735. parserWithoutParent, -1.0f)
  10736. == XML_TRUE)
  10737. fail("Call with negative limit is NOT supposed to succeed");
  10738. if (XML_SetBillionLaughsAttackProtectionMaximumAmplification(
  10739. parserWithoutParent, 0.9f)
  10740. == XML_TRUE)
  10741. fail("Call with positive limit <1.0 is NOT supposed to succeed");
  10742. // XML_SetBillionLaughsAttackProtectionMaximumAmplification, success cases
  10743. if (XML_SetBillionLaughsAttackProtectionMaximumAmplification(
  10744. parserWithoutParent, 1.0f)
  10745. == XML_FALSE)
  10746. fail("Call with positive limit >=1.0 is supposed to succeed");
  10747. if (XML_SetBillionLaughsAttackProtectionMaximumAmplification(
  10748. parserWithoutParent, 123456.789f)
  10749. == XML_FALSE)
  10750. fail("Call with positive limit >=1.0 is supposed to succeed");
  10751. if (XML_SetBillionLaughsAttackProtectionMaximumAmplification(
  10752. parserWithoutParent, INFINITY)
  10753. == XML_FALSE)
  10754. fail("Call with positive limit >=1.0 is supposed to succeed");
  10755. // XML_SetBillionLaughsAttackProtectionActivationThreshold, error cases
  10756. if (XML_SetBillionLaughsAttackProtectionActivationThreshold(NULL, 123)
  10757. == XML_TRUE)
  10758. fail("Call with NULL parser is NOT supposed to succeed");
  10759. if (XML_SetBillionLaughsAttackProtectionActivationThreshold(parserWithParent,
  10760. 123)
  10761. == XML_TRUE)
  10762. fail("Call with non-root parser is NOT supposed to succeed");
  10763. // XML_SetBillionLaughsAttackProtectionActivationThreshold, success cases
  10764. if (XML_SetBillionLaughsAttackProtectionActivationThreshold(
  10765. parserWithoutParent, 123)
  10766. == XML_FALSE)
  10767. fail("Call with non-NULL parentless parser is supposed to succeed");
  10768. XML_ParserFree(parserWithParent);
  10769. XML_ParserFree(parserWithoutParent);
  10770. }
  10771. END_TEST
  10772. START_TEST(test_helper_unsigned_char_to_printable) {
  10773. // Smoke test
  10774. unsigned char uc = 0;
  10775. for (; uc < (unsigned char)-1; uc++) {
  10776. const char *const printable = unsignedCharToPrintable(uc);
  10777. if (printable == NULL)
  10778. fail("unsignedCharToPrintable returned NULL");
  10779. if (strlen(printable) < (size_t)1)
  10780. fail("unsignedCharToPrintable returned empty string");
  10781. }
  10782. // Two concrete samples
  10783. if (strcmp(unsignedCharToPrintable('A'), "A") != 0)
  10784. fail("unsignedCharToPrintable result mistaken");
  10785. if (strcmp(unsignedCharToPrintable('\\'), "\\\\") != 0)
  10786. fail("unsignedCharToPrintable result mistaken");
  10787. }
  10788. END_TEST
  10789. #endif // defined(XML_DTD)
  10790. static Suite *
  10791. make_suite(void) {
  10792. Suite *s = suite_create("basic");
  10793. TCase *tc_basic = tcase_create("basic tests");
  10794. TCase *tc_namespace = tcase_create("XML namespaces");
  10795. TCase *tc_misc = tcase_create("miscellaneous tests");
  10796. TCase *tc_alloc = tcase_create("allocation tests");
  10797. TCase *tc_nsalloc = tcase_create("namespace allocation tests");
  10798. #if defined(XML_DTD)
  10799. TCase *tc_accounting = tcase_create("accounting tests");
  10800. #endif
  10801. suite_add_tcase(s, tc_basic);
  10802. tcase_add_checked_fixture(tc_basic, basic_setup, basic_teardown);
  10803. tcase_add_test(tc_basic, test_nul_byte);
  10804. tcase_add_test(tc_basic, test_u0000_char);
  10805. tcase_add_test(tc_basic, test_siphash_self);
  10806. tcase_add_test(tc_basic, test_siphash_spec);
  10807. tcase_add_test(tc_basic, test_bom_utf8);
  10808. tcase_add_test(tc_basic, test_bom_utf16_be);
  10809. tcase_add_test(tc_basic, test_bom_utf16_le);
  10810. tcase_add_test(tc_basic, test_nobom_utf16_le);
  10811. tcase_add_test(tc_basic, test_illegal_utf8);
  10812. tcase_add_test(tc_basic, test_utf8_auto_align);
  10813. tcase_add_test(tc_basic, test_utf16);
  10814. tcase_add_test(tc_basic, test_utf16_le_epilog_newline);
  10815. tcase_add_test(tc_basic, test_not_utf16);
  10816. tcase_add_test(tc_basic, test_bad_encoding);
  10817. tcase_add_test(tc_basic, test_latin1_umlauts);
  10818. tcase_add_test(tc_basic, test_long_utf8_character);
  10819. tcase_add_test(tc_basic, test_long_latin1_attribute);
  10820. tcase_add_test(tc_basic, test_long_ascii_attribute);
  10821. /* Regression test for SF bug #491986. */
  10822. tcase_add_test(tc_basic, test_danish_latin1);
  10823. /* Regression test for SF bug #514281. */
  10824. tcase_add_test(tc_basic, test_french_charref_hexidecimal);
  10825. tcase_add_test(tc_basic, test_french_charref_decimal);
  10826. tcase_add_test(tc_basic, test_french_latin1);
  10827. tcase_add_test(tc_basic, test_french_utf8);
  10828. tcase_add_test(tc_basic, test_utf8_false_rejection);
  10829. tcase_add_test(tc_basic, test_line_number_after_parse);
  10830. tcase_add_test(tc_basic, test_column_number_after_parse);
  10831. tcase_add_test(tc_basic, test_line_and_column_numbers_inside_handlers);
  10832. tcase_add_test(tc_basic, test_line_number_after_error);
  10833. tcase_add_test(tc_basic, test_column_number_after_error);
  10834. tcase_add_test(tc_basic, test_really_long_lines);
  10835. tcase_add_test(tc_basic, test_really_long_encoded_lines);
  10836. tcase_add_test(tc_basic, test_end_element_events);
  10837. tcase_add_test(tc_basic, test_attr_whitespace_normalization);
  10838. tcase_add_test(tc_basic, test_xmldecl_misplaced);
  10839. tcase_add_test(tc_basic, test_xmldecl_invalid);
  10840. tcase_add_test(tc_basic, test_xmldecl_missing_attr);
  10841. tcase_add_test(tc_basic, test_xmldecl_missing_value);
  10842. tcase_add_test(tc_basic, test_unknown_encoding_internal_entity);
  10843. tcase_add_test(tc_basic, test_unrecognised_encoding_internal_entity);
  10844. tcase_add_test(tc_basic, test_wfc_undeclared_entity_unread_external_subset);
  10845. tcase_add_test(tc_basic, test_wfc_undeclared_entity_no_external_subset);
  10846. tcase_add_test(tc_basic, test_wfc_undeclared_entity_standalone);
  10847. tcase_add_test(tc_basic, test_wfc_undeclared_entity_with_external_subset);
  10848. tcase_add_test(tc_basic, test_not_standalone_handler_reject);
  10849. tcase_add_test(tc_basic, test_not_standalone_handler_accept);
  10850. tcase_add_test(tc_basic,
  10851. test_wfc_undeclared_entity_with_external_subset_standalone);
  10852. tcase_add_test(tc_basic, test_entity_with_external_subset_unless_standalone);
  10853. tcase_add_test(tc_basic, test_wfc_no_recursive_entity_refs);
  10854. tcase_add_test__ifdef_xml_dtd(tc_basic, test_ext_entity_set_encoding);
  10855. tcase_add_test__ifdef_xml_dtd(tc_basic, test_ext_entity_no_handler);
  10856. tcase_add_test__ifdef_xml_dtd(tc_basic, test_ext_entity_set_bom);
  10857. tcase_add_test__ifdef_xml_dtd(tc_basic, test_ext_entity_bad_encoding);
  10858. tcase_add_test__ifdef_xml_dtd(tc_basic, test_ext_entity_bad_encoding_2);
  10859. tcase_add_test__ifdef_xml_dtd(tc_basic, test_ext_entity_invalid_parse);
  10860. tcase_add_test__ifdef_xml_dtd(tc_basic,
  10861. test_ext_entity_invalid_suspended_parse);
  10862. tcase_add_test(tc_basic, test_dtd_default_handling);
  10863. tcase_add_test(tc_basic, test_dtd_attr_handling);
  10864. tcase_add_test(tc_basic, test_empty_ns_without_namespaces);
  10865. tcase_add_test(tc_basic, test_ns_in_attribute_default_without_namespaces);
  10866. tcase_add_test(tc_basic, test_stop_parser_between_char_data_calls);
  10867. tcase_add_test(tc_basic, test_suspend_parser_between_char_data_calls);
  10868. tcase_add_test(tc_basic, test_repeated_stop_parser_between_char_data_calls);
  10869. tcase_add_test(tc_basic, test_good_cdata_ascii);
  10870. tcase_add_test(tc_basic, test_good_cdata_utf16);
  10871. tcase_add_test(tc_basic, test_good_cdata_utf16_le);
  10872. tcase_add_test(tc_basic, test_long_cdata_utf16);
  10873. tcase_add_test(tc_basic, test_multichar_cdata_utf16);
  10874. tcase_add_test(tc_basic, test_utf16_bad_surrogate_pair);
  10875. tcase_add_test(tc_basic, test_bad_cdata);
  10876. tcase_add_test(tc_basic, test_bad_cdata_utf16);
  10877. tcase_add_test(tc_basic, test_stop_parser_between_cdata_calls);
  10878. tcase_add_test(tc_basic, test_suspend_parser_between_cdata_calls);
  10879. tcase_add_test(tc_basic, test_memory_allocation);
  10880. tcase_add_test(tc_basic, test_default_current);
  10881. tcase_add_test(tc_basic, test_dtd_elements);
  10882. tcase_add_test(tc_basic, test_dtd_elements_nesting);
  10883. tcase_add_test__ifdef_xml_dtd(tc_basic, test_set_foreign_dtd);
  10884. tcase_add_test__ifdef_xml_dtd(tc_basic, test_foreign_dtd_not_standalone);
  10885. tcase_add_test__ifdef_xml_dtd(tc_basic, test_invalid_foreign_dtd);
  10886. tcase_add_test__ifdef_xml_dtd(tc_basic, test_foreign_dtd_with_doctype);
  10887. tcase_add_test__ifdef_xml_dtd(tc_basic,
  10888. test_foreign_dtd_without_external_subset);
  10889. tcase_add_test__ifdef_xml_dtd(tc_basic, test_empty_foreign_dtd);
  10890. tcase_add_test(tc_basic, test_set_base);
  10891. tcase_add_test(tc_basic, test_attributes);
  10892. tcase_add_test(tc_basic, test_reset_in_entity);
  10893. tcase_add_test(tc_basic, test_resume_invalid_parse);
  10894. tcase_add_test(tc_basic, test_resume_resuspended);
  10895. tcase_add_test(tc_basic, test_cdata_default);
  10896. tcase_add_test(tc_basic, test_subordinate_reset);
  10897. tcase_add_test(tc_basic, test_subordinate_suspend);
  10898. tcase_add_test(tc_basic, test_subordinate_xdecl_suspend);
  10899. tcase_add_test(tc_basic, test_subordinate_xdecl_abort);
  10900. tcase_add_test(tc_basic, test_explicit_encoding);
  10901. tcase_add_test(tc_basic, test_trailing_cr);
  10902. tcase_add_test(tc_basic, test_ext_entity_trailing_cr);
  10903. tcase_add_test(tc_basic, test_trailing_rsqb);
  10904. tcase_add_test(tc_basic, test_ext_entity_trailing_rsqb);
  10905. tcase_add_test(tc_basic, test_ext_entity_good_cdata);
  10906. tcase_add_test__ifdef_xml_dtd(tc_basic, test_user_parameters);
  10907. tcase_add_test__ifdef_xml_dtd(tc_basic, test_ext_entity_ref_parameter);
  10908. tcase_add_test(tc_basic, test_empty_parse);
  10909. tcase_add_test(tc_basic, test_get_buffer_1);
  10910. tcase_add_test(tc_basic, test_get_buffer_2);
  10911. #if defined(XML_CONTEXT_BYTES)
  10912. tcase_add_test(tc_basic, test_get_buffer_3_overflow);
  10913. #endif
  10914. tcase_add_test(tc_basic, test_byte_info_at_end);
  10915. tcase_add_test(tc_basic, test_byte_info_at_error);
  10916. tcase_add_test(tc_basic, test_byte_info_at_cdata);
  10917. tcase_add_test(tc_basic, test_predefined_entities);
  10918. tcase_add_test__ifdef_xml_dtd(tc_basic, test_invalid_tag_in_dtd);
  10919. tcase_add_test(tc_basic, test_not_predefined_entities);
  10920. tcase_add_test__ifdef_xml_dtd(tc_basic, test_ignore_section);
  10921. tcase_add_test__ifdef_xml_dtd(tc_basic, test_ignore_section_utf16);
  10922. tcase_add_test__ifdef_xml_dtd(tc_basic, test_ignore_section_utf16_be);
  10923. tcase_add_test__ifdef_xml_dtd(tc_basic, test_bad_ignore_section);
  10924. tcase_add_test__ifdef_xml_dtd(tc_basic, test_external_entity_values);
  10925. tcase_add_test__ifdef_xml_dtd(tc_basic, test_ext_entity_not_standalone);
  10926. tcase_add_test__ifdef_xml_dtd(tc_basic, test_ext_entity_value_abort);
  10927. tcase_add_test(tc_basic, test_bad_public_doctype);
  10928. tcase_add_test(tc_basic, test_attribute_enum_value);
  10929. tcase_add_test(tc_basic, test_predefined_entity_redefinition);
  10930. tcase_add_test__ifdef_xml_dtd(tc_basic, test_dtd_stop_processing);
  10931. tcase_add_test(tc_basic, test_public_notation_no_sysid);
  10932. tcase_add_test(tc_basic, test_nested_groups);
  10933. tcase_add_test(tc_basic, test_group_choice);
  10934. tcase_add_test(tc_basic, test_standalone_parameter_entity);
  10935. tcase_add_test__ifdef_xml_dtd(tc_basic, test_skipped_parameter_entity);
  10936. tcase_add_test__ifdef_xml_dtd(tc_basic,
  10937. test_recursive_external_parameter_entity);
  10938. tcase_add_test(tc_basic, test_undefined_ext_entity_in_external_dtd);
  10939. tcase_add_test(tc_basic, test_suspend_xdecl);
  10940. tcase_add_test(tc_basic, test_abort_epilog);
  10941. tcase_add_test(tc_basic, test_abort_epilog_2);
  10942. tcase_add_test(tc_basic, test_suspend_epilog);
  10943. tcase_add_test(tc_basic, test_suspend_in_sole_empty_tag);
  10944. tcase_add_test(tc_basic, test_unfinished_epilog);
  10945. tcase_add_test(tc_basic, test_partial_char_in_epilog);
  10946. tcase_add_test(tc_basic, test_hash_collision);
  10947. tcase_add_test__ifdef_xml_dtd(tc_basic, test_suspend_resume_internal_entity);
  10948. tcase_add_test__ifdef_xml_dtd(tc_basic, test_resume_entity_with_syntax_error);
  10949. tcase_add_test__ifdef_xml_dtd(tc_basic, test_suspend_resume_parameter_entity);
  10950. tcase_add_test(tc_basic, test_restart_on_error);
  10951. tcase_add_test(tc_basic, test_reject_lt_in_attribute_value);
  10952. tcase_add_test(tc_basic, test_reject_unfinished_param_in_att_value);
  10953. tcase_add_test(tc_basic, test_trailing_cr_in_att_value);
  10954. tcase_add_test(tc_basic, test_standalone_internal_entity);
  10955. tcase_add_test(tc_basic, test_skipped_external_entity);
  10956. tcase_add_test(tc_basic, test_skipped_null_loaded_ext_entity);
  10957. tcase_add_test(tc_basic, test_skipped_unloaded_ext_entity);
  10958. tcase_add_test__ifdef_xml_dtd(tc_basic, test_param_entity_with_trailing_cr);
  10959. tcase_add_test(tc_basic, test_invalid_character_entity);
  10960. tcase_add_test(tc_basic, test_invalid_character_entity_2);
  10961. tcase_add_test(tc_basic, test_invalid_character_entity_3);
  10962. tcase_add_test(tc_basic, test_invalid_character_entity_4);
  10963. tcase_add_test(tc_basic, test_pi_handled_in_default);
  10964. tcase_add_test(tc_basic, test_comment_handled_in_default);
  10965. tcase_add_test(tc_basic, test_pi_yml);
  10966. tcase_add_test(tc_basic, test_pi_xnl);
  10967. tcase_add_test(tc_basic, test_pi_xmm);
  10968. tcase_add_test(tc_basic, test_utf16_pi);
  10969. tcase_add_test(tc_basic, test_utf16_be_pi);
  10970. tcase_add_test(tc_basic, test_utf16_be_comment);
  10971. tcase_add_test(tc_basic, test_utf16_le_comment);
  10972. tcase_add_test(tc_basic, test_missing_encoding_conversion_fn);
  10973. tcase_add_test(tc_basic, test_failing_encoding_conversion_fn);
  10974. tcase_add_test(tc_basic, test_unknown_encoding_success);
  10975. tcase_add_test(tc_basic, test_unknown_encoding_bad_name);
  10976. tcase_add_test(tc_basic, test_unknown_encoding_bad_name_2);
  10977. tcase_add_test(tc_basic, test_unknown_encoding_long_name_1);
  10978. tcase_add_test(tc_basic, test_unknown_encoding_long_name_2);
  10979. tcase_add_test(tc_basic, test_invalid_unknown_encoding);
  10980. tcase_add_test(tc_basic, test_unknown_ascii_encoding_ok);
  10981. tcase_add_test(tc_basic, test_unknown_ascii_encoding_fail);
  10982. tcase_add_test(tc_basic, test_unknown_encoding_invalid_length);
  10983. tcase_add_test(tc_basic, test_unknown_encoding_invalid_topbit);
  10984. tcase_add_test(tc_basic, test_unknown_encoding_invalid_surrogate);
  10985. tcase_add_test(tc_basic, test_unknown_encoding_invalid_high);
  10986. tcase_add_test(tc_basic, test_unknown_encoding_invalid_attr_value);
  10987. tcase_add_test(tc_basic, test_ext_entity_latin1_utf16le_bom);
  10988. tcase_add_test(tc_basic, test_ext_entity_latin1_utf16be_bom);
  10989. tcase_add_test(tc_basic, test_ext_entity_latin1_utf16le_bom2);
  10990. tcase_add_test(tc_basic, test_ext_entity_latin1_utf16be_bom2);
  10991. tcase_add_test(tc_basic, test_ext_entity_utf16_be);
  10992. tcase_add_test(tc_basic, test_ext_entity_utf16_le);
  10993. tcase_add_test(tc_basic, test_ext_entity_utf16_unknown);
  10994. tcase_add_test(tc_basic, test_ext_entity_utf8_non_bom);
  10995. tcase_add_test(tc_basic, test_utf8_in_cdata_section);
  10996. tcase_add_test(tc_basic, test_utf8_in_cdata_section_2);
  10997. tcase_add_test(tc_basic, test_utf8_in_start_tags);
  10998. tcase_add_test(tc_basic, test_trailing_spaces_in_elements);
  10999. tcase_add_test(tc_basic, test_utf16_attribute);
  11000. tcase_add_test(tc_basic, test_utf16_second_attr);
  11001. tcase_add_test(tc_basic, test_attr_after_solidus);
  11002. tcase_add_test__ifdef_xml_dtd(tc_basic, test_utf16_pe);
  11003. tcase_add_test(tc_basic, test_bad_attr_desc_keyword);
  11004. tcase_add_test(tc_basic, test_bad_attr_desc_keyword_utf16);
  11005. tcase_add_test(tc_basic, test_bad_doctype);
  11006. tcase_add_test(tc_basic, test_bad_doctype_utf8);
  11007. tcase_add_test(tc_basic, test_bad_doctype_utf16);
  11008. tcase_add_test(tc_basic, test_bad_doctype_plus);
  11009. tcase_add_test(tc_basic, test_bad_doctype_star);
  11010. tcase_add_test(tc_basic, test_bad_doctype_query);
  11011. tcase_add_test__ifdef_xml_dtd(tc_basic, test_unknown_encoding_bad_ignore);
  11012. tcase_add_test(tc_basic, test_entity_in_utf16_be_attr);
  11013. tcase_add_test(tc_basic, test_entity_in_utf16_le_attr);
  11014. tcase_add_test__ifdef_xml_dtd(tc_basic, test_entity_public_utf16_be);
  11015. tcase_add_test__ifdef_xml_dtd(tc_basic, test_entity_public_utf16_le);
  11016. tcase_add_test(tc_basic, test_short_doctype);
  11017. tcase_add_test(tc_basic, test_short_doctype_2);
  11018. tcase_add_test(tc_basic, test_short_doctype_3);
  11019. tcase_add_test(tc_basic, test_long_doctype);
  11020. tcase_add_test(tc_basic, test_bad_entity);
  11021. tcase_add_test(tc_basic, test_bad_entity_2);
  11022. tcase_add_test(tc_basic, test_bad_entity_3);
  11023. tcase_add_test(tc_basic, test_bad_entity_4);
  11024. tcase_add_test(tc_basic, test_bad_notation);
  11025. tcase_add_test(tc_basic, test_default_doctype_handler);
  11026. tcase_add_test(tc_basic, test_empty_element_abort);
  11027. suite_add_tcase(s, tc_namespace);
  11028. tcase_add_checked_fixture(tc_namespace, namespace_setup, namespace_teardown);
  11029. tcase_add_test(tc_namespace, test_return_ns_triplet);
  11030. tcase_add_test(tc_namespace, test_ns_tagname_overwrite);
  11031. tcase_add_test(tc_namespace, test_ns_tagname_overwrite_triplet);
  11032. tcase_add_test(tc_namespace, test_start_ns_clears_start_element);
  11033. tcase_add_test__ifdef_xml_dtd(tc_namespace,
  11034. test_default_ns_from_ext_subset_and_ext_ge);
  11035. tcase_add_test(tc_namespace, test_ns_prefix_with_empty_uri_1);
  11036. tcase_add_test(tc_namespace, test_ns_prefix_with_empty_uri_2);
  11037. tcase_add_test(tc_namespace, test_ns_prefix_with_empty_uri_3);
  11038. tcase_add_test(tc_namespace, test_ns_prefix_with_empty_uri_4);
  11039. tcase_add_test(tc_namespace, test_ns_unbound_prefix);
  11040. tcase_add_test(tc_namespace, test_ns_default_with_empty_uri);
  11041. tcase_add_test(tc_namespace, test_ns_duplicate_attrs_diff_prefixes);
  11042. tcase_add_test(tc_namespace, test_ns_duplicate_hashes);
  11043. tcase_add_test(tc_namespace, test_ns_unbound_prefix_on_attribute);
  11044. tcase_add_test(tc_namespace, test_ns_unbound_prefix_on_element);
  11045. tcase_add_test(tc_namespace, test_ns_parser_reset);
  11046. tcase_add_test(tc_namespace, test_ns_long_element);
  11047. tcase_add_test(tc_namespace, test_ns_mixed_prefix_atts);
  11048. tcase_add_test(tc_namespace, test_ns_extend_uri_buffer);
  11049. tcase_add_test(tc_namespace, test_ns_reserved_attributes);
  11050. tcase_add_test(tc_namespace, test_ns_reserved_attributes_2);
  11051. tcase_add_test(tc_namespace, test_ns_extremely_long_prefix);
  11052. tcase_add_test(tc_namespace, test_ns_unknown_encoding_success);
  11053. tcase_add_test(tc_namespace, test_ns_double_colon);
  11054. tcase_add_test(tc_namespace, test_ns_double_colon_element);
  11055. tcase_add_test(tc_namespace, test_ns_bad_attr_leafname);
  11056. tcase_add_test(tc_namespace, test_ns_bad_element_leafname);
  11057. tcase_add_test(tc_namespace, test_ns_utf16_leafname);
  11058. tcase_add_test(tc_namespace, test_ns_utf16_element_leafname);
  11059. tcase_add_test(tc_namespace, test_ns_utf16_doctype);
  11060. tcase_add_test(tc_namespace, test_ns_invalid_doctype);
  11061. tcase_add_test(tc_namespace, test_ns_double_colon_doctype);
  11062. tcase_add_test(tc_namespace, test_ns_separator_in_uri);
  11063. suite_add_tcase(s, tc_misc);
  11064. tcase_add_checked_fixture(tc_misc, NULL, basic_teardown);
  11065. tcase_add_test(tc_misc, test_misc_alloc_create_parser);
  11066. tcase_add_test(tc_misc, test_misc_alloc_create_parser_with_encoding);
  11067. tcase_add_test(tc_misc, test_misc_null_parser);
  11068. tcase_add_test(tc_misc, test_misc_error_string);
  11069. tcase_add_test(tc_misc, test_misc_version);
  11070. tcase_add_test(tc_misc, test_misc_features);
  11071. tcase_add_test(tc_misc, test_misc_attribute_leak);
  11072. tcase_add_test(tc_misc, test_misc_utf16le);
  11073. tcase_add_test(tc_misc, test_misc_stop_during_end_handler_issue_240_1);
  11074. tcase_add_test(tc_misc, test_misc_stop_during_end_handler_issue_240_2);
  11075. tcase_add_test__ifdef_xml_dtd(
  11076. tc_misc, test_misc_deny_internal_entity_closing_doctype_issue_317);
  11077. suite_add_tcase(s, tc_alloc);
  11078. tcase_add_checked_fixture(tc_alloc, alloc_setup, alloc_teardown);
  11079. tcase_add_test(tc_alloc, test_alloc_parse_xdecl);
  11080. tcase_add_test(tc_alloc, test_alloc_parse_xdecl_2);
  11081. tcase_add_test(tc_alloc, test_alloc_parse_pi);
  11082. tcase_add_test(tc_alloc, test_alloc_parse_pi_2);
  11083. tcase_add_test(tc_alloc, test_alloc_parse_pi_3);
  11084. tcase_add_test(tc_alloc, test_alloc_parse_comment);
  11085. tcase_add_test(tc_alloc, test_alloc_parse_comment_2);
  11086. tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_create_external_parser);
  11087. tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_run_external_parser);
  11088. tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_dtd_copy_default_atts);
  11089. tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_external_entity);
  11090. tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_ext_entity_set_encoding);
  11091. tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_internal_entity);
  11092. tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_dtd_default_handling);
  11093. tcase_add_test(tc_alloc, test_alloc_explicit_encoding);
  11094. tcase_add_test(tc_alloc, test_alloc_set_base);
  11095. tcase_add_test(tc_alloc, test_alloc_realloc_buffer);
  11096. tcase_add_test(tc_alloc, test_alloc_ext_entity_realloc_buffer);
  11097. tcase_add_test(tc_alloc, test_alloc_realloc_many_attributes);
  11098. tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_public_entity_value);
  11099. tcase_add_test__ifdef_xml_dtd(tc_alloc,
  11100. test_alloc_realloc_subst_public_entity_value);
  11101. tcase_add_test(tc_alloc, test_alloc_parse_public_doctype);
  11102. tcase_add_test(tc_alloc, test_alloc_parse_public_doctype_long_name);
  11103. tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_set_foreign_dtd);
  11104. tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_attribute_enum_value);
  11105. tcase_add_test__ifdef_xml_dtd(tc_alloc,
  11106. test_alloc_realloc_attribute_enum_value);
  11107. tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_realloc_implied_attribute);
  11108. tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_realloc_default_attribute);
  11109. tcase_add_test(tc_alloc, test_alloc_notation);
  11110. tcase_add_test(tc_alloc, test_alloc_public_notation);
  11111. tcase_add_test(tc_alloc, test_alloc_system_notation);
  11112. tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_nested_groups);
  11113. tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_realloc_nested_groups);
  11114. tcase_add_test(tc_alloc, test_alloc_large_group);
  11115. tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_realloc_group_choice);
  11116. tcase_add_test(tc_alloc, test_alloc_pi_in_epilog);
  11117. tcase_add_test(tc_alloc, test_alloc_comment_in_epilog);
  11118. tcase_add_test__ifdef_xml_dtd(tc_alloc,
  11119. test_alloc_realloc_long_attribute_value);
  11120. tcase_add_test(tc_alloc, test_alloc_attribute_whitespace);
  11121. tcase_add_test(tc_alloc, test_alloc_attribute_predefined_entity);
  11122. tcase_add_test(tc_alloc, test_alloc_long_attr_default_with_char_ref);
  11123. tcase_add_test(tc_alloc, test_alloc_long_attr_value);
  11124. tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_nested_entities);
  11125. tcase_add_test__ifdef_xml_dtd(tc_alloc,
  11126. test_alloc_realloc_param_entity_newline);
  11127. tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_realloc_ce_extends_pe);
  11128. tcase_add_test__ifdef_xml_dtd(tc_alloc, test_alloc_realloc_attributes);
  11129. tcase_add_test(tc_alloc, test_alloc_long_doc_name);
  11130. tcase_add_test(tc_alloc, test_alloc_long_base);
  11131. tcase_add_test(tc_alloc, test_alloc_long_public_id);
  11132. tcase_add_test(tc_alloc, test_alloc_long_entity_value);
  11133. tcase_add_test(tc_alloc, test_alloc_long_notation);
  11134. suite_add_tcase(s, tc_nsalloc);
  11135. tcase_add_checked_fixture(tc_nsalloc, nsalloc_setup, nsalloc_teardown);
  11136. tcase_add_test(tc_nsalloc, test_nsalloc_xmlns);
  11137. tcase_add_test(tc_nsalloc, test_nsalloc_parse_buffer);
  11138. tcase_add_test(tc_nsalloc, test_nsalloc_long_prefix);
  11139. tcase_add_test(tc_nsalloc, test_nsalloc_long_uri);
  11140. tcase_add_test(tc_nsalloc, test_nsalloc_long_attr);
  11141. tcase_add_test(tc_nsalloc, test_nsalloc_long_attr_prefix);
  11142. tcase_add_test(tc_nsalloc, test_nsalloc_realloc_attributes);
  11143. tcase_add_test(tc_nsalloc, test_nsalloc_long_element);
  11144. tcase_add_test(tc_nsalloc, test_nsalloc_realloc_binding_uri);
  11145. tcase_add_test(tc_nsalloc, test_nsalloc_realloc_long_prefix);
  11146. tcase_add_test(tc_nsalloc, test_nsalloc_realloc_longer_prefix);
  11147. tcase_add_test(tc_nsalloc, test_nsalloc_long_namespace);
  11148. tcase_add_test(tc_nsalloc, test_nsalloc_less_long_namespace);
  11149. tcase_add_test(tc_nsalloc, test_nsalloc_long_context);
  11150. tcase_add_test(tc_nsalloc, test_nsalloc_realloc_long_context);
  11151. tcase_add_test(tc_nsalloc, test_nsalloc_realloc_long_context_2);
  11152. tcase_add_test(tc_nsalloc, test_nsalloc_realloc_long_context_3);
  11153. tcase_add_test(tc_nsalloc, test_nsalloc_realloc_long_context_4);
  11154. tcase_add_test(tc_nsalloc, test_nsalloc_realloc_long_context_5);
  11155. tcase_add_test(tc_nsalloc, test_nsalloc_realloc_long_context_6);
  11156. tcase_add_test(tc_nsalloc, test_nsalloc_realloc_long_context_7);
  11157. tcase_add_test(tc_nsalloc, test_nsalloc_realloc_long_ge_name);
  11158. tcase_add_test(tc_nsalloc, test_nsalloc_realloc_long_context_in_dtd);
  11159. tcase_add_test(tc_nsalloc, test_nsalloc_long_default_in_ext);
  11160. tcase_add_test(tc_nsalloc, test_nsalloc_long_systemid_in_ext);
  11161. tcase_add_test(tc_nsalloc, test_nsalloc_prefixed_element);
  11162. #if defined(XML_DTD)
  11163. suite_add_tcase(s, tc_accounting);
  11164. tcase_add_test(tc_accounting, test_accounting_precision);
  11165. tcase_add_test(tc_accounting, test_billion_laughs_attack_protection_api);
  11166. tcase_add_test(tc_accounting, test_helper_unsigned_char_to_printable);
  11167. #endif
  11168. return s;
  11169. }
  11170. int
  11171. main(int argc, char *argv[]) {
  11172. int i, nf;
  11173. int verbosity = CK_NORMAL;
  11174. Suite *s = make_suite();
  11175. SRunner *sr = srunner_create(s);
  11176. /* run the tests for internal helper functions */
  11177. testhelper_is_whitespace_normalized();
  11178. for (i = 1; i < argc; ++i) {
  11179. char *opt = argv[i];
  11180. if (strcmp(opt, "-v") == 0 || strcmp(opt, "--verbose") == 0)
  11181. verbosity = CK_VERBOSE;
  11182. else if (strcmp(opt, "-q") == 0 || strcmp(opt, "--quiet") == 0)
  11183. verbosity = CK_SILENT;
  11184. else {
  11185. fprintf(stderr, "runtests: unknown option '%s'\n", opt);
  11186. return 2;
  11187. }
  11188. }
  11189. if (verbosity != CK_SILENT)
  11190. printf("Expat version: %" XML_FMT_STR "\n", XML_ExpatVersion());
  11191. srunner_run_all(sr, verbosity);
  11192. nf = srunner_ntests_failed(sr);
  11193. srunner_free(sr);
  11194. return (nf == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
  11195. }