diff --git a/patch_v2/meow_svcd/meow_svcd b/patch_v2/meow_svcd/meow_svcd index da7b69c..1d2ddf5 100755 Binary files a/patch_v2/meow_svcd/meow_svcd and b/patch_v2/meow_svcd/meow_svcd differ diff --git a/patch_v2/meow_svcd/meow_svcd.c b/patch_v2/meow_svcd/meow_svcd.c index bf3e5aa..8eb18fb 100644 --- a/patch_v2/meow_svcd/meow_svcd.c +++ b/patch_v2/meow_svcd/meow_svcd.c @@ -366,9 +366,16 @@ static int find_svc(const char *name) static void remove_svc_idx(int idx) { if (idx < 0 || idx >= g_nsvc) return; - if (g_nsvc - idx - 1 > 0) + int moved = g_nsvc - idx - 1; + if (moved > 0) { memmove(&g_svcs[idx], &g_svcs[idx + 1], - (size_t)(g_nsvc - idx - 1) * sizeof(svc_t)); + (size_t)moved * sizeof(svc_t)); + /* memmove 整块字节拷贝 svc_t 后,被左移槽位的 argv[] 指针仍指向移动前 + * (g_svcs[i+1]) 的 exec/argbuf 成员地址 —— 同 *s=tmp 的悬垂,需重定位到 + * 新槽位自身的成员(svc_rebuild_argv)。否则删除一个服务后,其后被左移的 + * 槽若在同 tick 内被拉起,execv 会用错位的 argv → cmdline 错乱。 */ + for (int i = idx; i < idx + moved; i++) svc_rebuild_argv(&g_svcs[i]); + } g_nsvc--; }