1
0
mirror of https://codeberg.org/Freeyourgadget/Gadgetbridge synced 2024-06-16 10:00:08 +02:00

Huami: Improve large firmware zip file handling

This commit is contained in:
José Rebelo 2022-09-05 23:54:08 +01:00 committed by Gitea
parent 3c882467cc
commit 9b2775458c
7 changed files with 43 additions and 7 deletions

View File

@ -246,6 +246,7 @@ public class FwAppInstallerActivity extends AbstractGBActivity implements Instal
for (DeviceCoordinator coordinator : getAllCoordinatorsConnectedFirst()) {
InstallHandler handler = coordinator.findInstallHandler(uri, this);
if (handler != null) {
LOG.info("Found install handler {} from {}", handler.getClass(), coordinator.getClass());
return handler;
}
}

View File

@ -29,6 +29,11 @@ public class AmazfitGTS3FWHelper extends HuamiFWHelper {
super(uri, context);
}
@Override
public long getMaxExpectedFileSize() {
return 1024 * 1024 * 128; // 128.0MB
}
@Override
protected void determineFirmwareInfo(final byte[] wholeFirmwareBytes) {
firmwareInfo = new AmazfitGTS3FirmwareInfo(wholeFirmwareBytes);

View File

@ -29,6 +29,11 @@ public class MiBand7FWHelper extends HuamiFWHelper {
super(uri, context);
}
@Override
public long getMaxExpectedFileSize() {
return 1024 * 1024 * 32; // 32.0MB
}
@Override
protected void determineFirmwareInfo(final byte[] wholeFirmwareBytes) {
firmwareInfo = new MiBand7FirmwareInfo(wholeFirmwareBytes);

View File

@ -53,8 +53,12 @@ public abstract class AbstractMiBandFWHelper {
throw new IOException("Firmware has a filename that looks like a Pebble app/firmware.");
}
if (uriHelper.getFileSize() > getMaxExpectedFileSize()) {
throw new IOException("Firmware size is larger than the maximum expected file size of " + getMaxExpectedFileSize());
}
try (InputStream in = new BufferedInputStream(uriHelper.openInputStream())) {
this.fw = FileUtils.readAll(in, 1024 * 1024 * 32); // 32.0 MB
this.fw = FileUtils.readAll(in, getMaxExpectedFileSize());
determineFirmwareInfo(fw);
} catch (IOException ex) {
throw ex; // pass through
@ -112,6 +116,13 @@ public abstract class AbstractMiBandFWHelper {
return false;
}
/**
* The maximum expected file size, in bytes. Files larger than this are assumed to be invalid.
*/
public long getMaxExpectedFileSize() {
return 1024 * 1024 * 16; // 16.0MB
}
protected abstract int[] getWhitelistedFirmwareVersions();
public abstract boolean isFirmwareGenerallyCompatibleWith(GBDevice device);

View File

@ -41,16 +41,20 @@ public abstract class Huami2021FirmwareInfo extends AbstractHuamiFirmwareInfo {
0x50, 0x4B, 0x03, 0x04
};
public static final byte[] FW_HEADER = new byte[]{
0x51, 0x71
};
public Huami2021FirmwareInfo(final byte[] bytes) {
super(bytes);
}
/**
* The device name, to search on firmware.bin in order to determine compatibility.
*/
public abstract String deviceName();
/**
* The expected firmware header bytes, to search on firmware.bin in order to determine compatibility.
*/
public abstract byte[] getExpectedFirmwareHeader();
@Override
protected HuamiFirmwareType determineFirmwareType(final byte[] bytes) {
if (ArrayUtils.equals(bytes, UIHHContainer.UIHH_HEADER, 0)) {
@ -137,8 +141,8 @@ public abstract class Huami2021FirmwareInfo extends AbstractHuamiFirmwareInfo {
return false;
}
if (!ArrayUtils.equals(firmwareBin, FW_HEADER, 0)) {
LOG.warn("Unexpected firmware header: {}", GB.hexdump(Arrays.copyOfRange(firmwareBin, 0, FW_HEADER.length + 1)));
if (!ArrayUtils.equals(firmwareBin, getExpectedFirmwareHeader(), 0)) {
LOG.warn("Unexpected firmware header: {}", GB.hexdump(Arrays.copyOfRange(firmwareBin, 0, getExpectedFirmwareHeader().length + 3)));
return false;
}

View File

@ -43,6 +43,11 @@ public class AmazfitGTS3FirmwareInfo extends Huami2021FirmwareInfo {
return HuamiConst.AMAZFIT_GTS3_NAME;
}
@Override
public byte[] getExpectedFirmwareHeader() {
return new byte[]{0x00, 0x00, 0x50}; // Probably bogus, only checked against 2 firmware files
}
@Override
public boolean isGenerallyCompatibleWith(final GBDevice device) {
return isHeaderValid() && device.getType() == DeviceType.AMAZFITGTS3;

View File

@ -44,6 +44,11 @@ public class MiBand7FirmwareInfo extends Huami2021FirmwareInfo {
return HuamiConst.XIAOMI_SMART_BAND7_NAME;
}
@Override
public byte[] getExpectedFirmwareHeader() {
return new byte[]{0x51, 0x71};
}
@Override
public boolean isGenerallyCompatibleWith(final GBDevice device) {
return isHeaderValid() && device.getType() == DeviceType.MIBAND7;