Timmmm wrote:

Thanks for the test case! I fixed it. The issue was that `Read()` could read 
more than one packet into the internal buffer, and then `CheckForPacket()` 
would only look at the first one, then when you `Read()` again there's nothing 
to read. I changed it to use a loop.

I'm not really sure that the original code is correct anyway, with respect to 
invalid packets. If you read an invalid packet and a valid packet in the same 
`Read()` then you will have exactly the same problem - `CheckForPacket` ignores 
the invalid one, but then you loop back to `Read()` and it will never return 
because the following valid packet was already ready into the buffer. Difficult 
to fix without a bigger refactor because `CheckForPacket` doesn't distinguish 
"an invalid packet was deleted" and "incomplete packet read" so I left it and 
added a comment.

There were a few options for the code that calls 
`CheckForPacketIngoreNotifications`:

1. Minimal change:

```
  if (CheckForPacketIgnoreNotifications(nullptr, 0, packet) != 
PacketType::Invalid)
    return PacketResult::Success;
```

2. The code I've pushed with a `switch` (yeay) and `llvm_unreachable()` (boo).

```
  switch (CheckForPacketIgnoreNotifications(nullptr, 0, packet)) {
    case PacketType::Standard:
      return PacketResult::Success;
    case PacketType::Invalid:
      break;
    case PacketType::Notify:
      // These are ignored by CheckForPacketIgnoreNotifications.
      llvm_unreachable("unreachable");
  }
```

3. Add another enum type:

```
  enum class PacketType { Invalid = 0, Standard, Notify };
  enum class PacketTypeNoNotify { Invalid = 0, Standard };
...
  switch (CheckForPacketIgnoreNotifications(nullptr, 0, packet)) {
    case PacketTypeNoNotify::Standard:
      return PacketResult::Success;
    case PacketTypeNoNotify::Invalid:
      break;
  }
```

Let me know which you prefer.

Finally, I had a skim of that other PR.... It doesn't look like it resolved 
this issue.

> thank you for looking so closely at this — you're right that the receive path 
> is subtle

I'll let you decide whether you want to talk to AI or a human!

https://github.com/llvm/llvm-project/pull/204788
_______________________________________________
lldb-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to