author | Michael Krelin <hacker@klever.net> | 2009-01-21 19:48:17 (UTC) |
---|---|---|
committer | Michael Krelin <hacker@klever.net> | 2009-01-21 19:48:17 (UTC) |
commit | 485a0816b78fcf53a717e8e7cbeabee0b83091e7 (patch) (side-by-side diff) | |
tree | 1100501fe3590a63ac615ac23747d6d30ed8a2ae /lib/discovery.cc | |
parent | a2a524f744849e81ec91a7afbaf641d1b57e14b1 (diff) | |
download | libopkele-485a0816b78fcf53a717e8e7cbeabee0b83091e7.zip libopkele-485a0816b78fcf53a717e8e7cbeabee0b83091e7.tar.gz libopkele-485a0816b78fcf53a717e8e7cbeabee0b83091e7.tar.bz2 |
Do not bomb out on unusual xml
In particular, properly handle directy Type child of XRD element.
As usually, thanks to Joseph Smarr of Plaxo for spotting it ;-)
Signed-off-by: Michael Krelin <hacker@klever.net>
-rw-r--r-- | lib/discovery.cc | 19 |
1 files changed, 15 insertions, 4 deletions
diff --git a/lib/discovery.cc b/lib/discovery.cc index cbdceb3..f8a3988 100644 --- a/lib/discovery.cc +++ b/lib/discovery.cc @@ -445,43 +445,54 @@ namespace opkele { html_start_element(n,a); }else{ skipping = 1; } } } void end_element(const XML_Char *n) { if(skipping<0) return; if(skipping) { --skipping; return; } if(is_qelement(n,NSURI_XRD "\tType")) { - assert(xrd); assert(xrd_service); assert(cdata==&cdata_buf); + if(xrd && xrd_service) { + assert(cdata==&cdata_buf); xrd_service->types.insert(cdata_buf); + } }else if(is_qelement(n,NSURI_XRD "\tService")) { - assert(xrd); assert(xrd_service); + if(!(xrd && xrd_service)) { + skipping = -1; + }else{ assert(!pt_stack.empty()); assert(pt_stack.back()==(NSURI_XRD "\tService")); pt_stack.pop_back(); xrd_service = 0; + } }else if(is_qelement(n,NSURI_XRD "\tStatus")) { - assert(xrd); + if(!xrd) { + skipping=-1; + }else{ if(is_qelement(pt_stack.back().c_str(),n)) { assert(cdata==&status_string); pt_stack.pop_back(); if(status_code!=100) skipping = -1; } + } }else if(is_qelement(n,NSURI_XRD "\tExpires")) { - assert(xrd); + if(!xrd) { + skipping=-1; + }else{ xrd->expires = util::w3c_to_time(cdata_buf); + } }else if((xmode&xmode_html) && is_element(n,"head")) { skipping = -1; } cdata = 0; } void character_data(const XML_Char *s,int l) { if(skipping) return; if(cdata) cdata->append(s,l); } void html_start_element(const XML_Char *n,const XML_Char **a) { if(is_element(n,"meta")) { |