strace: Handle ssize_t differently than status_t.

It's 64-bit on 64-bit architectures and must be handled as such.

Fixes strace outputs seen in #16861.

Also clean up style a bit.
This commit is contained in:
Augustin Cavalier
2025-03-08 00:12:43 -05:00
parent fe70bb7f1e
commit bb6c8ca150
3 changed files with 28 additions and 10 deletions
+24 -7
View File
@@ -17,6 +17,7 @@
#include "MemoryReader.h" #include "MemoryReader.h"
#include "Syscall.h" #include "Syscall.h"
template<typename value_t> template<typename value_t>
static inline value_t static inline value_t
get_value(const void *address) get_value(const void *address)
@@ -27,25 +28,28 @@ get_value(const void *address)
return *(value_t*)address; return *(value_t*)address;
} }
// #pragma mark - // #pragma mark -
// create_pointer_type_handler
// const void *
TypeHandler * TypeHandler *
create_pointer_type_handler() create_pointer_type_handler()
{ {
return new TypeHandlerImpl<const void*>(); return new TypeHandlerImpl<const void*>();
} }
// create_string_type_handler
// const char *
TypeHandler * TypeHandler *
create_string_type_handler() create_string_type_handler()
{ {
return new TypeHandlerImpl<const char*>(); return new TypeHandlerImpl<const char*>();
} }
// #pragma mark -
// complete specializations // #pragma mark - complete specializations
// void // void
template<> template<>
@@ -55,6 +59,7 @@ TypeHandlerImpl<void>::GetParameterValue(Context &, Parameter *, const void *)
return "void"; return "void";
} }
template<> template<>
string string
TypeHandlerImpl<void>::GetReturnValue(Context &, uint64 value) TypeHandlerImpl<void>::GetReturnValue(Context &, uint64 value)
@@ -62,6 +67,7 @@ TypeHandlerImpl<void>::GetReturnValue(Context &, uint64 value)
return ""; return "";
} }
template<> template<>
TypeHandler * TypeHandler *
TypeHandlerFactory<void>::Create() TypeHandlerFactory<void>::Create()
@@ -69,6 +75,7 @@ TypeHandlerFactory<void>::Create()
return new TypeHandlerImpl<void>(); return new TypeHandlerImpl<void>();
} }
// bool // bool
template<> template<>
string string
@@ -92,14 +99,16 @@ TypeHandlerFactory<bool>::Create()
return new TypeHandlerImpl<bool>(); return new TypeHandlerImpl<bool>();
} }
// status_t // status_t
template<typename T>
class StatusTypeHandler : public TypeHandler { class StatusTypeHandler : public TypeHandler {
public: public:
StatusTypeHandler() {} StatusTypeHandler() {}
string GetParameterValue(Context &context, Parameter *, const void *address) string GetParameterValue(Context &context, Parameter *, const void *address)
{ {
return RenderValue(context, get_value<status_t>(address)); return RenderValue(context, get_value<T>(address));
} }
string GetReturnValue(Context &context, uint64 value) string GetReturnValue(Context &context, uint64 value)
@@ -111,7 +120,7 @@ private:
string RenderValue(Context &context, uint64 value) const string RenderValue(Context &context, uint64 value) const
{ {
string rendered = context.FormatUnsigned(value); string rendered = context.FormatUnsigned(value);
if (value <= UINT32_MAX && (status_t)value <= 0) { if (value <= UINT32_MAX && (T)value <= 0) {
rendered += " "; rendered += " ";
rendered += strerror(value); rendered += strerror(value);
} }
@@ -122,7 +131,13 @@ private:
TypeHandler * TypeHandler *
create_status_t_type_handler() create_status_t_type_handler()
{ {
return new StatusTypeHandler; return new StatusTypeHandler<status_t>;
}
TypeHandler *
create_ssize_t_type_handler()
{
return new StatusTypeHandler<ssize_t>;
} }
@@ -179,8 +194,10 @@ TypeHandlerImpl<const char*>::GetReturnValue(Context &context, uint64 value)
return read_string(context, (void *)value); return read_string(context, (void *)value);
} }
// #pragma mark - enums, flags, enum_flags // #pragma mark - enums, flags, enum_flags
EnumTypeHandler::EnumTypeHandler(const EnumMap &m) : fMap(m) {} EnumTypeHandler::EnumTypeHandler(const EnumMap &m) : fMap(m) {}
string string
+1
View File
@@ -108,6 +108,7 @@ struct TypeHandlerFactory {
extern TypeHandler *create_pointer_type_handler(); extern TypeHandler *create_pointer_type_handler();
extern TypeHandler *create_string_type_handler(); extern TypeHandler *create_string_type_handler();
extern TypeHandler *create_status_t_type_handler(); extern TypeHandler *create_status_t_type_handler();
extern TypeHandler *create_ssize_t_type_handler();
// specialization for "const char*" // specialization for "const char*"
template<> template<>
+3 -3
View File
@@ -243,10 +243,10 @@ patch_syscalls()
// patch return type handlers // patch return type handlers
const string returnTypeName = syscall->ReturnType()->TypeName(); const string returnTypeName = syscall->ReturnType()->TypeName();
if (returnTypeName == "status_t" || returnTypeName == "ssize_t" if (returnTypeName == "status_t" || returnTypeName == "int")
|| returnTypeName == "int") {
syscall->ReturnType()->SetHandler(create_status_t_type_handler()); syscall->ReturnType()->SetHandler(create_status_t_type_handler());
} else if (returnTypeName == "ssize_t")
syscall->ReturnType()->SetHandler(create_ssize_t_type_handler());
} }
patch_area(); patch_area();