]> git.saurik.com Git - apple/xnu.git/blobdiff - libsa/catalogue.cpp
xnu-344.21.73.tar.gz
[apple/xnu.git] / libsa / catalogue.cpp
index 2de5325bdb81cdae0d25fff940fcb158ffdf2df4..35c88255f97905d69f462893cc7febcda649e603 100644 (file)
@@ -3,19 +3,22 @@
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
- * The contents of this file constitute Original Code as defined in and
- * are subject to the Apple Public Source License Version 1.1 (the
- * "License").  You may not use this file except in compliance with the
- * License.  Please obtain a copy of the License at
- * http://www.apple.com/publicsource and read it before using this file.
+ * Copyright (c) 1999-2003 Apple Computer, Inc.  All Rights Reserved.
  * 
- * This Original Code and all software distributed under the License are
- * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * This file contains Original Code and/or Modifications of Original Code
+ * as defined in and that are subject to the Apple Public Source License
+ * Version 2.0 (the 'License'). You may not use this file except in
+ * compliance with the License. Please obtain a copy of the License at
+ * http://www.opensource.apple.com/apsl/ and read it before using this
+ * file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
- * License for the specific language governing rights and limitations
- * under the License.
+ * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
+ * Please see the License for the specific language governing rights and
+ * limitations under the License.
  * 
  * @APPLE_LICENSE_HEADER_END@
  */
@@ -425,7 +428,6 @@ OSDictionary * readExtension(OSDictionary * propertyDict,
 
     kmod_info_t          * loaded_kmod = NULL;
 
-
     bootxDriverDataObject = OSDynamicCast(OSData,
         propertyDict->getObject(memory_map_name));
     // don't release bootxDriverDataObject
@@ -490,7 +492,7 @@ OSDictionary * readExtension(OSDictionary * propertyDict,
    /* Check if kmod is already loaded and is a real loadable one (has
     * an address).
     */
-    loaded_kmod = kmod_lookupbyname(driverName->getCStringNoCopy());
+    loaded_kmod = kmod_lookupbyname_locked(driverName->getCStringNoCopy());
     if (loaded_kmod && loaded_kmod->address) {
         IOLog("Skipping new extension \"%s\"; an extension named "
             "\"%s\" is already loaded.\n",
@@ -539,6 +541,10 @@ OSDictionary * readExtension(OSDictionary * propertyDict,
 
 finish:
 
+    if (loaded_kmod) {
+        kfree(loaded_kmod, sizeof(kmod_info_t));
+    }
+
     // do not release bootxDriverDataObject
     // do not release driverName
 
@@ -623,11 +629,12 @@ static bool uncompressFile(u_int8_t *base_address, mkext_file * fileinfo,
             result = false;
             goto finish;
         }
+        uncompressed_file[uncompressed_size] = '\0';
     } else {
         bcopy(base_address + offset, uncompressed_file,
-            compsize);
+            realsize);
+        uncompressed_file[realsize] = '\0';
     }
-    uncompressed_file[uncompressed_size] = '\0';
 
     *file = uncompressedFile;
 
@@ -669,6 +676,8 @@ bool extractExtensionsFromArchive(MemoryMapFileInfo * mkext_file_info,
     mkext_kext   * onekext_data = 0; // don't free
     mkext_file   * plist_file = 0;   // don't free
     mkext_file   * module_file = 0;  // don't free
+    kmod_info_t  * loaded_kmod = 0;  // must free
+
     OSData       * driverPlistDataObject = 0; // must release
     OSDictionary * driverPlist = 0;  // must release
     OSData       * driverCode = 0;   // must release
@@ -748,7 +757,10 @@ bool extractExtensionsFromArchive(MemoryMapFileInfo * mkext_file_info,
          i < OSSwapBigToHostInt32(mkext_data->numkexts);
          i++) {
 
-        kmod_info_t * loaded_kmod = 0;
+        if (loaded_kmod) {
+            kfree(loaded_kmod, sizeof(kmod_info_t));
+            loaded_kmod = 0;
+        }
 
         if (driverPlistDataObject) {
             driverPlistDataObject->release();
@@ -830,7 +842,7 @@ bool extractExtensionsFromArchive(MemoryMapFileInfo * mkext_file_info,
        /* Check if kmod is already loaded and is a real loadable one (has
         * an address).
         */
-        loaded_kmod = kmod_lookupbyname(moduleName->getCStringNoCopy());
+        loaded_kmod = kmod_lookupbyname_locked(moduleName->getCStringNoCopy());
         if (loaded_kmod && loaded_kmod->address) {
             IOLog("Skipping new extension \"%s\"; an extension named "
                 "\"%s\" is already loaded.\n",
@@ -922,6 +934,7 @@ bool extractExtensionsFromArchive(MemoryMapFileInfo * mkext_file_info,
 
 finish:
 
+    if (loaded_kmod) kfree(loaded_kmod, sizeof(kmod_info_t));
     if (driverPlistDataObject) driverPlistDataObject->release();
     if (driverPlist) driverPlist->release();
     if (driverCode)  driverCode->release();
@@ -1077,8 +1090,8 @@ bool addExtensionsFromArchive(OSData * mkextDataObject) {
 
     startupExtensions = getStartupExtensions();
     if (!startupExtensions) {
-        IOLog("Can't record extension archive; there is no
-            extensions dictionary.\n");
+        IOLog("Can't record extension archive; there is no"
+            extensions dictionary.\n");
         LOG_DELAY();
         result = false;
         goto finish;
@@ -1254,7 +1267,6 @@ bool recordStartupExtensions(void) {
 
     while ( (key = OSDynamicCast(OSString,
              keyIterator->getNextObject())) ) {
-
        /* Clear newDriverDict & mkextExtensions upon entry to the loop,
         * handling both successful and unsuccessful iterations.
         */
@@ -1381,7 +1393,7 @@ bool recordStartupExtensions(void) {
 
         // Do not release key.
 
-    } /* while ( (key = OSDynamicCast(OSString, ... */
+    } /* while ( (key = OSDynamicCast(OSString, ...) ) ) */
 
     if (!mergeExtensionDictionaries(existingExtensions, startupExtensions)) {
         IOLog("Error: Failed to merge new extensions into existing set.\n");
@@ -1483,8 +1495,8 @@ void removeStartupExtension(const char * extensionName) {
     keyIterator = OSCollectionIterator::withCollection(
         extensionPersonalities);
     if (!keyIterator) {
-        IOLog("Error: Couldn't allocate iterator to scan
-            personalities for %s.\n", extensionName);
+        IOLog("Error: Couldn't allocate iterator to scan"
+            personalities for %s.\n", extensionName);
         LOG_DELAY();
     }