Exemple #1
0
        private static void BuildStringHelper(JsonNode root, IFingerprinter wr)
        {
            if (root.Children.Count == 1 && root.Values.Count == 0)
            {
                wr.AddNested(root.Name, nestedWr =>
                {
                    BuildStringHelper(root.Children.First.Value, nestedWr);
                });
            }
            else if (root.Children.Count == 0 && root.Values.Count == 1)
            {
                wr.Add(root.Name, root.Values[0]);
            }
            else
            {
                // Adding a collection is typically used to add a homogeneous collection of objects.
                // In this case, the values of the node and the children of the node both need to be added within the same nested collection.
                // To get around this without adding two collections associated with the same node, use just the current root node as the collection and
                // manually add the node's values and node's children.
                wr.AddCollection <JsonNode, IEnumerable <JsonNode> >(root.Name, new JsonNode[] { root }, (collectionWriter, n) =>
                {
                    foreach (var value in n.Values)
                    {
                        collectionWriter.Add(value);
                    }

                    for (var it = n.Children.First; it != null; it = it.Next)
                    {
                        BuildStringHelper(it.Value, collectionWriter);
                    }
                });
            }
        }
Exemple #2
0
        /// <inheritdoc />
        protected override void AddWeakFingerprint(IFingerprinter fingerprinter, SealDirectory sealDirectory)
        {
            Contract.Requires(fingerprinter != null);
            Contract.Requires(sealDirectory != null);

            base.AddWeakFingerprint(fingerprinter, sealDirectory);

            // For non-composite shared opaque directories, contents and composed directories are always empty, and therefore the static fingerprint
            // is not strong enough, i.e. multiple shared opaques can share the same directory root. So in this case we need to add the fingerprint of the producer
            if (sealDirectory.Kind == SealDirectoryKind.SharedOpaque && !sealDirectory.IsComposite)
            {
                DirectoryArtifact directory = sealDirectory.Directory;
                fingerprinter.Add(directory, m_directoryProducerFingerprintLookup(directory).Hash);
            }

            if (!ExcludeSemiStableHashOnFingerprintingSealDirectory && !sealDirectory.Kind.IsDynamicKind())
            {
                // A statically sealed directory can exist as multiple different instances, e.g., one can have partially sealed directories with the same root and member set.
                // To distinguish those instances, we include the semi stable hash as part of the static fingerprint.
                fingerprinter.Add("SemiStableHash", sealDirectory.SemiStableHash);
            }
        }
Exemple #3
0
        /// <inheritdoc />
        protected override void AddWeakFingerprint(IFingerprinter fingerprinter, SealDirectory sealDirectory)
        {
            Contract.Requires(fingerprinter != null);
            Contract.Requires(sealDirectory != null);

            base.AddWeakFingerprint(fingerprinter, sealDirectory);

            if (!ExcludeSemiStableHashOnFingerprintingSealDirectory && !sealDirectory.Kind.IsDynamicKind())
            {
                // A statically sealed directory can exist as multiple different instances, e.g., one can have partially sealed directories with the same root and member set.
                // To distinguish those instances, we include the semi stable hash as part of the static fingerprint.
                fingerprinter.Add("SemiStableHash", sealDirectory.SemiStableHash);
            }
        }
Exemple #4
0
        /// <inheritdoc />
        public void WriteFingerprintInputs(IFingerprinter writer)
        {
            using (var stream = new MemoryStream())
            {
                using (var buildXLWriter = new BuildXLWriter(
                           debug: false,
                           stream: stream,
                           leaveOpen: false,
                           logStats: false))
                {
                    UnsafeOptions.Serialize(buildXLWriter);
                    writer.Add("SerializedUnsafeOptions", System.BitConverter.ToString(stream.ToArray()));
                }
            }

            var thisRef = this;

            writer.AddNested(ObservedPathEntryConstants.PathSet, w =>
            {
                foreach (var p in thisRef.PathEntries)
                {
                    w.Add(ObservedPathEntryConstants.Path, p.Path);
                    if (p.Flags != ObservedPathEntryFlags.None)
                    {
                        w.Add(ObservedPathEntryConstants.Flags, p.Flags.ToString());
                    }
                    if (p.EnumeratePatternRegex != null)
                    {
                        w.Add(ObservedPathEntryConstants.EnumeratePatternRegex, p.EnumeratePatternRegex);
                    }
                }
            });

            writer.AddCollection <StringId, ReadOnlyArray <StringId> >(
                "ObservedAccessedFileNames",
                ObservedAccessedFileNames,
                (w, v) => w.Add(v));

            // Observed inputs are included directly into the strong fingerprint hash computation,
            // so they do not need to be serialized here
        }
Exemple #5
0
        /// <summary>
        /// Compute fingerprint associated with this unsafe options.
        /// </summary>
        public void ComputeFingerprint(IFingerprinter fingerprinter)
        {
            fingerprinter.Add(nameof(UnsafeConfiguration.SandboxKind), UnsafeConfiguration.SandboxKind.ToString());
            fingerprinter.Add(nameof(UnsafeConfiguration.ExistingDirectoryProbesAsEnumerations), getBoolString(UnsafeConfiguration.ExistingDirectoryProbesAsEnumerations));
            fingerprinter.Add(nameof(UnsafeConfiguration.IgnoreGetFinalPathNameByHandle), getBoolString(UnsafeConfiguration.IgnoreGetFinalPathNameByHandle));
            fingerprinter.Add(nameof(UnsafeConfiguration.IgnoreNonCreateFileReparsePoints), getBoolString(UnsafeConfiguration.IgnoreNonCreateFileReparsePoints));
            fingerprinter.Add(nameof(UnsafeConfiguration.IgnoreReparsePoints), getBoolString(UnsafeConfiguration.IgnoreReparsePoints));
            fingerprinter.Add(nameof(UnsafeConfiguration.IgnoreSetFileInformationByHandle), getBoolString(UnsafeConfiguration.IgnoreSetFileInformationByHandle));
            fingerprinter.Add(nameof(UnsafeConfiguration.IgnoreZwOtherFileInformation), getBoolString(UnsafeConfiguration.IgnoreZwOtherFileInformation));
            fingerprinter.Add(nameof(UnsafeConfiguration.IgnoreZwRenameFileInformation), getBoolString(UnsafeConfiguration.IgnoreZwRenameFileInformation));
            fingerprinter.Add(nameof(UnsafeConfiguration.MonitorFileAccesses), getBoolString(UnsafeConfiguration.MonitorFileAccesses));
            fingerprinter.Add(nameof(UnsafeConfiguration.MonitorNtCreateFile), getBoolString(UnsafeConfiguration.MonitorNtCreateFile));
            fingerprinter.Add(nameof(UnsafeConfiguration.MonitorZwCreateOpenQueryFile), getBoolString(UnsafeConfiguration.MonitorZwCreateOpenQueryFile));
            fingerprinter.Add(nameof(UnsafeConfiguration.PreserveOutputs), UnsafeConfiguration.PreserveOutputs.ToString());
            fingerprinter.Add(nameof(UnsafeConfiguration.UnexpectedFileAccessesAreErrors), getBoolString(UnsafeConfiguration.UnexpectedFileAccessesAreErrors));
            fingerprinter.Add(nameof(UnsafeConfiguration.IgnorePreloadedDlls), getBoolString(UnsafeConfiguration.IgnorePreloadedDlls));
            fingerprinter.Add(nameof(UnsafeConfiguration.IgnoreDynamicWritesOnAbsentProbes), UnsafeConfiguration.IgnoreDynamicWritesOnAbsentProbes.ToString());
            fingerprinter.Add(nameof(UnsafeConfiguration.DoubleWritePolicy), UnsafeConfiguration.DoubleWritePolicy.HasValue ? UnsafeConfiguration.DoubleWritePolicy.Value.ToString() : string.Empty);
            fingerprinter.Add(nameof(UnsafeConfiguration.IgnoreUndeclaredAccessesUnderSharedOpaques), getBoolString(UnsafeConfiguration.IgnoreUndeclaredAccessesUnderSharedOpaques));

            if (m_preservedOutputInfo.HasValue)
            {
                fingerprinter.AddNested("PreserveOutputInfo", fp => m_preservedOutputInfo.Value.ComputeFingerprint(fp));
            }
Exemple #6
0
 /// <summary>
 /// Computes fingerprint.
 /// </summary>
 public void ComputeFingerprint(IFingerprinter fingerprinter)
 {
     fingerprinter.Add(nameof(Salt), Salt.ToHex());
     fingerprinter.Add(nameof(PreserveOutputTrustLevel), PreserveOutputTrustLevel);
 }