You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@fineract.apache.org by "Adam Saghy (Jira)" <ji...@apache.org> on 2026/10/18 17:20:00 UTC
[jira] [Assigned] (FINERACT-2709) Bulk-import chart-of-accounts download template: setNames() null-checks the wrong variable, so the Tags named-range guard is dead and a null lookup-index entry would NullPointerException
[ https://issues.apache.org/jira/browse/FINERACT-2709?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Adam Saghy reassigned FINERACT-2709:
------------------------------------
Assignee: Farooq Ayoade
> Bulk-import chart-of-accounts download template: setNames() null-checks the wrong variable, so the Tags named-range guard is dead and a null lookup-index entry would NullPointerException
> ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
>
> Key: FINERACT-2709
> URL: https://issues.apache.org/jira/browse/FINERACT-2709
> Project: Apache Fineract
> Issue Type: Bug
> Components: DataImportTool
> Reporter: Farooq Ayoade
> Assignee: Farooq Ayoade
> Priority: Minor
>
> ---Observed behavior
> In ChartOfAccountsWorkbook.setNames(), the block that builds the per-account-type Tags named range guards the wrong
> variable:
> {code:java}
> Integer[] tagValueBeginEndIndexes = accountTypeToBeginEndIndexesofAccountNames.get(i); // may return null
> if (accountTypeToBeginEndIndexesofAccountNames != null) { // guards the MAP, not the array
> setSanitized(tags, "Tags_" + accountTypesNoDuplicatesList.get(i));
> tags.setRefersToFormula(... + tagValueBeginEndIndexes[0] + ... + tagValueBeginEndIndexes[1]); // NPE if the entry is null
> }
> {code}
> accountTypeToBeginEndIndexesofAccountNames is an instance field that was already dereferenced on the line above
> (.get(i)); it is never null at this point, so the guard is always true and protects nothing. The value that can actually
> be null is tagValueBeginEndIndexes (a Map.get miss), and it is dereferenced unguarded at tagValueBeginEndIndexes[0].
> The very next block — building the AccountName named range — demonstrates the intended pattern and guards correctly:
> {code:java}
> Integer[] accountNamesBeginEndIndexes = accountTypeToBeginEndIndexesofAccountNames.get(i);
> if (accountNamesBeginEndIndexes != null) { // correct: guards the array it dereferences
> ...
> }
> {code}
>
> Expected behavior
> The Tags block guards the same variable it dereferences (tagValueBeginEndIndexes), matching the sibling AccountName
> block, so a missing lookup-index entry simply skips the Tags named range instead of risking an NPE.
> Reachability
> With well-formed GL-account data the null branch is not reached: accountTypesNoDuplicatesList and the index map are both
> derived from the same glAccounts, and setLookupTable() only skips a put (leaving a null entry) for a type whose
> account-name list is empty — which cannot happen for a type that came from an actual account. This is therefore a dead
> guard / latent NPE, not a reproducible HTTP 500. The fix is a low-risk correctness cleanup that makes the guard do what it
> already appears to do.
> Root cause
>
> Copy-paste of the AccountName block into the Tags block without switching the guarded variable from the map to the
> per-iteration array.
> Proposed fix
>
> {code:java}
> Integer[] tagValueBeginEndIndexes = accountTypeToBeginEndIndexesofAccountNames.get(i);
> if (tagValueBeginEndIndexes != null) { // was: accountTypeToBeginEndIndexesofAccountNames != null
> setSanitized(tags, "Tags_" + accountTypesNoDuplicatesList.get(i));
> tags.setRefersToFormula(... tagValueBeginEndIndexes[0] ... tagValueBeginEndIndexes[1]);
> }
> {code}
--
This message was sent by Atlassian Jira
(v8.20.10#820010)