From e3dc1646d2536efe80e6ea413b452a4938776e57 Mon Sep 17 00:00:00 2001 From: ghidorahrex Date: Fri, 26 Jun 2026 10:22:30 -0400 Subject: [PATCH 1/3] GP-7007: Removed usage of os.system and replaced with subprocess.run --- .../SleighDevTools/pcodetest/build.py | 43 +++++++++---------- 1 file changed, 20 insertions(+), 23 deletions(-) diff --git a/Ghidra/Extensions/SleighDevTools/pcodetest/build.py b/Ghidra/Extensions/SleighDevTools/pcodetest/build.py index 68f9a6483a..1c6eacce4f 100644 --- a/Ghidra/Extensions/SleighDevTools/pcodetest/build.py +++ b/Ghidra/Extensions/SleighDevTools/pcodetest/build.py @@ -14,6 +14,7 @@ # limitations under the License. ## import os +import shlex import shutil import subprocess import sys @@ -32,32 +33,28 @@ class BuildUtil: def run(self, cmd, stdout=False, stderr=False, verbose=True): if isinstance(cmd, str): - if stdout and stderr: - cmd += ' 1>%s 2>%s' % (stdout, stderr) - elif stdout and not stderr: - cmd += ' 1>%s 2>&1' % (stdout) - elif not stdout and stderr: - cmd += ' 2>%s' % (stderr) - if verbose: self.log_info(cmd) - os.system(cmd) + proc = shlex.split(cmd) + string = cmd else: - string = ' '.join(cmd) + proc = cmd + string = " ".join(cmd) + if verbose: self.log_info(string) + try: if stdout: - f = open(stdout, 'w+') - string += ' 1>%s 2>&1' % (stdout) + stdout_f = open(stdout,'w') + stderr_f = open(stderr,'w') if stderr else subprocess.STDOUT + result = subprocess.run(proc, stdout=stdout_f, stderr=stderr_f) + elif stderr: + stdout_f = None + stderr_f = open(stderr,'w') + result = subprocess.run(proc, stdout=stdout_f, stderr=stderr_f) else: - f = subprocess.PIPE - if verbose: self.log_info(string) - try: - sp = subprocess.Popen(cmd, stdout=f, stderr=subprocess.PIPE) - except OSError as e: - self.log_err("Command: " + string) - self.log_err(e.strerror) - return 0, e.strerror - if stdout: f.close() - out, err = sp.communicate() - # print 'run returned %d bytes stdout and %d bytes stderr' % (len(out) if out else 0, len(err) if err else 0) - return out, err + result = subprocess.run(proc,capture_output=True) + except OSError as e: + self.log_err("Command: " + string) + self.log_err(e.strerror) + return 0, e.strerror + return result.stdout, result.stderr def isdir(self, dname): return os.path.isdir(dname) From daf2306fcd7e8a6601f7eaf5e8e4fcb9793162f9 Mon Sep 17 00:00:00 2001 From: ghidra1 Date: Fri, 26 Jun 2026 10:43:42 -0400 Subject: [PATCH 2/3] GP-1 Minor fixes back-ported from GP-6779: project in-use tracking, data type archive address factory --- .../java/ghidra/framework/data/DefaultProjectData.java | 6 ++---- .../main/java/ghidra/framework/data/GhidraFileData.java | 7 +++++++ .../program/model/data/StandAloneDataTypeManager.java | 8 +++++++- 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/Ghidra/Framework/Project/src/main/java/ghidra/framework/data/DefaultProjectData.java b/Ghidra/Framework/Project/src/main/java/ghidra/framework/data/DefaultProjectData.java index b0bd424482..ce4aee0b1f 100644 --- a/Ghidra/Framework/Project/src/main/java/ghidra/framework/data/DefaultProjectData.java +++ b/Ghidra/Framework/Project/src/main/java/ghidra/framework/data/DefaultProjectData.java @@ -1263,11 +1263,9 @@ public class DefaultProjectData implements ProjectData { @Override public void close() { synchronized (this) { - if (!closed) { - closed = true; - } + closed = true; if (inUseCount != 0) { - return; // delay dispose + return; // delay dispose while still in-use } } dispose(); diff --git a/Ghidra/Framework/Project/src/main/java/ghidra/framework/data/GhidraFileData.java b/Ghidra/Framework/Project/src/main/java/ghidra/framework/data/GhidraFileData.java index 337c68d979..3dc3db83ca 100644 --- a/Ghidra/Framework/Project/src/main/java/ghidra/framework/data/GhidraFileData.java +++ b/Ghidra/Framework/Project/src/main/java/ghidra/framework/data/GhidraFileData.java @@ -656,6 +656,13 @@ public class GhidraFileData { DomainFileProxy proxy = new DomainFileProxy(name, parent.getPathname(), doa, DomainFile.DEFAULT_VERSION, fileID, parent.getProjectLocator()); proxy.setLastModified(getLastModifiedTime()); + + // Notify file manager of in-use domain object. + // A link-file object is indirect with tracking intiated by the URL-referenced file. + if (!isLink()) { + projectData.trackDomainFileInUse(doa); + } + return doa; } myFolderItem = folderItem; diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/StandAloneDataTypeManager.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/StandAloneDataTypeManager.java index 1326596935..c2ce47e033 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/StandAloneDataTypeManager.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/StandAloneDataTypeManager.java @@ -437,6 +437,8 @@ public class StandAloneDataTypeManager extends DataTypeManagerDB implements Clos final Language lang = language; final CompilerSpec cspec = compilerSpec; + + // Use ProgramAddressFactory to provide stack space final AddressFactory addrFactory = new ProgramAddressFactory(lang, cspec, s -> null); super.setProgramArchitecture(new ProgramArchitecture() { @@ -733,6 +735,10 @@ public class StandAloneDataTypeManager extends DataTypeManagerDB implements Clos } } + // Use ProgramAddressFactory to provide stack space + final AddressFactory addrFactory = + new ProgramAddressFactory(language, compilerSpec, s -> null); + ProgramArchitecture programArchitecture = new ProgramArchitecture() { @Override @@ -747,7 +753,7 @@ public class StandAloneDataTypeManager extends DataTypeManagerDB implements Clos @Override public AddressFactory getAddressFactory() { - return language.getAddressFactory(); + return addrFactory; } }; From 971bad82b23354e06fd10520fcc433c7de7132dc Mon Sep 17 00:00:00 2001 From: axd1x8a Date: Fri, 26 Jun 2026 01:53:22 +0300 Subject: [PATCH 3/3] Remove explicit socket buffer locks in remote block stream handles --- .../server/stream/RemoteBlockStreamHandle.java | 12 ++---------- .../server/stream/RemoteInputBlockStreamHandle.java | 3 --- .../server/stream/RemoteOutputBlockStreamHandle.java | 3 --- 3 files changed, 2 insertions(+), 16 deletions(-) diff --git a/Ghidra/Features/GhidraServer/src/main/java/ghidra/server/stream/RemoteBlockStreamHandle.java b/Ghidra/Features/GhidraServer/src/main/java/ghidra/server/stream/RemoteBlockStreamHandle.java index acf3a080c1..e8a5f2d532 100644 --- a/Ghidra/Features/GhidraServer/src/main/java/ghidra/server/stream/RemoteBlockStreamHandle.java +++ b/Ghidra/Features/GhidraServer/src/main/java/ghidra/server/stream/RemoteBlockStreamHandle.java @@ -4,9 +4,9 @@ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -133,14 +133,6 @@ public abstract class RemoteBlockStreamHandle implements return blockSize; } - /** - * Get the preferred socket send/receive buffer size to be used - * @return preferred socket send/receive buffer size - */ - protected int getPreferredBufferSize() { - return (getBlockSize() + 4) * 12; - } - /** * Generate a random number for use as a block stream authentication token. * @return random value diff --git a/Ghidra/Features/GhidraServer/src/main/java/ghidra/server/stream/RemoteInputBlockStreamHandle.java b/Ghidra/Features/GhidraServer/src/main/java/ghidra/server/stream/RemoteInputBlockStreamHandle.java index e18501ef83..f98e8b9d32 100644 --- a/Ghidra/Features/GhidraServer/src/main/java/ghidra/server/stream/RemoteInputBlockStreamHandle.java +++ b/Ghidra/Features/GhidraServer/src/main/java/ghidra/server/stream/RemoteInputBlockStreamHandle.java @@ -124,7 +124,6 @@ public class RemoteInputBlockStreamHandle extends RemoteBlockStreamHandle