Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

MZloader: some MZ header shorts are now treated as unsigned #6421

Closed
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Expand Up @@ -139,7 +139,7 @@ private void markupHeaders(Program program, FileBytes fileBytes, MzExecutable mz
MessageLog log, TaskMonitor monitor) {
monitor.setMessage("Marking up headers...");
OldDOSHeader header = mz.getHeader();
int blockSize = paragraphsToBytes(header.e_cparhdr());
int blockSize = paragraphsToBytes(Short.toUnsignedInt(header.e_cparhdr()));
try {
Address headerSpaceAddr = AddressSpace.OTHER_SPACE.getAddress(0);
MemoryBlock headerBlock = MemoryBlockUtils.createInitializedBlock(program, true,
Expand All @@ -156,7 +156,7 @@ private void markupHeaders(Program program, FileBytes fileBytes, MzExecutable mz
if (!relocations.isEmpty()) {
DataType relocationType = relocations.get(0).toDataType();
int len = relocationType.getLength();
addr = addr.add(header.e_lfarlc());
addr = addr.add(Short.toUnsignedInt(header.e_lfarlc()));
for (int i = 0; i < relocations.size(); i++) {
monitor.checkCancelled();
DataUtilities.createData(program, addr.add(i * len), relocationType, -1,
Expand Down Expand Up @@ -187,7 +187,7 @@ private void processMemoryBlocks(Program program, FileBytes fileBytes,
knownSegments.add(space.getAddress((INITIAL_SEGMENT_VAL + header.e_cs()) & 0xffff, 0));
}
// Allocate an initialized memory block for each segment we know about
int endOffset = pagesToBytes(header.e_cp() - 1) + header.e_cblp();
int endOffset = pagesToBytes(Short.toUnsignedInt(header.e_cp()) - 1) + Short.toUnsignedInt(header.e_cblp());
if (endOffset > reader.length()) {
log.appendMsg(
"File is 0x%x bytes but header reports 0x%x".formatted(reader.length(), endOffset));
Expand Down Expand Up @@ -253,7 +253,7 @@ private void processMemoryBlocks(Program program, FileBytes fileBytes,

// Allocate an uninitialized memory block for extra minimum required data space
if (lastBlock != null) {
int extraAllocSize = paragraphsToBytes(header.e_minalloc());
int extraAllocSize = paragraphsToBytes(Short.toUnsignedInt(header.e_minalloc()));
if (extraAllocSize > 0) {
MemoryBlockUtils.createUninitializedBlock(program, false, "DATA",
lastBlock.getEnd().add(1), extraAllocSize, "", "mz", true, true, false, log);
Expand Down Expand Up @@ -473,7 +473,7 @@ private Set<RelocationFixup> getRelocationFixups(SegmentedAddressSpace space,
* @return The segmented addresses converted to a file offset
*/
private int addressToFileOffset(int segment, int offset, OldDOSHeader header) {
return (short) segment * 16 + offset + paragraphsToBytes(header.e_cparhdr());
return (short) segment * 16 + offset + paragraphsToBytes(Short.toUnsignedInt(header.e_cparhdr()));
}

/**
Expand Down