Files
codeql/java/ql/test/query-tests/security/CWE-833/semmle/tests/MethodAccessLockOrder.java
2021-02-09 09:16:57 -05:00

36 lines
770 B
Java

class MethodAccessLockOrder {
private Account primary = new Account();
private Account savings = new Account();
class Account {
private int balance;
public synchronized boolean transferFrom(Account malo, int amount) {
int subtracted = malo.subtract(amount);
if (subtracted == amount) {
balance += subtracted;
return true;
}
return false;
}
public synchronized int subtract(int amount) {
if (amount>0 && balance>amount) {
balance -= amount;
return amount;
}
return 0;
}
}
public boolean initiateTransfer(boolean fromSavings, int amount) {
// AVOID: inconsistent lock order
if (fromSavings) {
return primary.transferFrom(savings, amount);
} else {
return savings.transferFrom(primary, amount);
}
}
}