From 39504d1437cb589e25d625059015905b6faf2332 Mon Sep 17 00:00:00 2001 From: Mis012 Date: Fri, 29 Nov 2024 00:23:42 +0100 Subject: [PATCH] XmlBlock: nativeNext: properly skip certain tags, throw exception for BAD_DOCUMENT --- .../content/android_content_res_XmlBlock.c | 24 +++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/src/api-impl-jni/content/android_content_res_XmlBlock.c b/src/api-impl-jni/content/android_content_res_XmlBlock.c index bbafac1c..49e50460 100644 --- a/src/api-impl-jni/content/android_content_res_XmlBlock.c +++ b/src/api-impl-jni/content/android_content_res_XmlBlock.c @@ -15,10 +15,26 @@ JNIEXPORT jlong JNICALL Java_android_content_res_XmlBlock_nativeCreateParseState JNIEXPORT jint JNICALL Java_android_content_res_XmlBlock_nativeNext(JNIEnv *env, jobject this, jlong parser_ptr) { struct ResXMLParser *parser = (struct ResXMLParser *)_PTR(parser_ptr); - enum event_code_t ret = ResXMLParser_next(parser); - if (ret > 0x100) - return ret - 0x100; - return ret; + while (1) { + enum event_code_t code = ResXMLParser_next(parser); + switch (code) { + case START_TAG: + case END_TAG: + case TEXT: + return code - 0x100; + + case START_DOCUMENT: + case END_DOCUMENT: + return code; + + case BAD_DOCUMENT: + (*env)->ThrowNew(env, (*env)->FindClass(env, "org/xmlpull/v1/XmlPullParserException"), "ResXMLParser_next returned BAD_DOCUMENT"); + return code; + default: + continue; + + } + } } JNIEXPORT jstring JNICALL Java_android_content_res_XmlBlock_nativeGetPooledString(JNIEnv *env, jobject this, jlong parser_ptr, jint index)