From 9d6de521f2372a927ebfc813bc6d1a1c9f6c761d Mon Sep 17 00:00:00 2001 From: Carlos Ruiz Date: Fri, 11 Dec 2020 09:48:16 +0100 Subject: [PATCH] IDEMPIERE-4268 Web Services : Read miss cross-tenant check (#456) Extracting from @hengsin pull request 453 --- .../src/org/compiere/model/MUserDefWin.java | 19 +++++++++++-------- .../src/org/compiere/model/PO.java | 8 ++++---- 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/org.adempiere.base/src/org/compiere/model/MUserDefWin.java b/org.adempiere.base/src/org/compiere/model/MUserDefWin.java index d6d6bf149e..e24f3295d7 100644 --- a/org.adempiere.base/src/org/compiere/model/MUserDefWin.java +++ b/org.adempiere.base/src/org/compiere/model/MUserDefWin.java @@ -36,6 +36,7 @@ public class MUserDefWin extends X_AD_UserDef_Win implements ImmutablePOSupport */ private static final long serialVersionUID = -7542708120229671875L; private volatile static List m_fullList = null; + private static final Object m_fullListLock = new Object(); /** * Standard constructor. @@ -103,14 +104,16 @@ public class MUserDefWin extends X_AD_UserDef_Win implements ImmutablePOSupport */ private static MUserDefWin[] getAll (Properties ctx, int window_ID ) { - if (m_fullList == null) { - try { - PO.setCrossTenantSafe(); - m_fullList = new Query(ctx, MUserDefWin.Table_Name, null, null) - .setOnlyActiveRecords(true) - .list(); - } finally { - PO.clearCrossTenantSafe(); + synchronized (m_fullListLock) { + if (m_fullList == null) { + try { + PO.setCrossTenantSafe(); + m_fullList = new Query(ctx, MUserDefWin.Table_Name, null, null) + .setOnlyActiveRecords(true) + .list(); + } finally { + PO.clearCrossTenantSafe(); + } } } diff --git a/org.adempiere.base/src/org/compiere/model/PO.java b/org.adempiere.base/src/org/compiere/model/PO.java index 0505cfcc9c..665e8c06b1 100644 --- a/org.adempiere.base/src/org/compiere/model/PO.java +++ b/org.adempiere.base/src/org/compiere/model/PO.java @@ -209,7 +209,7 @@ public abstract class PO else load(ID, trxName); - checkValidClient(false); + checkCrossTenant(false); } // PO /** @@ -2082,7 +2082,7 @@ public abstract class PO checkImmutable(); checkValidContext(); - checkValidClient(true); + checkCrossTenant(true); CLogger.resetLast(); boolean newRecord = is_new(); // save locally as load resets if (!newRecord && !is_Changed()) @@ -3270,7 +3270,7 @@ public abstract class PO checkImmutable(); checkValidContext(); - checkValidClient(true); + checkCrossTenant(true); CLogger.resetLast(); if (is_new()) return true; @@ -5002,7 +5002,7 @@ public abstract class PO isSafeCrossTenant.set(Boolean.FALSE); } - private void checkValidClient(boolean writing) { + private void checkCrossTenant(boolean writing) { if (isSafeCrossTenant.get()) return; int envClientID = Env.getAD_Client_ID(getCtx());