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