Skip to content
Snippets Groups Projects
Commit c85d0cc9 authored by Deucе's avatar Deucе :ok_hand_tone4:
Browse files

retbuf paranoia

Reported in unmonitor, which always passes NULL.
parent 7794a770
No related branches found
No related tags found
No related merge requests found
Pipeline #7917 passed
...@@ -2815,7 +2815,7 @@ static void do_ansi(struct cterminal *cterm, char *retbuf, size_t retsize, int * ...@@ -2815,7 +2815,7 @@ static void do_ansi(struct cterminal *cterm, char *retbuf, size_t retsize, int *
vmode = find_vmode(ti.currmode); vmode = find_vmode(ti.currmode);
if (vmode != -1) if (vmode != -1)
sprintf(tmp, "\x1b[?2;0;%u;%uS", vparams[vmode].charwidth*cterm->width, vparams[vmode].charheight*cterm->height); sprintf(tmp, "\x1b[?2;0;%u;%uS", vparams[vmode].charwidth*cterm->width, vparams[vmode].charheight*cterm->height);
if(*tmp && strlen(retbuf) + strlen(tmp) < retsize) if(retbuf && *tmp && strlen(retbuf) + strlen(tmp) < retsize)
strcat(retbuf, tmp); strcat(retbuf, tmp);
} }
} }
...@@ -2846,7 +2846,7 @@ static void do_ansi(struct cterminal *cterm, char *retbuf, size_t retsize, int * ...@@ -2846,7 +2846,7 @@ static void do_ansi(struct cterminal *cterm, char *retbuf, size_t retsize, int *
strcat(tmp, "c"); strcat(tmp, "c");
} }
} }
if(*tmp && strlen(retbuf) + strlen(tmp) < retsize) if(retbuf && *tmp && strlen(retbuf) + strlen(tmp) < retsize)
strcat(retbuf, tmp); strcat(retbuf, tmp);
} }
break; break;
...@@ -3704,7 +3704,7 @@ static void do_ansi(struct cterminal *cterm, char *retbuf, size_t retsize, int * ...@@ -3704,7 +3704,7 @@ static void do_ansi(struct cterminal *cterm, char *retbuf, size_t retsize, int *
p2 += sprintf(p2, "%d", cterm->tabs[i]); p2 += sprintf(p2, "%d", cterm->tabs[i]);
} }
strcat(p2, "\x1b\\"); strcat(p2, "\x1b\\");
if(*tmp && strlen(retbuf) + strlen(tmp) < retsize) if(retbuf && *tmp && strlen(retbuf) + strlen(tmp) < retsize)
strcat(retbuf, tmp); strcat(retbuf, tmp);
} }
} }
...@@ -3816,7 +3816,7 @@ static void do_ansi(struct cterminal *cterm, char *retbuf, size_t retsize, int * ...@@ -3816,7 +3816,7 @@ static void do_ansi(struct cterminal *cterm, char *retbuf, size_t retsize, int *
if (good) { if (good) {
*tmp = 0; *tmp = 0;
snprintf(tmp, sizeof(tmp), "\x1bP%u!~%04X\x1b\\", (unsigned)seq->param_int[0], crc); snprintf(tmp, sizeof(tmp), "\x1bP%u!~%04X\x1b\\", (unsigned)seq->param_int[0], crc);
if(*tmp && strlen(retbuf) + strlen(tmp) < retsize) if(retbuf && *tmp && strlen(retbuf) + strlen(tmp) < retsize)
strcat(retbuf, tmp); strcat(retbuf, tmp);
} }
} }
...@@ -3829,7 +3829,7 @@ static void do_ansi(struct cterminal *cterm, char *retbuf, size_t retsize, int * ...@@ -3829,7 +3829,7 @@ static void do_ansi(struct cterminal *cterm, char *retbuf, size_t retsize, int *
cterm->escbuf[0]=0; cterm->escbuf[0]=0;
cterm->sequence=0; cterm->sequence=0;
cterm->in_macro |= (UINT64_C(1)<<seq->param_int[0]); cterm->in_macro |= (UINT64_C(1)<<seq->param_int[0]);
cterm_write(cterm, cterm->macros[seq->param_int[0]], cterm->macro_lens[seq->param_int[0]], retbuf + strlen(retbuf), retsize - strlen(retbuf), speed); cterm_write(cterm, cterm->macros[seq->param_int[0]], cterm->macro_lens[seq->param_int[0]], retbuf ? retbuf + strlen(retbuf) : retbuf, retsize - (retbuf ? strlen(retbuf) : 0), speed);
cterm->in_macro &= ~(UINT64_C(1)<<seq->param_int[0]); cterm->in_macro &= ~(UINT64_C(1)<<seq->param_int[0]);
} }
} }
...@@ -4602,42 +4602,42 @@ static void do_ansi(struct cterminal *cterm, char *retbuf, size_t retsize, int * ...@@ -4602,42 +4602,42 @@ static void do_ansi(struct cterminal *cterm, char *retbuf, size_t retsize, int *
strcat(tmp, cterm->bg_tc_str); strcat(tmp, cterm->bg_tc_str);
} }
strcat(tmp, "m\x1b\\"); strcat(tmp, "m\x1b\\");
if(strlen(retbuf)+strlen(tmp) < retsize) if(retbuf && strlen(retbuf)+strlen(tmp) < retsize)
strcat(retbuf, tmp); strcat(retbuf, tmp);
} }
break; break;
case 'r': case 'r':
if (cterm->strbuf[3] == 0) { if (cterm->strbuf[3] == 0) {
sprintf(tmp, "\x1bP1$r%d;%dr\x1b\\", cterm->top_margin, cterm->bottom_margin); sprintf(tmp, "\x1bP1$r%d;%dr\x1b\\", cterm->top_margin, cterm->bottom_margin);
if(strlen(retbuf)+strlen(tmp) < retsize) if(retbuf && strlen(retbuf)+strlen(tmp) < retsize)
strcat(retbuf, tmp); strcat(retbuf, tmp);
} }
break; break;
case 's': case 's':
if (cterm->strbuf[3] == 0) { if (cterm->strbuf[3] == 0) {
sprintf(tmp, "\x1bP1$r%d;%dr\x1b\\", cterm->left_margin, cterm->right_margin); sprintf(tmp, "\x1bP1$r%d;%dr\x1b\\", cterm->left_margin, cterm->right_margin);
if(strlen(retbuf)+strlen(tmp) < retsize) if(retbuf && strlen(retbuf)+strlen(tmp) < retsize)
strcat(retbuf, tmp); strcat(retbuf, tmp);
} }
break; break;
case 't': case 't':
if (cterm->strbuf[3] == 0) { if (cterm->strbuf[3] == 0) {
sprintf(tmp, "\x1bP1$r%dt\x1b\\", cterm->height); sprintf(tmp, "\x1bP1$r%dt\x1b\\", cterm->height);
if(strlen(retbuf)+strlen(tmp) < retsize) if(retbuf && strlen(retbuf)+strlen(tmp) < retsize)
strcat(retbuf, tmp); strcat(retbuf, tmp);
} }
break; break;
case '$': case '$':
if (cterm->strbuf[3] == '|' && cterm->strbuf[4] == 0) { if (cterm->strbuf[3] == '|' && cterm->strbuf[4] == 0) {
sprintf(tmp, "\x1bP1$r%d$|\x1b\\", cterm->width); sprintf(tmp, "\x1bP1$r%d$|\x1b\\", cterm->width);
if(strlen(retbuf)+strlen(tmp) < retsize) if(retbuf && strlen(retbuf)+strlen(tmp) < retsize)
strcat(retbuf, tmp); strcat(retbuf, tmp);
} }
break; break;
case '*': case '*':
if (cterm->strbuf[3] == '|' && cterm->strbuf[4] == 0) { if (cterm->strbuf[3] == '|' && cterm->strbuf[4] == 0) {
sprintf(tmp, "\x1bP1$r%d$|\x1b\\", cterm->height); sprintf(tmp, "\x1bP1$r%d$|\x1b\\", cterm->height);
if(strlen(retbuf)+strlen(tmp) < retsize) if(retbuf && strlen(retbuf)+strlen(tmp) < retsize)
strcat(retbuf, tmp); strcat(retbuf, tmp);
} }
break; break;
...@@ -5519,7 +5519,7 @@ prestel_send_memory(struct cterminal *cterm, uint8_t mem, char *retbuf, size_t r ...@@ -5519,7 +5519,7 @@ prestel_send_memory(struct cterminal *cterm, uint8_t mem, char *retbuf, size_t r
for (int x = 0; x < PRESTEL_MEM_SLOT_SIZE; x++) { for (int x = 0; x < PRESTEL_MEM_SLOT_SIZE; x++) {
if (cterm->prestel_data[mem][x] != '?') { if (cterm->prestel_data[mem][x] != '?') {
app[0] = cterm->prestel_data[mem][x]; app[0] = cterm->prestel_data[mem][x];
if(strlen(retbuf) + 1 < retsize) if(retbuf && strlen(retbuf) + 1 < retsize)
strcat(retbuf, app); strcat(retbuf, app);
} }
} }
...@@ -5603,7 +5603,7 @@ CIOLIBEXPORT size_t cterm_write(struct cterminal * cterm, const void *vbuf, int ...@@ -5603,7 +5603,7 @@ CIOLIBEXPORT size_t cterm_write(struct cterminal * cterm, const void *vbuf, int
*cterm->puttext_can_move=1; *cterm->puttext_can_move=1;
olddmc=*cterm->hold_update; olddmc=*cterm->hold_update;
*cterm->hold_update=1; *cterm->hold_update=1;
if(retbuf!=NULL) if (retbuf)
retbuf[0]=0; retbuf[0]=0;
GETTEXTINFO(&ti); GETTEXTINFO(&ti);
setwindow(cterm); setwindow(cterm);
...@@ -6560,7 +6560,7 @@ CIOLIBEXPORT size_t cterm_write(struct cterminal * cterm, const void *vbuf, int ...@@ -6560,7 +6560,7 @@ CIOLIBEXPORT size_t cterm_write(struct cterminal * cterm, const void *vbuf, int
setfont(orig_fonts[2], FALSE, 3); setfont(orig_fonts[2], FALSE, 3);
setfont(orig_fonts[3], FALSE, 4); setfont(orig_fonts[3], FALSE, 4);
if (retbuf[0]) if (retbuf && retbuf[0])
return strlen(retbuf); return strlen(retbuf);
return 0; return 0;
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment