Add xmalloc and xrealloc wrappers
If malloc or realloc fail they return NULL. Theorically this condition should be tested in the code, but it's a strange condition today (basically if this is hapenning thenyou have a big problem), and even Linux never returns NULL in the default configuration (only if the process don't have room in the space address, something a bit impossible in the case of st). But stis enough small for being executed in low resources computers where this can be a real problem. So the easy way is creating a wrappers function for them and call to die in case of error. --- st.c | 44 +++++++++++++++++++++++++++++++------------- 1 file changed, 31 insertions(+), 13 deletions(-)
This commit is contained in:
		
							parent
							
								
									8f1144edee
								
							
						
					
					
						commit
						b9d5fec4f2
					
				
							
								
								
									
										44
									
								
								st.c
									
									
									
									
									
								
							
							
						
						
									
										44
									
								
								st.c
									
									
									
									
									
								
							| @ -326,6 +326,9 @@ static int utf8encode(long *, char *); | |||||||
| static int utf8size(char *); | static int utf8size(char *); | ||||||
| static int isfullutf8(char *, int); | static int isfullutf8(char *, int); | ||||||
| 
 | 
 | ||||||
|  | static void *xmalloc(size_t); | ||||||
|  | static void *xrealloc(void *, size_t); | ||||||
|  | 
 | ||||||
| static void (*handler[LASTEvent])(XEvent *) = { | static void (*handler[LASTEvent])(XEvent *) = { | ||||||
| 	[KeyPress] = kpress, | 	[KeyPress] = kpress, | ||||||
| 	[ClientMessage] = cmessage, | 	[ClientMessage] = cmessage, | ||||||
| @ -359,6 +362,21 @@ static char *opt_title = NULL; | |||||||
| static char *opt_embed = NULL; | static char *opt_embed = NULL; | ||||||
| static char *opt_class = NULL; | static char *opt_class = NULL; | ||||||
| 
 | 
 | ||||||
|  | void * | ||||||
|  | xmalloc(size_t len) { | ||||||
|  | 	void *p = malloc(len); | ||||||
|  | 	if(!p) | ||||||
|  | 		die("Out of memory"); | ||||||
|  | 	return p; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void * | ||||||
|  | xrealloc(void *p, size_t len) { | ||||||
|  | 	if((p = realloc(p, len)) == NULL) | ||||||
|  | 		die("Out of memory"); | ||||||
|  | 	return p; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| int | int | ||||||
| utf8decode(char *s, long *u) { | utf8decode(char *s, long *u) { | ||||||
| 	uchar c; | 	uchar c; | ||||||
| @ -565,7 +583,7 @@ selcopy(void) { | |||||||
| 
 | 
 | ||||||
| 	else { | 	else { | ||||||
| 		bufsize = (term.col+1) * (sel.e.y-sel.b.y+1) * UTF_SIZ; | 		bufsize = (term.col+1) * (sel.e.y-sel.b.y+1) * UTF_SIZ; | ||||||
| 		ptr = str = malloc(bufsize); | 		ptr = str = xmalloc(bufsize); | ||||||
| 
 | 
 | ||||||
| 		/* append every set & selected glyph to the selection */ | 		/* append every set & selected glyph to the selection */ | ||||||
| 		for(y = 0; y < term.row; y++) { | 		for(y = 0; y < term.row; y++) { | ||||||
| @ -918,14 +936,14 @@ void | |||||||
| tnew(int col, int row) { | tnew(int col, int row) { | ||||||
| 	/* set screen size */ | 	/* set screen size */ | ||||||
| 	term.row = row, term.col = col; | 	term.row = row, term.col = col; | ||||||
| 	term.line = malloc(term.row * sizeof(Line)); | 	term.line = xmalloc(term.row * sizeof(Line)); | ||||||
| 	term.alt  = malloc(term.row * sizeof(Line)); | 	term.alt  = xmalloc(term.row * sizeof(Line)); | ||||||
| 	term.dirty = malloc(term.row * sizeof(*term.dirty)); | 	term.dirty = xmalloc(term.row * sizeof(*term.dirty)); | ||||||
| 	term.tabs = malloc(term.col * sizeof(*term.tabs)); | 	term.tabs = xmalloc(term.col * sizeof(*term.tabs)); | ||||||
| 
 | 
 | ||||||
| 	for(row = 0; row < term.row; row++) { | 	for(row = 0; row < term.row; row++) { | ||||||
| 		term.line[row] = malloc(term.col * sizeof(Glyph)); | 		term.line[row] = xmalloc(term.col * sizeof(Glyph)); | ||||||
| 		term.alt [row] = malloc(term.col * sizeof(Glyph)); | 		term.alt [row] = xmalloc(term.col * sizeof(Glyph)); | ||||||
| 		term.dirty[row] = 0; | 		term.dirty[row] = 0; | ||||||
| 	} | 	} | ||||||
| 	memset(term.tabs, 0, term.col * sizeof(*term.tabs)); | 	memset(term.tabs, 0, term.col * sizeof(*term.tabs)); | ||||||
| @ -1761,16 +1779,16 @@ tresize(int col, int row) { | |||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	/* resize to new height */ | 	/* resize to new height */ | ||||||
| 	term.line = realloc(term.line, row * sizeof(Line)); | 	term.line = xrealloc(term.line, row * sizeof(Line)); | ||||||
| 	term.alt  = realloc(term.alt,  row * sizeof(Line)); | 	term.alt  = xrealloc(term.alt,  row * sizeof(Line)); | ||||||
| 	term.dirty = realloc(term.dirty, row * sizeof(*term.dirty)); | 	term.dirty = xrealloc(term.dirty, row * sizeof(*term.dirty)); | ||||||
| 	term.tabs = realloc(term.tabs, col * sizeof(*term.tabs)); | 	term.tabs = xrealloc(term.tabs, col * sizeof(*term.tabs)); | ||||||
| 
 | 
 | ||||||
| 	/* resize each row to new width, zero-pad if needed */ | 	/* resize each row to new width, zero-pad if needed */ | ||||||
| 	for(i = 0; i < minrow; i++) { | 	for(i = 0; i < minrow; i++) { | ||||||
| 		term.dirty[i] = 1; | 		term.dirty[i] = 1; | ||||||
| 		term.line[i] = realloc(term.line[i], col * sizeof(Glyph)); | 		term.line[i] = xrealloc(term.line[i], col * sizeof(Glyph)); | ||||||
| 		term.alt[i]  = realloc(term.alt[i],  col * sizeof(Glyph)); | 		term.alt[i]  = xrealloc(term.alt[i],  col * sizeof(Glyph)); | ||||||
| 		for(x = mincol; x < col; x++) { | 		for(x = mincol; x < col; x++) { | ||||||
| 			term.line[i][x].state = 0; | 			term.line[i][x].state = 0; | ||||||
| 			term.alt[i][x].state = 0; | 			term.alt[i][x].state = 0; | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user