Loading...
libkern/c++/OSSymbol.cpp xnu-1228 xnu-1699.32.7
--- xnu/xnu-1228/libkern/c++/OSSymbol.cpp
+++ xnu/xnu-1699.32.7/libkern/c++/OSSymbol.cpp
@@ -79,7 +79,7 @@
     Bucket *buckets;
     unsigned int nBuckets;
     unsigned int count;
-    mutex_t *poolGate;
+    lck_mtx_t *poolGate;
 
     static inline void hashSymbol(const char *s,
                                   unsigned int *hashP,
@@ -115,8 +115,8 @@
 
     bool init();
 
-    inline void closeGate() { mutex_lock(poolGate); };
-    inline void openGate()  { mutex_unlock(poolGate); };
+    inline void closeGate() { lck_mtx_lock(poolGate); };
+    inline void openGate()  { lck_mtx_unlock(poolGate); };
 
     OSSymbol *findSymbol(const char *cString) const;
     OSSymbol *insertSymbol(OSSymbol *sym);
@@ -141,6 +141,8 @@
     kfree(mem, size);
     ACCUMSIZE(-size);
 }
+
+extern lck_grp_t *IOLockGroup;
 
 bool OSSymbolPool::init()
 {
@@ -153,7 +155,7 @@
 
     bzero(buckets, nBuckets * sizeof(Bucket));
 
-    poolGate = mutex_alloc(0);
+    poolGate = lck_mtx_alloc_init(IOLockGroup, LCK_ATTR_NULL);
 
     return poolGate != 0;
 }
@@ -175,7 +177,7 @@
     }
 
     if (poolGate)
-        kfree(poolGate, 36 * 4);
+        lck_mtx_free(poolGate, IOLockGroup);
 }
 
 unsigned long OSSymbolPool::log2(unsigned int x)
@@ -273,7 +275,7 @@
         probeSymbol = (OSSymbol *) thisBucket->symbolP;
 
         if (inLen == probeSymbol->length
-        &&  (strcmp(probeSymbol->string, cString) == 0))
+        &&  (strncmp(probeSymbol->string, cString, probeSymbol->length) == 0))
             return probeSymbol;
 	return 0;
     }
@@ -281,7 +283,7 @@
     for (list = thisBucket->symbolP; j--; list++) {
         probeSymbol = *list;
         if (inLen == probeSymbol->length
-        &&  (strcmp(probeSymbol->string, cString) == 0))
+        &&  (strncmp(probeSymbol->string, cString, probeSymbol->length) == 0))
             return probeSymbol;
     }
 
@@ -310,7 +312,7 @@
         probeSymbol = (OSSymbol *) thisBucket->symbolP;
 
         if (inLen == probeSymbol->length
-        &&  strcmp(probeSymbol->string, cString) == 0)
+        &&  strncmp(probeSymbol->string, cString, probeSymbol->length) == 0)
             return probeSymbol;
 
         list = (OSSymbol **) kalloc(2 * sizeof(OSSymbol *));
@@ -329,7 +331,7 @@
     for (list = thisBucket->symbolP; j--; list++) {
         probeSymbol = *list;
         if (inLen == probeSymbol->length
-        &&  strcmp(probeSymbol->string, cString) == 0)
+        &&  strncmp(probeSymbol->string, cString, probeSymbol->length) == 0)
             return probeSymbol;
     }
 
@@ -359,8 +361,11 @@
     j = thisBucket->count;
     list = thisBucket->symbolP;
 
-    if (!j)
+    if (!j) {
+	// couldn't find the symbol; probably means string hash changed
+        panic("removeSymbol");
         return;
+    }
 
     if (j == 1) {
         probeSymbol = (OSSymbol *) list;
@@ -372,6 +377,8 @@
             SHRINK_POOL();
             return;
         }
+	// couldn't find the symbol; probably means string hash changed
+    	panic("removeSymbol");
         return;
     }
 
@@ -397,6 +404,8 @@
             SHRINK_POOL();
             return;
         }
+	// couldn't find the symbol; probably means string hash changed
+    	panic("removeSymbol");
         return;
     }
 
@@ -422,6 +431,8 @@
             return;
         }
     }
+    // couldn't find the symbol; probably means string hash changed
+    panic("removeSymbol");
 }
 
 /*