Browse Source

sys/src/cmd/samterm: fix suicide on mouse movement (#309)

In io.c, put `Mouse *` in Alt.v instead of `Mouse **`

Change-Id: I3eb18146b2b770fc466259b8cdc76f9983049791
Signed-off-by: Hank Donnay <hdonnay@gmail.com>
Henry Donnay 7 years ago
parent
commit
8fca96b7fa
1 changed files with 59 additions and 53 deletions
  1. 59 53
      sys/src/cmd/samterm/io.c

+ 59 - 53
sys/src/cmd/samterm/io.c

@@ -17,24 +17,24 @@
 #include "flayer.h"
 #include "samterm.h"
 
-int	cursorfd;
-int	plumbfd = -1;
-int	input;
-int	got;
-int	block;
-int	kbdc;
-int	resized;
-uchar	*hostp;
-uchar	*hoststop;
-uchar	*plumbbase;
-uchar	*plumbp;
-uchar	*plumbstop;
-Channel	*plumbc;
-Channel	*hostc;
-Mousectl	*mousectl;
-Mouse	*mousep;
-Keyboardctl *keyboardctl;
-void	panic(char*);
+int cursorfd;
+int plumbfd = -1;
+int input;
+int got;
+int block;
+int kbdc;
+int resized;
+uchar* hostp;
+uchar* hoststop;
+uchar* plumbbase;
+uchar* plumbp;
+uchar* plumbstop;
+Channel* plumbc;
+Channel* hostc;
+Mousectl* mousectl;
+Mouse* mousep;
+Keyboardctl* keyboardctl;
+void panic(char*);
 
 void
 closeio(void)
@@ -48,13 +48,13 @@ initio(void)
 {
 	threadsetname("main");
 	mousectl = initmouse(nil, display->image);
-	if(mousectl == nil){
+	if(mousectl == nil) {
 		fprint(2, "samterm: mouse init failed: %r\n");
 		threadexitsall("mouse");
 	}
-	mousep = (Mouse *)mousectl;
+	mousep = (Mouse*)mousectl;
 	keyboardctl = initkeyboard(nil);
-	if(keyboardctl == nil){
+	if(keyboardctl == nil) {
 		fprint(2, "samterm: keyboard init failed: %r\n");
 		threadexitsall("kbd");
 	}
@@ -74,20 +74,20 @@ getmouse(void)
 void
 mouseunblock(void)
 {
-	got &= ~(1<<RMouse);
+	got &= ~(1 << RMouse);
 }
 
 void
 kbdblock(void)
-{		/* ca suffit */
-	block = (1<<RKeyboard)|(1<<RPlumb);
+{ /* ca suffit */
+	block = (1 << RKeyboard) | (1 << RPlumb);
 }
 
 int
 button(int but)
 {
 	getmouse();
-	return mousep->buttons&(1<<(but-1));
+	return mousep->buttons & (1 << (but - 1));
 }
 
 void
@@ -99,13 +99,13 @@ externload(int i)
 	memmove(plumbbase, plumbbuf[i].data, plumbbuf[i].n);
 	plumbp = plumbbase;
 	plumbstop = plumbbase + plumbbuf[i].n;
-	got |= 1<<RPlumb;
+	got |= 1 << RPlumb;
 }
 
 int
 waitforio(void)
 {
-	Alt alts[NRes+1];
+	Alt alts[NRes + 1];
 	Rune r;
 	int i;
 	ulong type;
@@ -115,31 +115,31 @@ again:
 	alts[RPlumb].c = plumbc;
 	alts[RPlumb].v = &i;
 	alts[RPlumb].op = CHANRCV;
-	if((block & (1<<RPlumb)) || plumbc == nil)
+	if((block & (1 << RPlumb)) || plumbc == nil)
 		alts[RPlumb].op = CHANNOP;
 
 	alts[RHost].c = hostc;
 	alts[RHost].v = &i;
 	alts[RHost].op = CHANRCV;
-	if(block & (1<<RHost))
+	if(block & (1 << RHost))
 		alts[RHost].op = CHANNOP;
 
 	alts[RKeyboard].c = keyboardctl->c;
 	alts[RKeyboard].v = &r;
 	alts[RKeyboard].op = CHANRCV;
-	if(block & (1<<RKeyboard))
+	if(block & (1 << RKeyboard))
 		alts[RKeyboard].op = CHANNOP;
 
 	alts[RMouse].c = mousectl->c;
-	alts[RMouse].v = (Mouse *)&mousectl;
+	alts[RMouse].v = (Mouse*)mousectl;
 	alts[RMouse].op = CHANRCV;
-	if(block & (1<<RMouse))
+	if(block & (1 << RMouse))
 		alts[RMouse].op = CHANNOP;
 
 	alts[RResize].c = mousectl->resizec;
 	alts[RResize].v = nil;
 	alts[RResize].op = CHANRCV;
-	if(block & (1<<RResize))
+	if(block & (1 << RResize))
 		alts[RResize].op = CHANNOP;
 
 	alts[NRes].op = CHANEND;
@@ -148,7 +148,13 @@ again:
 		return got & ~block;
 	flushimage(display, 1);
 	type = alt(alts);
-	switch(type){
+
+	if(!(type < NRes)) {
+		/* coverity wants to make sure type cant do an INT_MAX shift when we return */
+		fprint(2, "samterm: waited wrong: %lx\n", type);
+		panic("wait");
+	}
+	switch(type) {
 	case RHost:
 		hostp = hostbuf[i].data;
 		hoststop = hostbuf[i].data + hostbuf[i].n;
@@ -165,12 +171,12 @@ again:
 	case RResize:
 		resized = 1;
 		/* do the resize in line if we've finished initializing and we're not in a blocking state */
-		if(hasunlocked && block==0 && RESIZED())
+		if(hasunlocked && block == 0 && RESIZED())
 			resize();
 		goto again;
 	}
-	got |= 1<<type;
-	return got; 
+	got |= 1 << type;
+	return got;
 }
 
 int
@@ -178,11 +184,11 @@ rcvchar(void)
 {
 	int c;
 
-	if(!(got & (1<<RHost)))
+	if(!(got & (1 << RHost)))
 		return -1;
 	c = *hostp++;
 	if(hostp == hoststop)
-		got &= ~(1<<RHost);
+		got &= ~(1 << RHost);
 	return c;
 }
 
@@ -190,7 +196,7 @@ char*
 rcvstring(void)
 {
 	*hoststop = 0;
-	got &= ~(1<<RHost);
+	got &= ~(1 << RHost);
 	return (char*)hostp;
 }
 
@@ -199,8 +205,8 @@ getch(void)
 {
 	int c;
 
-	while((c = rcvchar()) == -1){
-		block = ~(1<<RHost);
+	while((c = rcvchar()) == -1) {
+		block = ~(1 << RHost);
 		waitforio();
 		block = 0;
 	}
@@ -212,11 +218,11 @@ externchar(void)
 {
 	Rune r;
 
-    loop:
-	if(got & ((1<<RPlumb) & ~block)){
+loop:
+	if(got & ((1 << RPlumb) & ~block)) {
 		plumbp += chartorune(&r, (char*)plumbp);
-		if(plumbp >= plumbstop){
-			got &= ~(1<<RPlumb);
+		if(plumbp >= plumbstop) {
+			got &= ~(1 << RPlumb);
 			free(plumbbase);
 		}
 		if(r == 0)
@@ -234,7 +240,7 @@ ecankbd(void)
 
 	if(kpeekc >= 0)
 		return 1;
-	if(nbrecv(keyboardctl->c, &r) > 0){
+	if(nbrecv(keyboardctl->c, &r) > 0) {
 		kpeekc = r;
 		return 1;
 	}
@@ -247,12 +253,12 @@ ekbd(void)
 	int c;
 	Rune r;
 
-	if(kpeekc >= 0){
+	if(kpeekc >= 0) {
 		c = kpeekc;
 		kpeekc = -1;
 		return c;
 	}
-	if(recv(keyboardctl->c, &r) < 0){
+	if(recv(keyboardctl->c, &r) < 0) {
 		fprint(2, "samterm: keybard recv error: %r\n");
 		panic("kbd");
 	}
@@ -267,13 +273,13 @@ kbdchar(void)
 	c = externchar();
 	if(c > 0)
 		return c;
-	if(got & (1<<RKeyboard)){
+	if(got & (1 << RKeyboard)) {
 		c = kbdc;
 		kbdc = -1;
-		got &= ~(1<<RKeyboard);
+		got &= ~(1 << RKeyboard);
 		return c;
 	}
-	while(plumbc!=nil && nbrecv(plumbc, &i)>0){
+	while(plumbc != nil && nbrecv(plumbc, &i) > 0) {
 		externload(i);
 		c = externchar();
 		if(c > 0)
@@ -293,7 +299,7 @@ qpeekc(void)
 int
 RESIZED(void)
 {
-	if(resized){
+	if(resized) {
 		if(getwindow(display, Refnone) < 0)
 			panic("can't reattach to window");
 		resized = 0;