allocman: fix use of ALLOCMAN_NO_PADDR

Throughout allocman, various parts of the code for allocating a
specific paddr would check that the paddr fell within the bounds of a
given untyped node. Unfortunately, in some cases ALLOCMAN_NO_PADDR +
node->size would overlap with the paddr and cause a false positive -
allocman would *think* that a given node contains the request paddr,
when in fact it didn't.

Eventually, everything would fall apart: ALLOCMAN_NO_PADDR+node->size
would not be large enough to reach the paddr, and allocman would end
up with a NULL node where it wasn't expecting one.

Fix this issue by avoiding nodes with paddr == ALLOCMAN_NO_PADDR
whenever we're searching through node lists, thus preventing
such 'false positive' situations from occurring.
diff --git a/libsel4allocman/src/utspace/split.c b/libsel4allocman/src/utspace/split.c
index 9161dd7..5eec0d1 100644
--- a/libsel4allocman/src/utspace/split.c
+++ b/libsel4allocman/src/utspace/split.c
@@ -140,6 +140,9 @@
     } else {
         /* see if the pool has the paddr we want */
         for (node = heads[size_bits]; node; node = node->next) {
+            if (node->paddr == ALLOCMAN_NO_PADDR) {
+                continue;
+            }
             if (node->paddr <= paddr && paddr < node->paddr + BIT(size_bits)) {
                 return 0;
             }
@@ -161,8 +164,8 @@
         /* use the first node for lack of a better one */
         node = heads[size_bits + 1];
     } else {
-        for (node = heads[size_bits + 1]; node && !(node->paddr <= paddr
-                                                    && paddr < node->paddr + BIT(size_bits + 1)); node = node->next);
+        for (node = heads[size_bits + 1]; node && (node->paddr == ALLOCMAN_NO_PADDR || !(node->paddr <= paddr
+                                                                                         && paddr < node->paddr + BIT(size_bits + 1))); node = node->next);
         /* _refill_pool should not have returned if this wasn't possible */
         assert(node);
     }
@@ -226,6 +229,10 @@
     for (i = 0; i < CONFIG_WORD_SIZE; i++) {
         struct utspace_split_node *node;
         for (node = head[i]; node; node = node->next) {
+            if (node->paddr == ALLOCMAN_NO_PADDR) {
+                /* skip nodes with no physical address */
+                continue;
+            }
             if (node->paddr <= paddr && paddr + BIT(size_bits) <= node->paddr + BIT(i)) {
                 return head;
             }
@@ -274,7 +281,7 @@
         /* search for the node we want to use. We have the advantage of knowing that
          * due to objects being size aligned that the base paddr of the untyped will
          * be exactly the paddr we want */
-        for (node = head[size_bits]; node && node->paddr != paddr; node = node->next);
+        for (node = head[size_bits]; node && (node->paddr == ALLOCMAN_NO_PADDR || node->paddr != paddr); node = node->next);
         /* _refill_pool should not have returned if this wasn't possible */
         assert(node);
     } else {