Files
codeql/java/ql/test/query-tests/security/CWE-833/semmle/tests/SynchronizedStmtLockOrder.java

34 lines
892 B
Java

class SynchronizedStmtLockOrder {
private int primaryAccountBalance;
private Object primaryLock = new Object();
private int savingsAccountBalance;
private Object savingsLock = new Object();
public boolean transferToSavings(int amount) {
synchronized(primaryLock) { // $ Alert
synchronized(savingsLock) {
if (amount>0 && primaryAccountBalance>=amount) {
primaryAccountBalance -= amount;
savingsAccountBalance += amount;
return true;
}
}
}
return false;
}
public boolean transferToPrimary(int amount) {
// AVOID: lock order is different from "transferToSavings"
// and may result in deadlock
synchronized(savingsLock) { // $ Alert
synchronized(primaryLock) {
if (amount>0 && savingsAccountBalance>=amount) {
savingsAccountBalance -= amount;
primaryAccountBalance += amount;
return true;
}
}
}
return false;
}
}