diff options
-rw-r--r-- | host/utils/b2xx_fx3_utils.cpp | 35 |
1 files changed, 31 insertions, 4 deletions
diff --git a/host/utils/b2xx_fx3_utils.cpp b/host/utils/b2xx_fx3_utils.cpp index 36688c6c7..3664ecbbf 100644 --- a/host/utils/b2xx_fx3_utils.cpp +++ b/host/utils/b2xx_fx3_utils.cpp @@ -168,6 +168,9 @@ bool parse_record(std::string *record, boost::uint16_t &len, boost::uint16_t &ad std::istringstream(record->substr(3, 4)) >> std::hex >> addr; std::istringstream(record->substr(7, 2)) >> std::hex >> type; + if (len >2 * (record->length() - 9)) // sanity check to prevent buffer overrun + return false; + for (i = 0; i < len; i++) { std::istringstream(record->substr(9 + 2 * i, 2)) >> std::hex >> val; data[i] = (unsigned char) val; @@ -409,6 +412,9 @@ boost::int32_t fx3_load_firmware(libusb_device_handle *dev_handle, \ std::string record; file >> record; + if (!record.length() > 0) + continue; + /* Check for valid Intel HEX record. */ if (!checksum(&record) || !parse_record(&record, len, \ lower_address_bits, type, data)) { @@ -567,8 +573,20 @@ boost::int32_t main(boost::int32_t argc, char *argv[]) { return 0; } - vid = atoh(vid_str); - pid = atoh(pid_str); + try { + vid = atoh(vid_str); + } catch (std::exception const& e) { + std::cerr << std::flush << "Exception while parsing vid: " + << e.what() << std::endl; + return ~0; + } + try { + pid = atoh(pid_str); + } catch (std::exception const& e) { + std::cerr << std::flush << "Exception while parsing pid: " + << e.what() << std::endl; + return ~0; + } /* Pointer to pointer of device, used to retrieve a list of devices. */ libusb_device **devs; @@ -714,7 +732,14 @@ boost::int32_t main(boost::int32_t argc, char *argv[]) { << std::endl; } else if (vm.count("load-fpga")) { - error_code = (libusb_error) load_fpga(dev_handle, fpga_file); + try { + error_code = (libusb_error) load_fpga(dev_handle, fpga_file); + } catch (std::exception const& e) { + std::cerr << std::flush << "Exception while loading FPGA: " + << e.what() << std::endl; + if (error_code == 0) + error_code = LIBUSB_ERROR_OTHER; + } if(error_code != 0) { std::cerr << std::flush << "Error loading FPGA. Error code: " @@ -729,7 +754,9 @@ boost::int32_t main(boost::int32_t argc, char *argv[]) { << std::endl; } else { - std::cout << boost::format("B2xx Utilitiy Program %s") % desc << std::endl; + try { + std::cout << boost::format("B2xx Utilitiy Program %s") % desc << std::endl; + } catch (std::exception const& e) {} libusb_release_interface(dev_handle, 0); libusb_close(dev_handle); libusb_exit(ctx); |