1
0
mirror of https://github.com/Tha14/toxic.git synced 2024-11-26 16:43:27 +01:00

fix memory leaks and safer way to convert strings from wc to mb

This commit is contained in:
Jfreegman 2013-12-08 04:16:49 -05:00
parent e834821348
commit df57adcc6d
5 changed files with 55 additions and 29 deletions

View File

@ -362,7 +362,11 @@ static void chat_onKey(ToxWindow *self, Tox *m, wint_t key)
} }
/* RETURN key: Execute command or print line */ /* RETURN key: Execute command or print line */
else if (key == '\n') { else if (key == '\n') {
uint8_t *line = wcs_to_char(ctx->line); uint8_t line[MAX_STR_SIZE];
if (wcs_to_mbs_buf(line, ctx->line, MAX_STR_SIZE) == -1)
memset(&line, 0, sizeof(line));
wclear(ctx->linewin); wclear(ctx->linewin);
wmove(self->window, y2 - CURS_Y_OFFSET, 0); wmove(self->window, y2 - CURS_Y_OFFSET, 0);
wclrtobot(self->window); wclrtobot(self->window);
@ -412,8 +416,6 @@ static void chat_onKey(ToxWindow *self, Tox *m, wint_t key)
} else { } else {
reset_buf(ctx->line, &ctx->pos, &ctx->len); reset_buf(ctx->line, &ctx->pos, &ctx->len);
} }
free(line);
} }
} }
@ -426,7 +428,13 @@ static void chat_onDraw(ToxWindow *self, Tox *m)
ChatContext *ctx = self->chatwin; ChatContext *ctx = self->chatwin;
wclear(ctx->linewin); wclear(ctx->linewin);
mvwprintw(ctx->linewin, 1, 0, "%s", wcs_to_char(ctx->line));
uint8_t line[MAX_STR_SIZE];
if (wcs_to_mbs_buf(line, ctx->line, MAX_STR_SIZE) == -1)
memset(&line, 0, sizeof(line));
mvwprintw(ctx->linewin, 1, 0, "%s", line);
/* Draw status bar */ /* Draw status bar */
StatusBar *statusbar = self->stb; StatusBar *statusbar = self->stb;

View File

@ -313,7 +313,7 @@ static void groupchat_onKey(ToxWindow *self, Tox *m, wint_t key)
int diff = complete_line(ctx->line, &ctx->pos, &ctx->len, groupchats[self->num].peer_names, int diff = complete_line(ctx->line, &ctx->pos, &ctx->len, groupchats[self->num].peer_names,
groupchats[self->num].num_peers, TOX_MAX_NAME_LENGTH); groupchats[self->num].num_peers, TOX_MAX_NAME_LENGTH);
if (diff != -1 && (ctx->len < (x2 * (CHATBOX_HEIGHT - 1)-1))) { if (diff != -1) {
if (x + diff > x2 - 1) { if (x + diff > x2 - 1) {
int ofst = (x + diff - 1) - (x2 - 1); int ofst = (x + diff - 1) - (x2 - 1);
wmove(self->window, y+1, ofst); wmove(self->window, y+1, ofst);
@ -356,7 +356,11 @@ static void groupchat_onKey(ToxWindow *self, Tox *m, wint_t key)
/* RETURN key: Execute command or print line */ /* RETURN key: Execute command or print line */
else if (key == '\n') { else if (key == '\n') {
uint8_t *line = wcs_to_char(ctx->line); uint8_t line[MAX_STR_SIZE];
if (wcs_to_mbs_buf(line, ctx->line, MAX_STR_SIZE) == -1)
memset(&line, 0, sizeof(line));
wclear(ctx->linewin); wclear(ctx->linewin);
wmove(self->window, y2 - CURS_Y_OFFSET, 0); wmove(self->window, y2 - CURS_Y_OFFSET, 0);
wclrtobot(self->window); wclrtobot(self->window);
@ -398,8 +402,6 @@ static void groupchat_onKey(ToxWindow *self, Tox *m, wint_t key)
else { else {
reset_buf(ctx->line, &ctx->pos, &ctx->len); reset_buf(ctx->line, &ctx->pos, &ctx->len);
} }
free(line);
} }
} }
@ -412,7 +414,13 @@ static void groupchat_onDraw(ToxWindow *self, Tox *m)
ChatContext *ctx = self->chatwin; ChatContext *ctx = self->chatwin;
wclear(ctx->linewin); wclear(ctx->linewin);
mvwprintw(ctx->linewin, 1, 0, "%s", wcs_to_char(ctx->line));
uint8_t line[MAX_STR_SIZE];
if (wcs_to_mbs_buf(line, ctx->line, MAX_STR_SIZE) == -1)
memset(&line, 0, sizeof(line));
mvwprintw(ctx->linewin, 1, 0, "%s", line);
wclear(ctx->sidebar); wclear(ctx->sidebar);
mvwhline(ctx->linewin, 0, 0, ACS_HLINE, x2); mvwhline(ctx->linewin, 0, 0, ACS_HLINE, x2);

View File

@ -72,8 +72,8 @@ int char_to_wcs_buf(wchar_t *buf, const uint8_t *string, size_t n)
} }
/* converts wide character string into a multibyte string. /* converts wide character string into a multibyte string.
Same thing as wcs_to_char() but caller must provide its own buffer */ Same thing as wcs_to_mbs() but caller must provide its own buffer */
int wcs_to_char_buf(uint8_t *buf, const wchar_t *string, size_t n) int wcs_to_mbs_buf(uint8_t *buf, const wchar_t *string, size_t n)
{ {
size_t len = wcstombs(NULL, string, 0) + 1; size_t len = wcstombs(NULL, string, 0) + 1;
@ -86,8 +86,8 @@ int wcs_to_char_buf(uint8_t *buf, const wchar_t *string, size_t n)
return len; return len;
} }
/* convert wide characters to multibyte string */ /* convert wide characters to multibyte string: string returned must be free'd */
uint8_t *wcs_to_char(wchar_t *string) uint8_t *wcs_to_mbs(wchar_t *string)
{ {
uint8_t *ret = NULL; uint8_t *ret = NULL;
size_t len = wcstombs(NULL, string, 0); size_t len = wcstombs(NULL, string, 0);
@ -270,12 +270,12 @@ void reset_buf(wchar_t *buf, size_t *pos, size_t *len)
/* looks for the first instance in list that begins with the last entered word in buf according to pos, /* looks for the first instance in list that begins with the last entered word in buf according to pos,
then fills buf with the complete word. e.g. "Hello jo" would complete the buffer then fills buf with the complete word. e.g. "Hello jo" would complete the buffer
with "Hello john". It shouldn't matter where pos is within buf. with "Hello john".
list is a pointer to the list of strings being compared, n_items is the number of items list is a pointer to the list of strings being compared, n_items is the number of items
in the list, and size is the size of each item in the list. in the list, and size is the size of each item in the list.
Returns the difference between the old len and new len of buf */ Returns the difference between the old len and new len of buf on success, -1 if error */
int complete_line(wchar_t *buf, size_t *pos, size_t *len, const uint8_t *list, int n_items, int size) int complete_line(wchar_t *buf, size_t *pos, size_t *len, const uint8_t *list, int n_items, int size)
{ {
if (*pos <= 0 || *len <= 0 || *len > MAX_STR_SIZE) if (*pos <= 0 || *len <= 0 || *len > MAX_STR_SIZE)
@ -283,7 +283,7 @@ int complete_line(wchar_t *buf, size_t *pos, size_t *len, const uint8_t *list, i
uint8_t ubuf[MAX_STR_SIZE]; uint8_t ubuf[MAX_STR_SIZE];
/* work with multibyte string copy of buf for simplicity */ /* work with multibyte string copy of buf for simplicity */
if (wcs_to_char_buf(ubuf, buf, MAX_STR_SIZE) == -1) if (wcs_to_mbs_buf(ubuf, buf, MAX_STR_SIZE) == -1)
return -1; return -1;
/* isolate substring from space behind pos to pos */ /* isolate substring from space behind pos to pos */
@ -325,11 +325,11 @@ int complete_line(wchar_t *buf, size_t *pos, size_t *len, const uint8_t *list, i
if (char_to_wcs_buf(newbuf, ubuf, MAX_STR_SIZE) == -1) if (char_to_wcs_buf(newbuf, ubuf, MAX_STR_SIZE) == -1)
return -1; return -1;
wmemcpy(buf, newbuf, MAX_STR_SIZE);
int diff = m_len - s_len; int diff = m_len - s_len;
*len += (size_t) diff; *len += (size_t) diff;
*pos += (size_t) diff; *pos += (size_t) diff;
wmemcpy(buf, newbuf, MAX_STR_SIZE);
return diff; return diff;
} }

View File

@ -20,13 +20,13 @@ int string_is_empty(char *string);
int char_to_wcs_buf(wchar_t *buf, const uint8_t *string, size_t n); int char_to_wcs_buf(wchar_t *buf, const uint8_t *string, size_t n);
/* converts wide character string into a multibyte string. /* converts wide character string into a multibyte string.
Same thing as wcs_to_char() but caller must provide its own buffer */ Same thing as wcs_to_mbs() but caller must provide its own buffer */
int wcs_to_char_buf(uint8_t *buf, const wchar_t *string, size_t n); int wcs_to_mbs_buf(uint8_t *buf, const wchar_t *string, size_t n);
/* convert wide characters to multibyte string string */ /* convert wide characters to multibyte string: string returned must be free'd */
uint8_t *wcs_to_char(wchar_t *string); uint8_t *wcs_to_mbs(wchar_t *string);
/* convert a wide char to multibyte string string */ /* convert a wide char to multibyte char */
char *wc_to_char(wchar_t ch); char *wc_to_char(wchar_t ch);
/* Returns true if connection has timed out, false otherwise */ /* Returns true if connection has timed out, false otherwise */
@ -66,11 +66,12 @@ void kill_buf(wchar_t *buf, size_t *pos, size_t *len);
/* nulls buf and sets pos and len to 0 */ /* nulls buf and sets pos and len to 0 */
void reset_buf(wchar_t *buf, size_t *pos, size_t *len); void reset_buf(wchar_t *buf, size_t *pos, size_t *len);
/* looks for the first instance in list that begins with the last entered word in buf, /* looks for the first instance in list that begins with the last entered word in buf according to pos,
then completes the word. e.g. "Hello jo" would complete the buffer with "Hello john". then fills buf with the complete word. e.g. "Hello jo" would complete the buffer
with "Hello john".
list is a pointer to the list of strings being compared, n_items is the number of items list is a pointer to the list of strings being compared, n_items is the number of items
in the list, and size is the size of each item in the list. in the list, and size is the size of each item in the list.
Returns the difference between the old len and new len of buf */ Returns the difference between the old len and new len of buf on success, -1 if error */
int complete_line(wchar_t *buf, size_t *pos, size_t *len, const uint8_t *list, int n_items, int size); int complete_line(wchar_t *buf, size_t *pos, size_t *len, const uint8_t *list, int n_items, int size);

View File

@ -159,7 +159,11 @@ static void prompt_onKey(ToxWindow *self, Tox *m, wint_t key)
/* RETURN key: execute command */ /* RETURN key: execute command */
else if (key == '\n') { else if (key == '\n') {
wprintw(self->window, "\n"); wprintw(self->window, "\n");
uint8_t *line = wcs_to_char(prt->line); uint8_t line[MAX_STR_SIZE];
if (wcs_to_mbs_buf(line, prt->line, MAX_STR_SIZE) == -1)
memset(&line, 0, sizeof(line));
execute(self->window, self, m, line, GLOBAL_COMMAND_MODE); execute(self->window, self, m, line, GLOBAL_COMMAND_MODE);
reset_buf(prt->line, &prt->pos, &prt->len); reset_buf(prt->line, &prt->pos, &prt->len);
} }
@ -185,7 +189,12 @@ static void prompt_onDraw(ToxWindow *self, Tox *m)
int p_ofst = px2 != x2 ? 0 : X_OFST; int p_ofst = px2 != x2 ? 0 : X_OFST;
if (prt->len > 0) { if (prt->len > 0) {
mvwprintw(self->window, prt->orig_y, X_OFST, wcs_to_char(prt->line)); uint8_t line[MAX_STR_SIZE];
if (wcs_to_mbs_buf(line, prt->line, MAX_STR_SIZE) == -1)
memset(&line, 0, sizeof(line));
mvwprintw(self->window, prt->orig_y, X_OFST, line);
int k = prt->orig_y + ((prt->len + p_ofst) / px2); int k = prt->orig_y + ((prt->len + p_ofst) / px2);