|
73 | 73 | #define ARCH_NAME "unknown" |
74 | 74 | #endif |
75 | 75 |
|
| 76 | +/* from kernel include/linux/err.h */ |
| 77 | +#define MAX_ERRNO 4095 |
| 78 | +#define IS_ERR_VALUE(x) ((unsigned long)(x) >= (unsigned long)-MAX_ERRNO) |
| 79 | + |
76 | 80 | #define NT_PRSTATUS 1 |
77 | 81 |
|
78 | 82 | #define __round_mask(x, y) ((__typeof__(x))((y)-1)) |
@@ -356,7 +360,7 @@ static void md5_final(unsigned char *md, unsigned int *len, void *ctx) |
356 | 360 | } |
357 | 361 | #endif |
358 | 362 |
|
359 | | -static void parasite_status_signal(pid_t pid, int status) |
| 363 | +static void parasite_status_signal(int status) |
360 | 364 | { |
361 | 365 | pthread_mutex_lock(¶site_watch.lock); |
362 | 366 | parasite_watch.changed = 1; |
@@ -449,7 +453,7 @@ static void cleanup_pid(pid_t pid) |
449 | 453 |
|
450 | 454 | static int iterate_pstree(pid_t pid, int skip_self, int max_threads, int (*callback)(pid_t pid)) |
451 | 455 | { |
452 | | - int ret; |
| 456 | + int ret = -1; |
453 | 457 | char path[PATH_MAX]; |
454 | 458 | DIR *task_dir; |
455 | 459 | struct dirent *ent; |
@@ -1208,6 +1212,8 @@ static void get_target_rss(pid_t tid, struct vm_stats *vms) |
1208 | 1212 | FILE *f; |
1209 | 1213 | char buf[1024]; |
1210 | 1214 |
|
| 1215 | + memset(vms, 0x0, sizeof(struct vm_stats)); |
| 1216 | + |
1211 | 1217 | f = fopen_proc(tid, "status"); |
1212 | 1218 | if (!f) |
1213 | 1219 | return; |
@@ -1526,6 +1532,7 @@ static int get_vma_pages(int pd, int md, int cd, struct vm_area *vma, int fd) |
1526 | 1532 | ret = parasite_write_read(cd, &req, (void*)map_buf, req.u.pagemap.len); |
1527 | 1533 | if (ret != req.u.pagemap.len) { |
1528 | 1534 | fprintf(stderr, "parasite_write_read() %d / %ld\n", ret, req.u.pagemap.len); |
| 1535 | + free(map_buf); |
1529 | 1536 | return -1; |
1530 | 1537 | } |
1531 | 1538 | } |
@@ -1984,7 +1991,7 @@ static int peek(pid_t pid, unsigned long *addr, unsigned long *dst, size_t len) |
1984 | 1991 |
|
1985 | 1992 | static int poke(pid_t pid, unsigned long *addr, unsigned long *src, size_t len) |
1986 | 1993 | { |
1987 | | - int ret; |
| 1994 | + int ret = -1; |
1988 | 1995 | int i; |
1989 | 1996 |
|
1990 | 1997 | /* len must be a multiple of CPU word size */ |
@@ -2141,7 +2148,7 @@ static void *parasite_watch_thread(void *ptr) |
2141 | 2148 | return NULL; |
2142 | 2149 | } |
2143 | 2150 |
|
2144 | | - parasite_status_signal(pid, status); |
| 2151 | + parasite_status_signal(status); |
2145 | 2152 |
|
2146 | 2153 | return NULL; |
2147 | 2154 | } |
@@ -2260,7 +2267,8 @@ static int execute_parasite_checkpoint(pid_t pid) |
2260 | 2267 |
|
2261 | 2268 | /* mmap space for parasite */ |
2262 | 2269 | ret = execute_blob(&ctx, mmap_blob, mmap_blob_size, sizeof(parasite_blob), 0); |
2263 | | - if (ret >= -4096LU) { |
| 2270 | + /* the executed mmap_blob calls directly mmap syscall, which returns errors in range -1 to -4095 */ |
| 2271 | + if (IS_ERR_VALUE(ret)) { |
2264 | 2272 | fprintf(stdout, "[-] mmap failed: %lx\n", ret); |
2265 | 2273 | signals_unblock(pid); |
2266 | 2274 | ctx_restore(pid); |
|
0 commit comments