From 15e4335edaef674699d55cdf014405150ed31784 Mon Sep 17 00:00:00 2001 From: ghidra1 Date: Wed, 12 Mar 2025 15:47:59 -0400 Subject: [PATCH] GP-5479 Corrected Function Storage Editor issues --- .../editor/StorageAddressEditorDialog.java | 7 ++++--- .../function/editor/StorageAddressModel.java | 2 +- .../core/function/editor/VarnodeTableModel.java | 16 +++++++++++++--- 3 files changed, 18 insertions(+), 7 deletions(-) diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/function/editor/StorageAddressEditorDialog.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/function/editor/StorageAddressEditorDialog.java index 694b57a76a..b2d5941ce3 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/function/editor/StorageAddressEditorDialog.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/function/editor/StorageAddressEditorDialog.java @@ -32,7 +32,8 @@ import ghidra.app.services.DataTypeManagerService; import ghidra.app.util.datatype.DataTypeSelectionEditor; import ghidra.app.util.datatype.NavigationDirection; import ghidra.program.model.address.Address; -import ghidra.program.model.data.*; +import ghidra.program.model.data.AbstractFloatDataType; +import ghidra.program.model.data.DataType; import ghidra.program.model.lang.Register; import ghidra.program.model.listing.*; import ghidra.util.HelpLocation; @@ -131,12 +132,12 @@ public class StorageAddressEditorDialog extends DialogComponentProvider private void setDataType(DataType dt) { currentDataType = dt; size = dt.getLength(); - boolean unconstrained = (dt instanceof AbstractFloatDataType) || Undefined.isUndefined(dt); + boolean unconstrained = (dt instanceof AbstractFloatDataType) || (dt == DataType.DEFAULT); model.setRequiredSize(size, unconstrained); if (sizeLabel != null) { sizeLabel.setText(Integer.toString(size)); - dataChanged(); } + model.notifyDataChanged(); } private void maybeHandleTabNavigation() { diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/function/editor/StorageAddressModel.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/function/editor/StorageAddressModel.java index 24ddd2bed0..3b833ba13a 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/function/editor/StorageAddressModel.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/function/editor/StorageAddressModel.java @@ -155,7 +155,6 @@ class StorageAddressModel { void notifyDataChanged() { validate(); - SwingUtilities.invokeLater(() -> listener.dataChanged()); } @@ -174,6 +173,7 @@ class StorageAddressModel { } else if (currentSize < requiredSize) { statusText = "Warning: Not enough storage space allocated"; + return false; } else if (currentSize > requiredSize) { statusText = "Warning: Too much storage space allocated"; diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/function/editor/VarnodeTableModel.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/function/editor/VarnodeTableModel.java index 203d9f8120..aebd48c244 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/function/editor/VarnodeTableModel.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/function/editor/VarnodeTableModel.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. @@ -155,7 +155,14 @@ class VarnodeTableModel extends AbstractGTableModel { return; } if (aValue instanceof Address) { - storageModel.setVarnode(varnode, (Address) aValue, varnode.getSize()); + Integer size = varnode.getSize(); + if (size == null) { + size = storageModel.getRequiredSize() - storageModel.getCurrentSize(); + if (size <= 0) { + size = 1; + } + } + storageModel.setVarnode(varnode, (Address) aValue, size); } else if (aValue instanceof Register) { storageModel.setVarnode(varnode, (Register) aValue); @@ -187,6 +194,9 @@ class VarnodeTableModel extends AbstractGTableModel { } Address address = varnode.getAddress(); int size = (Integer) aValue; + if (size <= 0) { + return; + } if (address != null) { Register reg = varnode.getRegister(); if (reg != null && reg.isBigEndian()) {