]> granicus.if.org Git - php/commitdiff
Clarify SimpleXML comparison logic
authorNikita Popov <nikita.ppv@gmail.com>
Tue, 31 Mar 2020 10:48:57 +0000 (12:48 +0200)
committerNikita Popov <nikita.ppv@gmail.com>
Tue, 31 Mar 2020 10:48:57 +0000 (12:48 +0200)
ext/simplexml/simplexml.c

index 99ca0b2aa1056d7b12e12e61031fbeb2e4aa1e88..f44c26828698c2a3b562f206c71e3c128660f0cc 100644 (file)
@@ -1291,16 +1291,24 @@ static int sxe_objects_compare(zval *object1, zval *object2) /* {{{ */
        sxe1 = Z_SXEOBJ_P(object1);
        sxe2 = Z_SXEOBJ_P(object2);
 
-       if (sxe1->node == NULL) {
-               if (sxe2->node) {
-                       return 1;
-               } else if (sxe1->document->ptr == sxe2->document->ptr) {
+       if (sxe1->node != NULL && sxe2->node != NULL) {
+               /* Both nodes set: Only support equality comparison between nodes. */
+               if (sxe1->node == sxe2->node) {
                        return 0;
                }
-               return 1;
-       } else {
-               return !(sxe1->node == sxe2->node);
+               return ZEND_UNCOMPARABLE;
        }
+
+       if (sxe1->node == NULL && sxe2->node == NULL) {
+               /* Both nodes not set: Only support equality comparison between documents. */
+               if (sxe1->document->ptr == sxe2->document->ptr) {
+                       return 0;
+               }
+               return ZEND_UNCOMPARABLE;
+       }
+
+       /* Only one of the nodes set: Cannot compare. */
+       return ZEND_UNCOMPARABLE;
 }
 /* }}} */