]> git.saurik.com Git - apple/xnu.git/blobdiff - libkern/c++/OSUnserializeXML.cpp
xnu-3789.1.32.tar.gz
[apple/xnu.git] / libkern / c++ / OSUnserializeXML.cpp
index e5a692141c481116a4e190f29ea2b938dda703b0..37c40da4d97fbcf924644e4d61b6e6670bf3f85e 100644 (file)
@@ -2014,6 +2014,7 @@ getTag(parser_state_t *state,
                if (c == '\n') state->lineNumber++;
                if (c != '?') continue;
                c = nextChar();
+               if (!c) return TAG_IGNORE;
                if (c == '>') {
                    (void)nextChar();
                    return TAG_IGNORE;
@@ -2068,6 +2069,7 @@ getTag(parser_state_t *state,
                        values[*attributeCount][length++] = c;
                        if (length >= (TAG_MAX_LENGTH - 1)) return TAG_BAD;
                        c = nextChar();
+                       if (!c) return TAG_BAD;
                }
                values[*attributeCount][length] = 0;
 
@@ -2788,9 +2790,10 @@ OSObject*
 OSUnserializeXML(const char *buffer, OSString **errorString)
 {
        OSObject *object;
-       parser_state_t *state = (parser_state_t *)malloc(sizeof(parser_state_t));
 
-       if ((!state) || (!buffer)) return 0;
+       if (!buffer) return 0;
+       parser_state_t *state = (parser_state_t *)malloc(sizeof(parser_state_t));
+       if (!state) return 0;
 
        // just in case
        if (errorString) *errorString = NULL;
@@ -2816,13 +2819,18 @@ OSUnserializeXML(const char *buffer, OSString **errorString)
        return object;
 }
 
+#include <libkern/OSSerializeBinary.h>
+
 OSObject*
 OSUnserializeXML(const char *buffer, size_t bufferSize, OSString **errorString)
 {
-       if ((!buffer) || (!bufferSize)) return 0;
+       if (!buffer) return (0);
+    if (bufferSize < sizeof(kOSSerializeBinarySignature)) return (0);
+
+       if (!strcmp(kOSSerializeBinarySignature, buffer)) return OSUnserializeBinary(buffer, bufferSize, errorString);
 
        // XML must be null terminated
-       if (buffer[bufferSize - 1] || strnlen(buffer, bufferSize) == bufferSize) return 0;
+       if (buffer[bufferSize - 1]) return 0;
 
        return OSUnserializeXML(buffer, errorString);
 }