fix buffer overflow when handling long composed input
To reproduce the issue: " If you already have the multi-key enabled on your system, then add this line to your ~/.XCompose file: [...] <question> <T> <E> <S> <T> <question> : "1234567890123456789012345678901234567890123456789012345678901234567890" " Reported by and an initial patch by Andy Gozas <andy@gozas.me>, thanks! Adapted the patch, for now st (like dmenu) handles a fixed amount of composed characters, or otherwise ignores it. This is done for simplicity sake.
This commit is contained in:
		
							
								
								
									
										9
									
								
								x.c
									
									
									
									
									
								
							
							
						
						
									
										9
									
								
								x.c
									
									
									
									
									
								
							| @@ -1833,7 +1833,7 @@ void | |||||||
| kpress(XEvent *ev) | kpress(XEvent *ev) | ||||||
| { | { | ||||||
| 	XKeyEvent *e = &ev->xkey; | 	XKeyEvent *e = &ev->xkey; | ||||||
| 	KeySym ksym; | 	KeySym ksym = NoSymbol; | ||||||
| 	char buf[64], *customkey; | 	char buf[64], *customkey; | ||||||
| 	int len; | 	int len; | ||||||
| 	Rune c; | 	Rune c; | ||||||
| @@ -1843,10 +1843,13 @@ kpress(XEvent *ev) | |||||||
| 	if (IS_SET(MODE_KBDLOCK)) | 	if (IS_SET(MODE_KBDLOCK)) | ||||||
| 		return; | 		return; | ||||||
|  |  | ||||||
| 	if (xw.ime.xic) | 	if (xw.ime.xic) { | ||||||
| 		len = XmbLookupString(xw.ime.xic, e, buf, sizeof buf, &ksym, &status); | 		len = XmbLookupString(xw.ime.xic, e, buf, sizeof buf, &ksym, &status); | ||||||
| 	else | 		if (status == XBufferOverflow) | ||||||
|  | 			return; | ||||||
|  | 	} else { | ||||||
| 		len = XLookupString(e, buf, sizeof buf, &ksym, NULL); | 		len = XLookupString(e, buf, sizeof buf, &ksym, NULL); | ||||||
|  | 	} | ||||||
| 	/* 1. shortcuts */ | 	/* 1. shortcuts */ | ||||||
| 	for (bp = shortcuts; bp < shortcuts + LEN(shortcuts); bp++) { | 	for (bp = shortcuts; bp < shortcuts + LEN(shortcuts); bp++) { | ||||||
| 		if (ksym == bp->keysym && match(bp->mod, e->state)) { | 		if (ksym == bp->keysym && match(bp->mod, e->state)) { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user