Archiviert
13
0

Syncronize before hacking into the packet list. In addition,

copy over any unprocessed packets into the new list.

When we're done, we'll also clean up properly by copying over 
any remaining packets.
Dieser Commit ist enthalten in:
Kristian S. Stangeland 2012-09-13 16:08:41 +02:00
Ursprung 5a6f3be219
Commit 1710ef343b

Datei anzeigen

@ -214,38 +214,54 @@ class PlayerInjector {
for (Field field : list.getFields()) { for (Field field : list.getFields()) {
VolatileField overwriter = new VolatileField(field, networkManager, true); VolatileField overwriter = new VolatileField(field, networkManager, true);
overwriter.setValue(Collections.synchronizedList(new ArrayList<Packet>() { @SuppressWarnings("unchecked")
@Override List<Packet> minecraftList = (List<Packet>) overwriter.getOldValue();
public boolean add(Packet packet) {
synchronized(minecraftList) {
Packet result = null; // The list we'll be inserting
List<Packet> hackedList = new ArrayList<Packet>() {
// Check for fake packets and ignored packets @Override
if (packet instanceof FakePacket) { public boolean add(Packet packet) {
return true;
} else if (ignoredPackets.contains(packet)) { Packet result = null;
ignoredPackets.remove(packet);
} else { // Check for fake packets and ignored packets
result = handlePacketRecieved(packet); if (packet instanceof FakePacket) {
} return true;
} else if (ignoredPackets.contains(packet)) {
// A NULL packet indicate cancelling ignoredPackets.remove(packet);
try {
if (result != null) {
super.add(result);
} else { } else {
// We'll use the FakePacket marker instead of preventing the filters result = handlePacketRecieved(packet);
sendServerPacket(createNegativePacket(packet), true);
} }
// Collection.add contract // A NULL packet indicate cancelling
return true; try {
if (result != null) {
} catch (InvocationTargetException e) { super.add(result);
throw new RuntimeException("Reverting cancelled packet failed.", e.getTargetException()); } else {
// We'll use the FakePacket marker instead of preventing the filters
sendServerPacket(createNegativePacket(packet), true);
}
// Collection.add contract
return true;
} catch (InvocationTargetException e) {
throw new RuntimeException("Reverting cancelled packet failed.", e.getTargetException());
}
} }
};
// Add every previously stored packet
for (Packet packet : minecraftList) {
hackedList.add(packet);
} }
}));
// Don' keep stale packets around
minecraftList.clear();
overwriter.setValue(Collections.synchronizedList(hackedList));
}
overridenLists.add(overwriter); overridenLists.add(overwriter);
} }
} }
@ -341,10 +357,28 @@ class PlayerInjector {
} }
} }
@SuppressWarnings("unchecked")
public void cleanupAll() { public void cleanupAll() {
// Clean up // Clean up
for (VolatileField overriden : overridenLists) { for (VolatileField overriden : overridenLists) {
overriden.revertValue(); List<Packet> minecraftList = (List<Packet>) overriden.getOldValue();
List<Packet> hacketList = (List<Packet>) overriden.getValue();
if (minecraftList == hacketList) {
return;
}
// Get a lock before we modify the list
synchronized(hacketList) {
try {
// Copy over current packets
for (Packet packet : (List<Packet>) overriden.getValue()) {
minecraftList.add(packet);
}
} finally {
overriden.revertValue();
}
}
} }
overridenLists.clear(); overridenLists.clear();
} }