]> git.saurik.com Git - apple/security.git/blobdiff - OSX/libsecurity_codesigning/lib/slcrep.cpp
Security-59306.11.20.tar.gz
[apple/security.git] / OSX / libsecurity_codesigning / lib / slcrep.cpp
index 8a0ecbd4ed06d88edf034f2b31e4afb83a7df1e4..602436e3d18bdbdd5c1f7be30803319730655354 100644 (file)
@@ -149,10 +149,13 @@ void DYLDCacheRep::Writer::flush()
 
 
 //
-// The discretionary additions insert a Scatter vector describing the file's mapping table.
+// The discretionary additions insert a Scatter vector describing the file's mapping table,
+// and fills out the executable segment.
 //
 void DYLDCacheRep::Writer::addDiscretionary(CodeDirectory::Builder &builder)
 {
+       bool execSegmentProcessed = false;
+
        unsigned count = rep->mCache.mappingCount();
        builder.scatter(count);
        for (unsigned n = 0; n < count; n++) {
@@ -163,6 +166,14 @@ void DYLDCacheRep::Writer::addDiscretionary(CodeDirectory::Builder &builder)
                assert(dmap.offset() % segmentedPageSize == 0);
                scatter->count = (uint32_t)(dmap.size() / segmentedPageSize);
                assert(dmap.size() % segmentedPageSize == 0);
+
+               if (dmap.maxProt() & VM_PROT_EXECUTE) {
+                       if (execSegmentProcessed) {
+                               CSError::throwMe(errSecMultipleExecSegments);
+                       }
+
+                       builder.execSeg(dmap.offset(), dmap.limit()-dmap.address(), 0);
+               }
        }
 }