Fixing bugs in the strtol and strtok_r replacements.
Thanks "Roberto E. Vargas Caballero" <k0ga@shike2.com> for the comments!
This commit is contained in:
		
							parent
							
								
									7cb0d95509
								
							
						
					
					
						commit
						7d32471eff
					
				
							
								
								
									
										38
									
								
								st.c
									
									
									
									
									
								
							
							
						
						
									
										38
									
								
								st.c
									
									
									
									
									
								
							| @ -1306,23 +1306,18 @@ csiparse(void) { | |||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	while(p < csiescseq.buf+csiescseq.len) { | 	while(p < csiescseq.buf+csiescseq.len) { | ||||||
| 		np = NULL; |  | ||||||
| 		v = strtol(p, &np, 10); | 		v = strtol(p, &np, 10); | ||||||
|  | 		if(np == p) | ||||||
|  | 			break; | ||||||
| 		if(v == LONG_MAX || v == LONG_MIN) | 		if(v == LONG_MAX || v == LONG_MIN) | ||||||
| 			v = -1; | 			v = -1; | ||||||
| 		csiescseq.arg[csiescseq.narg] = v; | 		csiescseq.arg[csiescseq.narg++] = v; | ||||||
| 		if(np != NULL) |  | ||||||
| 		p = np; | 		p = np; | ||||||
| 
 | 		if(*p != ';' || csiescseq.narg == ESC_ARG_SIZ) | ||||||
| 		if(*p == ';' && csiescseq.narg+1 < ESC_ARG_SIZ) { | 			break; | ||||||
| 			csiescseq.narg++, p++; | 		p++; | ||||||
| 		} else { | 	} | ||||||
| 	csiescseq.mode = *p; | 	csiescseq.mode = *p; | ||||||
| 			csiescseq.narg++; |  | ||||||
| 
 |  | ||||||
| 			return; |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /* for absolute user moves, when decom is set */ | /* for absolute user moves, when decom is set */ | ||||||
| @ -1930,16 +1925,13 @@ strhandle(void) { | |||||||
| 
 | 
 | ||||||
| void | void | ||||||
| strparse(void) { | strparse(void) { | ||||||
| 	char *p = strescseq.buf, *np, *sp; | 	char *p = strescseq.buf, *sp; | ||||||
| 
 | 
 | ||||||
| 	strescseq.narg = 0; | 	strescseq.buf[strescseq.len] = '\0'; | ||||||
| 	np = strtok_r(strescseq.buf, ";", &sp); | 	for(p = strtok_r(p, ";", &sp); p; p = strtok_r(NULL, ";", &sp)) { | ||||||
| 	while(p < strescseq.buf+strescseq.len && np != NULL) { | 		if(strescseq.narg == STR_ARG_SIZ) | ||||||
|  | 			return; | ||||||
| 		strescseq.args[strescseq.narg++] = p; | 		strescseq.args[strescseq.narg++] = p; | ||||||
| 
 |  | ||||||
| 		np = strtok_r(NULL, ";", &sp); |  | ||||||
| 		if(np != NULL) |  | ||||||
| 			p = np; |  | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -1951,7 +1943,9 @@ strdump(void) { | |||||||
| 	printf("ESC%c", strescseq.type); | 	printf("ESC%c", strescseq.type); | ||||||
| 	for(i = 0; i < strescseq.len; i++) { | 	for(i = 0; i < strescseq.len; i++) { | ||||||
| 		c = strescseq.buf[i] & 0xff; | 		c = strescseq.buf[i] & 0xff; | ||||||
| 		if(isprint(c)) { | 		if(c == '\0') { | ||||||
|  | 			return; | ||||||
|  | 		} else if(isprint(c)) { | ||||||
| 			putchar(c); | 			putchar(c); | ||||||
| 		} else if(c == '\n') { | 		} else if(c == '\n') { | ||||||
| 			printf("(\\n)"); | 			printf("(\\n)"); | ||||||
| @ -2039,7 +2033,7 @@ tputc(char *c, int len) { | |||||||
| 			strhandle(); | 			strhandle(); | ||||||
| 			break; | 			break; | ||||||
| 		default: | 		default: | ||||||
| 			if(strescseq.len + len < sizeof(strescseq.buf)) { | 			if(strescseq.len + len < sizeof(strescseq.buf) - 1) { | ||||||
| 				memmove(&strescseq.buf[strescseq.len], c, len); | 				memmove(&strescseq.buf[strescseq.len], c, len); | ||||||
| 				strescseq.len += len; | 				strescseq.len += len; | ||||||
| 			} else { | 			} else { | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user