Skip to content

Commit

Permalink
objectserver: Improve how kind/id strings are handled
Browse files Browse the repository at this point in the history
Since it can return null, ensure calls emit an error if it's the case for consistency
  • Loading branch information
dd86k committed Jan 21, 2025
1 parent 4bc7b39 commit b117217
Show file tree
Hide file tree
Showing 6 changed files with 84 additions and 34 deletions.
12 changes: 4 additions & 8 deletions src/adbg/objects/lx.d
Original file line number Diff line number Diff line change
Expand Up @@ -440,14 +440,10 @@ AdbgMachine adbg_object_lx_machine(adbg_object_t *o) {
}

const(char)* adbg_object_lx_kind_string(adbg_object_t *o) {
if (o == null) {
adbg_oops(AdbgError.invalidArgument);
return null;
}
if (o.internal == null) {
adbg_oops(AdbgError.uninitiated);
return null;
}
if (o == null)
return adbg_oops_null(AdbgError.invalidArgument);
if (o.internal == null)
return adbg_oops_null(AdbgError.uninitiated);
lx_header_t* header = cast(lx_header_t*)o.internal;
return adbg_object_lx_modtype_string(header.mflags);
}
Expand Down
14 changes: 5 additions & 9 deletions src/adbg/objects/macho.d
Original file line number Diff line number Diff line change
Expand Up @@ -1023,7 +1023,7 @@ const(char) *adbg_object_macho_filetype_string(uint type) {
case MACHO_FILETYPE_DYLIB_STUB: return "Dynamic library stub";
case MACHO_FILETYPE_DSYM: return "Companion file (debug)";
case MACHO_FILETYPE_KEXT_BUNDLE: return "Kext bundle";
default: return null;
default: return adbg_oops_null(AdbgError.objectInvalidType);
}
}

Expand Down Expand Up @@ -1271,14 +1271,10 @@ const(char)* adbg_object_macho_command_string(uint command) {
}

const(char)* adbg_object_macho_kind_string(adbg_object_t *o) {
if (o == null) {
adbg_oops(AdbgError.invalidArgument);
return null;
}
if (o.internal == null) {
adbg_oops(AdbgError.uninitiated);
return null;
}
if (o == null)
return adbg_oops_null(AdbgError.invalidArgument);
if (o.internal == null)
return adbg_oops_null(AdbgError.uninitiated);

internal_macho_t *internal = cast(internal_macho_t*)o.internal;
if (o.status & MACHO_IS_FAT) return `Fat Executable`;
Expand Down
2 changes: 1 addition & 1 deletion src/adbg/objects/mz.d
Original file line number Diff line number Diff line change
Expand Up @@ -196,6 +196,6 @@ mz_reloc_t* adbg_object_mz_reloc(adbg_object_t *o, size_t index) {

const(char)* adbg_object_mz_kind_string(adbg_object_t *o) {
if (o == null || o.internal == null)
return null;
return adbg_oops_null(AdbgError.invalidArgument);
return (cast(mz_header_t*)o.internal).e_ovno ? `Overlayed Executable` : `Executable`;
}
2 changes: 1 addition & 1 deletion src/adbg/objects/ne.d
Original file line number Diff line number Diff line change
Expand Up @@ -420,7 +420,7 @@ AdbgMachine adbg_object_ne_machine(adbg_object_t *o) {

const(char)* adbg_object_ne_kind_string(adbg_object_t *o) {
if (o == null || o.internal == null)
return null;
return adbg_oops_null(AdbgError.invalidArgument);
ne_header_t* header = cast(ne_header_t*)o.internal;
return header.ne_flags & NE_HFLAG_LIBMODULE ? `Library Module` : `Executable`;
}
Expand Down
4 changes: 2 additions & 2 deletions src/adbg/objects/pe.d
Original file line number Diff line number Diff line change
Expand Up @@ -2589,8 +2589,8 @@ const(char)* adbg_object_pe_debug_type_string(uint type) {
}

const(char)* adbg_object_pe_kind_string(adbg_object_t *o) {
if (o == null) return null;
if (o.internal == null) return null;
if (o == null || o.internal == null)
return adbg_oops_null(AdbgError.invalidArgument);
internal_pe_t *internal = cast(internal_pe_t*)o.internal;
return internal.header.Characteristics & PE_CHARACTERISTIC_DLL ?
`Dynamically Linked Library` : `Executable`;
Expand Down
84 changes: 71 additions & 13 deletions src/adbg/objectserver.d
Original file line number Diff line number Diff line change
Expand Up @@ -745,7 +745,13 @@ long adbg_object_filesize(adbg_object_t *o) {
}
return osfsize(o.file);
case AdbgObjectOrigin.userbuffer:
return cast(long)o.user_buffersize; // size_t -> long is ehh..
// Verify overflow, size_t -> can lead to overflow due to sign
long l = cast(long)o.user_buffersize;
if ( l < 0 ) {
adbg_oops(AdbgError.assertion);
return -1;
}
return l;
default:
adbg_oops(AdbgError.unimplemented);
return -1;
Expand All @@ -754,7 +760,7 @@ long adbg_object_filesize(adbg_object_t *o) {

/// Returns the first machine type the object supports.
/// Params: o = Object instance.
/// Returns: Machine value.
/// Returns: Machine value. `AdbgMachine.unknown` on error.
AdbgMachine adbg_object_machine(adbg_object_t *o) {
if (o == null)
return AdbgMachine.unknown;
Expand All @@ -774,6 +780,10 @@ AdbgMachine adbg_object_machine(adbg_object_t *o) {
}
return AdbgMachine.unknown;
}

/// Get the (first) machine specified in the object as a string.
/// Params: o = Object instance.
/// Returns: String pointer or null on error.
const(char)* adbg_object_machine_string(adbg_object_t *o) {
return adbg_machine_name( adbg_object_machine(o) );
}
Expand All @@ -785,18 +795,34 @@ AdbgObject adbg_object_format(adbg_object_t *o) {
return o ? o.format : AdbgObject.unknown;
}

/// Get the short name of the loaded object type.
/// Get a short identifying string ID for the object format.
///
/// Values:
/// - "mz"
/// - "ne"
/// - "lx"
/// - "pe"
/// - "macho"
/// - "elf"
/// - "pdb"
/// - "mdmp"
/// - "dmp"
/// - "omf"
/// - "archive"
/// - "coff"
/// - "mscoff"
/// - "unknown" (default or parameter is null)
/// Params: o = Object instance.
/// Returns: Object type name.
/// Returns: String pointer. It does not return null.
export
const(char)* adbg_object_format_shortname(adbg_object_t *o) {
const(char)* adbg_object_id_string(adbg_object_t *o) {
if (o == null)
goto Lunknown;
final switch (o.format) with (AdbgObject) {
case mz: return "mz";
case ne: return "ne";
case lx: return adbg_object_lx_header_shortname(o);
case pe: return "pe32";
case lx: return "lx";
case pe: return "pe";
case macho: return "macho";
case elf: return "elf";
case pdb: return "pdb";
Expand All @@ -810,14 +836,35 @@ Lunknown:
case unknown: return "unknown";
}
}
// Old alias
alias adbg_object_format_shortname = adbg_object_id_string;

// TODO: adbg_object_id_full: "fuller" id

/// Get the full name of the loaded object type.
///
/// Values:
/// - "Mark Zbikowski"
/// - "New Executable"
/// - "Linked Executable"
/// - "Portable Executable"
/// - "Mach-O"
/// - "Executable and Linkable Format"
/// - "Program Database"
/// - "Windows Minidump"
/// - "Windows Memory Dump"
/// - "Relocatable Object Module Format"
/// - "UNIX Library Archive"
/// - "Common Object File Format"
/// - "Big COFF Object"
/// - "Unknown" (default or parameter is null)
/// Params: o = Object instance.
/// Returns: Object type name.
export
const(char)* adbg_object_format_name(adbg_object_t *o) {
const(char)* adbg_object_format_string(adbg_object_t *o) {
if (o == null)
Lunknown: return "Unknown";
Lunknown: return "Unknown";

final switch (o.format) with (AdbgObject) {
case mz: return `Mark Zbikowski`;
case ne: return `New Executable`;
Expand All @@ -831,15 +878,22 @@ const(char)* adbg_object_format_name(adbg_object_t *o) {
case omf: return `Relocatable Object Module Format`;
case archive: return `UNIX Library Archive`;
case coff: return `Common Object File Format`;
case mscoff: return `Anonymous COFF`;
case mscoff: return `Big COFF Object`;
case unknown: goto Lunknown;
}
}
// Old alias
alias adbg_object_format_name = adbg_object_format_string;

// Printing purposes only
/// Get the kind of object as a string for printing purposes.
///
/// Examples include "Memory Dump", "Object", "Library" (static), etc.
/// Params: o = Object instance.
/// Returns: String pointer or null on error.
const(char)* adbg_object_kind_string(adbg_object_t *o) {
if (o == null)
Lunknown: return "Unknown";
return adbg_oops_null(AdbgError.invalidArgument);

final switch (o.format) with (AdbgObject) {
case mz: return adbg_object_mz_kind_string(o);
case ne: return adbg_object_ne_kind_string(o);
Expand All @@ -852,10 +906,14 @@ const(char)* adbg_object_kind_string(adbg_object_t *o) {
case archive, mscoff: return `Library`;
case omf: return adbg_object_omf_is_library(o) ? `Library` : `Object`;
case coff: return `Object`;
case unknown: goto Lunknown;
case unknown:
return adbg_oops_null(AdbgError.objectUnsupportedFormat);
}
}

/// Get the ABI specified in the object.
/// Params: o = Object instance.
/// Returns: String pointer or null on error.
const(char)* adbg_object_osabi_string(adbg_object_t *o) {
if (o == null)
Lunknown: return null;
Expand Down

0 comments on commit b117217

Please sign in to comment.