Explorar o código

client: don't Done received frame before DataProtoDest_SubmitRelayFrame is done with it

ambrop7 %!s(int64=15) %!d(string=hai) anos
pai
achega
9fbf6ec4f7
Modificáronse 1 ficheiros con 6 adicións e 7 borrados
  1. 6 7
      client/client.c

+ 6 - 7
client/client.c

@@ -2208,8 +2208,12 @@ void peer_recv_handler_send (struct peer_data *peer, uint8_t *data, int data_len
     }
     
 out:
-    // accept packet
-    if (!local) {
+    // pass packet to device, or accept immediately
+    // NOTE: this must be done first, because DataProtoDest_SubmitRelayFrame needs the frame
+    // while it is evaluating!
+    if (local) {
+        PacketPassInterface_Sender_Send(peer->local_recv_if, data, data_len);
+    } else {
         PacketPassInterface_Done(&peer->recv_ppi);
     }
     
@@ -2218,11 +2222,6 @@ out:
         DataProtoDest_SubmitRelayFrame(&relay_dest->send_dp, &src_peer->relay_source, data, data_len, options.send_buffer_relay_size);
     }
     
-    // submit to device
-    if (local) {
-        PacketPassInterface_Sender_Send(peer->local_recv_if, data, data_len);
-    }
-    
     // inform DataProto of received packet
     if (dp_good) {
         DataProtoDest_Received(&peer->send_dp, !!(flags & DATAPROTO_FLAGS_RECEIVING_KEEPALIVES));