diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/merge/listing/BookmarkMerger.java b/Ghidra/Features/Base/src/main/java/ghidra/app/merge/listing/BookmarkMerger.java index c9b8b3021e..5bb469e555 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/merge/listing/BookmarkMerger.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/merge/listing/BookmarkMerger.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. @@ -15,16 +15,6 @@ */ package ghidra.app.merge.listing; -import ghidra.app.merge.tool.ListingMergePanel; -import ghidra.app.merge.util.ConflictUtility; -import ghidra.program.model.address.*; -import ghidra.program.model.listing.*; -import ghidra.program.model.mem.MemoryAccessException; -import ghidra.program.util.ProgramConflictException; -import ghidra.util.exception.AssertException; -import ghidra.util.exception.CancelledException; -import ghidra.util.task.TaskMonitor; - import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.Hashtable; @@ -33,6 +23,17 @@ import javax.swing.SwingUtilities; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; +import ghidra.app.merge.tool.ListingMergePanel; +import ghidra.app.merge.util.ConflictUtility; +import ghidra.program.model.address.*; +import ghidra.program.model.listing.*; +import ghidra.program.model.mem.MemoryAccessException; +import ghidra.program.util.ProgramConflictException; +import ghidra.util.SystemUtilities; +import ghidra.util.exception.AssertException; +import ghidra.util.exception.CancelledException; +import ghidra.util.task.TaskMonitor; + /** * Class for merging bookmark changes. This class can merge non-conflicting * bookmark changes that were made to the checked out version. It can determine @@ -168,8 +169,8 @@ class BookmarkMerger extends AbstractListingMerger { if (latest.length == 1) { String latestCategory = latest[0].getCategory(); String latestComment = latest[0].getComment(); - if (!originalCategory.equals(latestCategory) || - !originalComment.equals(latestComment)) { + if (!SystemUtilities.isEqual(originalCategory, latestCategory) || + !SystemUtilities.isEqual(originalComment, latestComment)) { // MY deleted and LATEST changed, so conflict. addConflict(addr, originalType, null); } @@ -182,8 +183,8 @@ class BookmarkMerger extends AbstractListingMerger { else if (my.length == 1) { String myCategory = my[0].getCategory(); String myComment = my[0].getComment(); - if (!originalCategory.equals(myCategory) || - !originalComment.equals(myComment)) { + if (!SystemUtilities.isEqual(originalCategory, myCategory) || + !SystemUtilities.isEqual(originalComment, myComment)) { // Changed in MY if (latest.length == 0) { // MY changed and LATEST deleted, so conflict. @@ -192,8 +193,10 @@ class BookmarkMerger extends AbstractListingMerger { else if (latest.length == 1) { String latestCategory = latest[0].getCategory(); String latestComment = latest[0].getComment(); - if ((!originalCategory.equals(latestCategory) || !originalComment.equals(latestComment)) && - (!myCategory.equals(latestCategory) || !myComment.equals(latestComment))) { + if ((!SystemUtilities.isEqual(originalCategory, latestCategory) || + !SystemUtilities.isEqual(originalComment, latestComment)) && + (!SystemUtilities.isEqual(myCategory, latestCategory) || + !SystemUtilities.isEqual(myComment, latestComment))) { // MY changed and LATEST changed differently addConflict(addr, originalType, null); } @@ -220,7 +223,7 @@ class BookmarkMerger extends AbstractListingMerger { // Deleted in MY if (latest != null) { String latestComment = latest.getComment(); - if (!originalComment.equals(latestComment)) { + if (!SystemUtilities.isEqual(originalComment, latestComment)) { // MY deleted and LATEST changed, so conflict. addConflict(addr, originalType, originalCategory); } @@ -232,7 +235,7 @@ class BookmarkMerger extends AbstractListingMerger { } else { String myComment = my.getComment(); - if (!originalComment.equals(myComment)) { + if (!SystemUtilities.isEqual(originalComment, myComment)) { // Changed in MY if (latest == null) { // MY changed and LATEST deleted, so conflict. @@ -240,8 +243,8 @@ class BookmarkMerger extends AbstractListingMerger { } else { String latestComment = latest.getComment(); - if (!originalComment.equals(latestComment) && - !myComment.equals(latestComment)) { + if (!SystemUtilities.isEqual(originalComment, latestComment) && + !SystemUtilities.isEqual(myComment, latestComment)) { // MY changed and LATEST changed differently addConflict(addr, originalType, originalCategory); } @@ -291,8 +294,8 @@ class BookmarkMerger extends AbstractListingMerger { else if (latest.length == 1) { String latestCategory = latest[0].getCategory(); String latestComment = latest[0].getComment(); - if (!myCategory.equals(latestCategory) || - !myComment.equals(latestComment)) { + if (!SystemUtilities.isEqual(myCategory, latestCategory) || + !SystemUtilities.isEqual(myComment, latestComment)) { // MY & LATEST added different NOTEs, so conflict. addConflict(addr, myType, null); } @@ -316,7 +319,7 @@ class BookmarkMerger extends AbstractListingMerger { } else { String latestComment = latest.getComment(); - if (!myComment.equals(latestComment)) { + if (!SystemUtilities.isEqual(myComment, latestComment)) { // MY & LATEST added same bookmark w/ different comments, so conflict. addConflict(addr, myType, myCategory); } diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/bookmark/BookmarkDB.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/bookmark/BookmarkDB.java index b31726a805..61f779b54b 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/bookmark/BookmarkDB.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/bookmark/BookmarkDB.java @@ -76,7 +76,8 @@ public class BookmarkDB extends DatabaseObject implements Bookmark { @Override public String getCategory() { - return record.getString(BookmarkDBAdapter.CATEGORY_COL); + String category = record.getString(BookmarkDBAdapter.CATEGORY_COL); + return category != null ? category : ""; // NOTE: Old data may have stored null } public void setComment(String comment) { @@ -92,7 +93,8 @@ public class BookmarkDB extends DatabaseObject implements Bookmark { @Override public String getComment() { - return record.getString(BookmarkDBAdapter.COMMENT_COL); + String comment = record.getString(BookmarkDBAdapter.COMMENT_COL); + return comment != null ? comment : ""; // NOTE: Old data may have stored null } @Override diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/bookmark/BookmarkDBAdapterV3.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/bookmark/BookmarkDBAdapterV3.java index b2de91bb4e..4104e58b6e 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/bookmark/BookmarkDBAdapterV3.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/bookmark/BookmarkDBAdapterV3.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. @@ -206,6 +206,11 @@ public class BookmarkDBAdapterV3 extends BookmarkDBAdapter { return null; } + if (category == null) + category = ""; + if (comment == null) + comment = ""; + Table table = tables[typeID]; long nextId = table.getKey() + 1; long id = ((long) typeID << TYPE_ID_OFFSET) | nextId;