v1.2.3: reduce ucred elevation churn around debug events

- dispatch_debug_events: drop the function-wide elev_save_and_set
  wrapping; macro DDE_RETURN simplified to return (v).
- debug_attach_handle: release elevation before wait4 + resume_app,
  re-acquire only for PT_CONTINUE.
- debug_full_teardown / debug_set_watchpoint_handle: use new
  resume_app_unelev helper so the libk LNC notification fires
  outside the elevated cred window.
- common/include/version.h: single source of truth for the
  brand/version strings used in meta.c (handle_branding) and
  main.c (loaded_msg).
This commit is contained in:
OpenSourcereR-dev committed 2026-05-16 00:40:27 +07:00
1 parent a8b6234de4
commit e299571f94
6 files changed
+33 -18

No files matched your search

+2 -2
View File
@@ -14,7 +14,7 @@ file:line citations. Nothing is summarized from external documentation.
| Symbol | Value | Source |
|---------------------|--------------------------------------|----------------------------|
| `PACKET_VERSION` | `"1.3"` | protocol.h:11 |
| `PACKET_BRANDING` | `"ps5debug-NG by OSR v1.2.2"` | meta.c (`handle_branding`) |
| `PACKET_BRANDING` | `"ps5debug-NG by OSR v1.2.3"` | meta.c (`handle_branding`) |
| `PACKET_MAGIC` | `0xFFAABBCC` | protocol.h:13 |
| `BROADCAST_MAGIC` | `0xFFFFAAAA` | server.h:19 |
@@ -830,7 +830,7 @@ Documented here so a developer doesn't mistake them for bugs:
---
*This document reflects the `ps5debug-NG v1.2.2` payload (see
*This document reflects the `ps5debug-NG v1.2.3` payload (see
`debugger/source/meta.c:27`). Citations elsewhere may point at line numbers
that drift as the source evolves - when in doubt, the source under
`common/include/protocol.h`, `debugger/source/`, and `installer/source/` is
+1 -1
View File
@@ -266,7 +266,7 @@ elfldr from etaHEN-class loaders).
You should see a system notification confirming the payload is alive:
```
ps5debug-NG by OSR v1.2.2 loaded!
ps5debug-NG by OSR v1.2.3 loaded!
Coded by OpenSourcereR
Special thanks to
golden, Ctn & SiSTRo! ♥
+6
View File
@@ -0,0 +1,6 @@
// SPDX-License-Identifier: GPL-3.0-only
#pragma once
#define PS5DEBUG_NG_VERSION_STR "1.2.3"
#define PS5DEBUG_NG_BRAND_STR "ps5debug-NG by OSR v" PS5DEBUG_NG_VERSION_STR
+20 -13
View File
@@ -51,6 +51,13 @@ static int resume_app_via_self_id(int pid) {
return sceApplicationContinue(app_id);
}
static inline void resume_app_unelev(struct elev_state *es, int pid) {
int was_valid = es->valid;
if (was_valid) elev_restore(es);
resume_app_via_self_id(pid);
if (was_valid) (void)elev_save_and_set(es);
}
extern bool fw_uses_kernel_dbreg_path(void);
extern bool is_process_stopped(int pid);
extern bool kern_thread_step_walker(int pid);
@@ -289,12 +296,12 @@ void debug_full_teardown(void *svc) {
count = rc;
lwpids = (int *)net_alloc_buffer((unsigned long)(count * 4));
if (!lwpids) {
resume_app_via_self_id(pid);
resume_app_unelev(&es, pid);
ptrace_raw(PT_CONTINUE, pid, (void *)1, 0);
goto close_socket_and_unlock;
}
if (ptrace_raw(PT_GETLWPLIST, pid, lwpids, count) == -1) {
resume_app_via_self_id(pid);
resume_app_unelev(&es, pid);
ptrace_raw(PT_CONTINUE, pid, (void *)1, 0);
goto close_socket_and_unlock;
}
@@ -329,7 +336,7 @@ void debug_full_teardown(void *svc) {
free_and_detach:
if (lwpids) free(lwpids);
if (we_stopped) {
resume_app_via_self_id(pid);
resume_app_unelev(&es, pid);
}
ptrace_raw(PT_DETACH, pid, NULL, 0);
@@ -428,6 +435,8 @@ int debug_attach_handle(int fd, struct cmd_packet *packet) {
return 1;
}
elev_restore(&es);
int wait_status = 0;
*__error() = 0;
long wait_rc = __crt_syscall(7 , ap->pid, &wait_status, 0, 0);
@@ -436,6 +445,11 @@ int debug_attach_handle(int fd, struct cmd_packet *packet) {
}
resume_app_via_self_id(ap->pid);
if (elev_save_and_set(&es) != 0) {
net_send_int32(fd, CMD_ERROR);
return 1;
}
if (ptrace_raw(PT_CONTINUE, ap->pid, (void *)1, 0) != 0) {
elev_restore(&es);
net_send_int32(fd, CMD_ERROR);
@@ -597,7 +611,7 @@ int debug_set_watchpoint_handle(int fd, struct cmd_packet *packet) {
}
if (we_stopped) {
resume_app_via_self_id(pid);
resume_app_unelev(&es, pid);
ptrace_raw(PT_CONTINUE, pid, (void *)1, 0);
}
net_send_int32(fd, CMD_SUCCESS);
@@ -606,7 +620,7 @@ int debug_set_watchpoint_handle(int fd, struct cmd_packet *packet) {
goto wp_done;
wp_resume_and_err:
resume_app_via_self_id(pid);
resume_app_unelev(&es, pid);
ptrace_raw(PT_CONTINUE, pid, (void *)1, 0);
wp_err_no_resume:
net_send_int32(fd, CMD_ERROR);
@@ -970,11 +984,7 @@ static void debug_handle_breakpoint_resume(void) {
static uint32_t g_last_alive_check = 0;
int dispatch_debug_events(void) {
struct elev_state es;
if (elev_save_and_set(&es) != 0) return 1;
int rc = 0;
#define DDE_RETURN(v) do { rc = (v); goto dde_done; } while (0)
#define DDE_RETURN(v) return (v)
debug_handle_breakpoint_resume();
@@ -1221,10 +1231,7 @@ int dispatch_debug_events(void) {
resume_app_via_self_id((int)DBGCTX()->pid);
DDE_RETURN(0);
dde_done:
elev_restore(&es);
#undef DDE_RETURN
return rc;
}
int debug_handle(int fd, struct cmd_packet *packet) {
+2 -1
View File
@@ -3,6 +3,7 @@
#include "protocol.h"
#include "sdk_shim.h"
#include "net.h"
#include "version.h"
extern int cmd_handler(int fd, struct cmd_packet *packet, unsigned char client_idx);
extern void print_ascii_banner(void);
@@ -300,7 +301,7 @@ teardown:
static void debugger_server_loop(void) {
static const char disconnect_msg[] = "ps5debug-NG disconnected.";
static const char loaded_msg[] = "ps5debug-NG by OSR v1.2.2 loaded!\n"
static const char loaded_msg[] = PS5DEBUG_NG_BRAND_STR " loaded!\n"
"Coded by OpenSourcereR\n"
"Special thanks to\n"
"golden, Ctn & SiSTRo! \xE2\x9D\xA4\n";
+2 -1
View File
@@ -5,6 +5,7 @@
#include "net.h"
#include "proc.h"
#include "debug_state.h"
#include "version.h"
extern int kern_handle(int fd, struct cmd_packet *packet);
extern int console_handle(int fd, struct cmd_packet *packet);
@@ -24,7 +25,7 @@ int handle_version(int fd, struct cmd_packet *packet) {
int handle_branding(int fd, struct cmd_packet *packet) {
(void)packet;
char brand[] = "ps5debug-NG by OSR v1.2.2";
char brand[] = PS5DEBUG_NG_BRAND_STR;
uint32_t len = (uint32_t)(sizeof(brand) - 1);
net_send_all(fd, &len, sizeof(uint32_t));
net_send_all(fd, brand, (int)len);