diff --git a/fastboot/fastboot_driver.cpp b/fastboot/fastboot_driver.cpp index aabc620d4..55ca65d3f 100644 --- a/fastboot/fastboot_driver.cpp +++ b/fastboot/fastboot_driver.cpp @@ -134,7 +134,7 @@ RetCode FastBootDriver::Partitions(std::vector return ret; } - std::regex reg("partition-size[[:s:]]*:[[:s:]]*([[:w:]]+)[[:s:]]*:[[:s:]]*0x([[:d:]]+)"); + std::regex reg("partition-size[[:s:]]*:[[:s:]]*([[:w:]]+)[[:s:]]*:[[:s:]]*0x([[:xdigit:]]+)"); std::smatch sm; for (auto& s : all) { @@ -264,11 +264,16 @@ RetCode FastBootDriver::Upload(const std::string& outfile, std::string* response std::vector* info) { RetCode ret; int dsize; - if ((ret = RawCommand(Commands::UPLOAD, response, info, &dsize)) || dsize == 0) { - error_ = "Upload request failed"; + if ((ret = RawCommand(Commands::UPLOAD, response, info, &dsize))) { + error_ = "Upload request failed: " + error_; return ret; } + if (!dsize) { + error_ = "Upload request failed, device reports 0 bytes available"; + return BAD_DEV_RESP; + } + std::vector data; data.resize(dsize); @@ -462,10 +467,10 @@ RetCode FastBootDriver::SendBuffer(const std::vector& buf) { } RetCode FastBootDriver::SendBuffer(const void* buf, size_t size) { + // ioctl on 0-length buffer causes freezing if (!size) { - return SUCCESS; + return BAD_ARG; } - // Write the buffer ssize_t tmp = transport->Write(buf, size); @@ -521,7 +526,7 @@ int FastBootDriver::SparseWriteCallback(std::vector& tpbuf, const char* da // Now we need to send a multiple of chunk size size_t nchunks = (len - total) / TRANSPORT_CHUNK_SIZE; size_t nbytes = TRANSPORT_CHUNK_SIZE * nchunks; - if (SendBuffer(data + total, nbytes)) { + if (nbytes && SendBuffer(data + total, nbytes)) { // Don't send a ZLP error_ = ErrnoStr("Send failed in SparseWriteCallback()"); return -1; } diff --git a/fastboot/fastboot_driver.h b/fastboot/fastboot_driver.h index 9fdd31700..e8711cba2 100644 --- a/fastboot/fastboot_driver.h +++ b/fastboot/fastboot_driver.h @@ -103,7 +103,7 @@ class FastBootDriver { /* HELPERS */ void SetInfoCallback(std::function info); - const std::string RCString(RetCode rc); + static const std::string RCString(RetCode rc); std::string Error(); RetCode WaitForDisconnect();