Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit fc0f80ae authored by Josh Gao's avatar Josh Gao
Browse files

adb: turn CHECKs into an error + transport restart.

These CHECKs are expected to happen if the client does the wrong thing,
so we probably shouldn't be aborting in adbd.

Bug: http://b/133872605
Bug: http://b/134695864
Test: treehugger
Change-Id: I875b87a06ba9d399db26f8af1ad47ccf34e9445a
parent 2184ecb8
Loading
Loading
Loading
Loading
+20 −7
Original line number Diff line number Diff line
@@ -509,14 +509,16 @@ struct UsbFfsConnection : public Connection {
            }

            if (id.direction == TransferDirection::READ) {
                HandleRead(id, event.res);
                if (!HandleRead(id, event.res)) {
                    return;
                }
            } else {
                HandleWrite(id);
            }
        }
    }

    void HandleRead(TransferId id, int64_t size) {
    bool HandleRead(TransferId id, int64_t size) {
        uint64_t read_idx = id.id % kUsbReadQueueDepth;
        IoBlock* block = &read_requests_[read_idx];
        block->pending = false;
@@ -526,7 +528,7 @@ struct UsbFfsConnection : public Connection {
        if (block->id().id != needed_read_id_) {
            LOG(VERBOSE) << "read " << block->id().id << " completed while waiting for "
                         << needed_read_id_;
            return;
            return true;
        }

        for (uint64_t id = needed_read_id_;; ++id) {
@@ -535,15 +537,22 @@ struct UsbFfsConnection : public Connection {
            if (current_block->pending) {
                break;
            }
            ProcessRead(current_block);
            if (!ProcessRead(current_block)) {
                return false;
            }
            ++needed_read_id_;
        }

        return true;
    }

    void ProcessRead(IoBlock* block) {
    bool ProcessRead(IoBlock* block) {
        if (!block->payload->empty()) {
            if (!incoming_header_.has_value()) {
                CHECK_EQ(sizeof(amessage), block->payload->size());
                if (block->payload->size() != sizeof(amessage)) {
                    HandleError("received packet of unexpected length while reading header");
                    return false;
                }
                amessage msg;
                memcpy(&msg, block->payload->data(), sizeof(amessage));
                LOG(DEBUG) << "USB read:" << dump_header(&msg);
@@ -551,7 +560,10 @@ struct UsbFfsConnection : public Connection {
            } else {
                size_t bytes_left = incoming_header_->data_length - incoming_payload_.size();
                Block payload = std::move(*block->payload);
                CHECK_LE(payload.size(), bytes_left);
                if (block->payload->size() > bytes_left) {
                    HandleError("received too many bytes while waiting for payload");
                    return false;
                }
                incoming_payload_.append(std::make_unique<Block>(std::move(payload)));
            }

@@ -570,6 +582,7 @@ struct UsbFfsConnection : public Connection {

        PrepareReadBlock(block, block->id().id + kUsbReadQueueDepth);
        SubmitRead(block);
        return true;
    }

    bool SubmitRead(IoBlock* block) {