Skip to content

Commit

Permalink
Simplify parasite code and its args setup
Browse files Browse the repository at this point in the history
  • Loading branch information
mkozlowski committed Jul 28, 2023
1 parent a159b66 commit a2f9795
Show file tree
Hide file tree
Showing 6 changed files with 82 additions and 224 deletions.
13 changes: 3 additions & 10 deletions arch/arm/parasite-head.S
Original file line number Diff line number Diff line change
Expand Up @@ -25,21 +25,14 @@

__parasite_head_start:
adr sp, __parasite_stack
adr r0, __parasite_cmd
ldr r0, [r0]
adr r1, __parasite_args
adr r0, __parasite_args
bl service
udf #16 @ SIGTRAP
.align 4, 0x00

__parasite_cmd:
.long 0

__parasite_args:
.long 0
.space PARASITE_ARG_SIZE, 0
.space PARASITE_STACK_SIZE, 0
.space 224, 0 /* 8+4 fill */
.space 56, 0 /* 8+4 fill */

__parasite_stack:
.long 0
.space PARASITE_STACK_SIZE, 0
16 changes: 4 additions & 12 deletions arch/arm64/parasite-head.S
Original file line number Diff line number Diff line change
Expand Up @@ -24,23 +24,15 @@
.align 4, 0x00

__parasite_head_start:
adr x1, __parasite_stack
mov sp, x1
adr x0, __parasite_cmd
ldr x0, [x0]
adr x1, __parasite_args
adr x0, __parasite_stack
mov sp, x0
adr x0, __parasite_args
bl service
brk #0 /* SIGTRAP */
.align 4, 0x00

__parasite_cmd:
.quad 0

__parasite_args:
.quad 0
.space PARASITE_ARG_SIZE, 0
.space PARASITE_STACK_SIZE, 0
.space 224, 0 /* 8+4 fill */

__parasite_stack:
.quad 0
.space PARASITE_STACK_SIZE, 0
14 changes: 2 additions & 12 deletions arch/x86_64/parasite-head.S
Original file line number Diff line number Diff line change
Expand Up @@ -25,23 +25,13 @@

__parasite_head_start:
leaq __parasite_stack(%rip), %rsp
subq $16, %rsp
andq $~15, %rsp
pushq $0
movq %rsp, %rbp
movl __parasite_cmd(%rip), %edi
leaq __parasite_args(%rip), %rsi
leaq __parasite_args(%rip), %rdi
call service
int $0x03 /* SIGTRAP */
.align 8, 0x90

__parasite_cmd:
.long 0

__parasite_args:
.long 0
.space PARASITE_ARG_SIZE, 0
.space PARASITE_STACK_SIZE, 0

__parasite_stack:
.long 0
.space PARASITE_STACK_SIZE, 0
53 changes: 21 additions & 32 deletions memcr.c
Original file line number Diff line number Diff line change
Expand Up @@ -309,32 +309,32 @@ static int parasite_status_ok(void)
return ret;
}

static void create_filesystem_socketname(char * addr, int addr_size, pid_t pid)
static void parasite_socket_init(struct sockaddr_un *addr, pid_t pid)
{
snprintf(addr, addr_size, "%s/memcr%u", parasite_socket_dir, pid);
}

static void create_abstract_socketname(char * addr, int addr_size, pid_t pid)
{
snprintf(addr, addr_size, "#memcr%u", pid);
}
memset(addr, 0x00, sizeof(struct sockaddr_un));

static void cleanup_socket(int pid)
{
char socketaddr[108];
addr->sun_family = AF_UNIX;

create_filesystem_socketname(socketaddr, sizeof(socketaddr), pid);
unlink(socketaddr);
if (parasite_socket_dir)
snprintf(addr->sun_path, sizeof(addr->sun_path), "%s/memcr%u", parasite_socket_dir, pid);
else {
snprintf(addr->sun_path, sizeof(addr->sun_path), "#memcr%u", pid);
addr->sun_path[0] = '\0';
}
}

static void cleanup_pid(pid_t pid)
{
char path[PATH_MAX];

snprintf(path, sizeof(path), "%s/pages-%d.img", dump_dir, pid);
unlink(path);

if (parasite_socket_dir)
cleanup_socket(pid);
if (!parasite_socket_dir)
return;

snprintf(path, sizeof(path), "%s/memcr%u", parasite_socket_dir, pid);
unlink(path);
}

static void cleanup_checkpointed_pids(void)
Expand Down Expand Up @@ -552,7 +552,7 @@ static int unseize_target(void)
static int parasite_connect(pid_t pid)
{
int cd;
struct sockaddr_un addr = { 0 };
struct sockaddr_un addr;
int ret;
int cnt = 0;

Expand All @@ -562,14 +562,7 @@ static int parasite_connect(pid_t pid)
return -1;
}

addr.sun_family = PF_UNIX;

if (parasite_socket_dir) {
create_filesystem_socketname(addr.sun_path, sizeof(addr.sun_path), pid);
} else {
create_abstract_socketname(addr.sun_path, sizeof(addr.sun_path), pid);
addr.sun_path[0] = '\0';
}
parasite_socket_init(&addr, pid);

/* parasite needs some time to start listening on a socket */
retry:
Expand Down Expand Up @@ -854,10 +847,10 @@ static int setup_listen_socket(struct sockaddr *addr, socklen_t addrlen)

static int setup_listen_unix_socket(const char *client_socket_path)
{
struct sockaddr_un addr;
struct sockaddr_un addr = {
.sun_family = AF_UNIX,
};

addr.sun_family = PF_UNIX;
memset(addr.sun_path, 0, sizeof(addr.sun_path));
snprintf(addr.sun_path, sizeof(addr.sun_path), "%s", client_socket_path);

fprintf(stdout, "[x] Trying to configure UNIX %s socket.\n", addr.sun_path);
Expand Down Expand Up @@ -1750,15 +1743,11 @@ static int setup_parasite_args(pid_t pid, void *base)
unsigned long *src = (unsigned long *)&pa;
unsigned long *dst = (unsigned long *)PARASITE_ARGS_ADDR(base);

if (parasite_socket_dir)
create_filesystem_socketname(pa.addr, sizeof(pa.addr), pid);
else
create_abstract_socketname(pa.addr, sizeof(pa.addr), pid);
parasite_socket_init(&pa.addr, pid);

return poke(pid, dst, src, sizeof(pa));
}


static void *parasite_watch_thread(void *ptr)
{
int ret;
Expand Down
2 changes: 1 addition & 1 deletion memcr.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@
#endif

struct parasite_args {
char addr[108]; /* abstract or filesystem socket address */
struct sockaddr_un addr;
};

typedef enum {
Expand Down
Loading

0 comments on commit a2f9795

Please sign in to comment.