Skip to content

Commit 1c4933f

Browse files
author
SBALAVIGNESH123
committed
Fix: Sync race condition in activeConnections access
1 parent fcba2eb commit 1c4933f

1 file changed

Lines changed: 22 additions & 8 deletions

File tree

play-services-wearable/core/src/main/java/org/microg/gms/wearable/WearableImpl.java

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -273,33 +273,47 @@ void syncRecordToAll(DataItemRecord record) {
273273
}
274274

275275
private boolean syncRecordToPeer(String nodeId, DataItemRecord record) {
276+
WearableConnection connection;
277+
synchronized (activeConnections) {
278+
connection = activeConnections.get(nodeId);
279+
}
280+
if (connection == null) return false;
281+
276282
for (Asset asset : record.dataItem.getAssets().values()) {
277283
try {
278-
syncAssetToPeer(nodeId, record, asset);
284+
syncAssetToPeer(connection, record, asset);
279285
} catch (Exception e) {
280286
Log.w(TAG, "Could not sync asset " + asset + " for " + nodeId + " and " + record, e);
281-
closeConnection(nodeId);
287+
try {
288+
connection.close();
289+
} catch (IOException ioException) {
290+
// Ignore
291+
}
282292
return false;
283293
}
284294
}
285295

286296
try {
287297
SetDataItem item = record.toSetDataItem();
288-
activeConnections.get(nodeId).writeMessage(new RootMessage.Builder().setDataItem(item).build());
298+
connection.writeMessage(new RootMessage.Builder().setDataItem(item).build());
289299
} catch (Exception e) {
290300
Log.w(TAG, e);
291-
closeConnection(nodeId);
301+
try {
302+
connection.close();
303+
} catch (IOException ioException) {
304+
// Ignore
305+
}
292306
return false;
293307
}
294308
return true;
295309
}
296310

297-
private void syncAssetToPeer(String nodeId, DataItemRecord record, Asset asset) throws IOException {
311+
private void syncAssetToPeer(WearableConnection connection, DataItemRecord record, Asset asset) throws IOException {
298312
RootMessage announceMessage = new RootMessage.Builder().setAsset(new SetAsset.Builder()
299313
.digest(asset.getDigest())
300314
.appkeys(new AppKeys(Collections.singletonList(new AppKey(record.packageName, record.signatureDigest))))
301315
.build()).hasAsset(true).build();
302-
activeConnections.get(nodeId).writeMessage(announceMessage);
316+
connection.writeMessage(announceMessage);
303317
File assetFile = createAssetFile(asset.getDigest());
304318
String fileName = calculateDigest(announceMessage.encode());
305319
FileInputStream fis = new FileInputStream(assetFile);
@@ -308,11 +322,11 @@ private void syncAssetToPeer(String nodeId, DataItemRecord record, Asset asset)
308322
int c = 0;
309323
while ((c = fis.read(arr)) > 0) {
310324
if (lastPiece != null) {
311-
activeConnections.get(nodeId).writeMessage(new RootMessage.Builder().filePiece(new FilePiece(fileName, false, lastPiece, null)).build());
325+
connection.writeMessage(new RootMessage.Builder().filePiece(new FilePiece(fileName, false, lastPiece, null)).build());
312326
}
313327
lastPiece = ByteString.of(arr, 0, c);
314328
}
315-
activeConnections.get(nodeId).writeMessage(new RootMessage.Builder().filePiece(new FilePiece(fileName, true, lastPiece, asset.getDigest())).build());
329+
connection.writeMessage(new RootMessage.Builder().filePiece(new FilePiece(fileName, true, lastPiece, asset.getDigest())).build());
316330
}
317331

318332
public void addAssetToDatabase(Asset asset, List<AppKey> appKeys) {

0 commit comments

Comments
 (0)