cmds: fix rfork handling in sys/ctrace
This commit is contained in:
		| @@ -53,9 +53,10 @@ cwrite(Reader *r, char *cmd) | |||||||
| void | void | ||||||
| reader(void *v) | reader(void *v) | ||||||
| { | { | ||||||
| 	int forking = 0, newpid; | 	int newpid; | ||||||
| 	Reader r; | 	Reader r; | ||||||
| 	Msg *s; | 	Msg *s; | ||||||
|  | 	char *rf, *a[16]; | ||||||
|  |  | ||||||
| 	r.pid = (int)(uintptr)v; | 	r.pid = (int)(uintptr)v; | ||||||
| 	r.tfd = r.cfd = -1; | 	r.tfd = r.cfd = -1; | ||||||
| @@ -72,31 +73,19 @@ reader(void *v) | |||||||
| 	cwrite(&r, "startsyscall"); | 	cwrite(&r, "startsyscall"); | ||||||
|  |  | ||||||
| 	while(pread(r.tfd, s->buf, sizeof(s->buf)-1, 0) > 0){ | 	while(pread(r.tfd, s->buf, sizeof(s->buf)-1, 0) > 0){ | ||||||
| 		if (forking && s->buf[1] == '=' && s->buf[3] != '-') { | 		if(strstr(s->buf, " rfork ") != nil){ | ||||||
| 			forking = 0; |  | ||||||
| 			newpid = strtol(&s->buf[3], 0, 0); |  | ||||||
| 			sendp(forkc, (void*)(uintptr_t)newpid); |  | ||||||
| 			procrfork(reader, (void*)(uintptr_t)newpid, Stacksize, 0); |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		/* |  | ||||||
| 		 * There are three tests here and they (I hope) guarantee |  | ||||||
| 		 * no false positives. |  | ||||||
| 		 */ |  | ||||||
| 		if (strstr(s->buf, " Rfork") != nil) { |  | ||||||
| 			char *a[8]; |  | ||||||
| 			char *rf; |  | ||||||
|  |  | ||||||
| 			rf = strdup(s->buf); | 			rf = strdup(s->buf); | ||||||
|          		if (tokenize(rf, a, 8) == 5) { | 			if(tokenize(rf, a, 9) == 9 | ||||||
| 				unsigned long flags; | 			&& a[4][0] == '<' | ||||||
|  | 			&& a[5][0] != '-' | ||||||
| 				flags = strtoul(a[4], 0, 16); | 			&& strcmp(a[2], "rfork") == 0) { | ||||||
| 				if (flags & RFPROC) | 				newpid = strtol(a[5], 0, 0); | ||||||
| 					forking = 1; | 				sendp(forkc, (void*)(uintptr_t)newpid); | ||||||
|  | 				procrfork(reader, (void*)(uintptr_t)newpid, Stacksize, 0); | ||||||
| 			} | 			} | ||||||
| 			free(rf); | 			free(rf); | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		s->pid = r.pid; | 		s->pid = r.pid; | ||||||
| 		sendp(out, s); | 		sendp(out, s); | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user