mirror of
https://github.com/Cloudef/bemenu
synced 2025-02-19 16:26:47 +00:00
Fix out of bound access, and provide better tokenize api.
This commit is contained in:
parent
e738ae1772
commit
d54381f009
@ -28,13 +28,15 @@ static void readItemsToMenuFromStdin(bmMenu *menu)
|
||||
size_t pos;
|
||||
char *s = buffer;
|
||||
while ((pos = strcspn(s, "\n")) != 0) {
|
||||
size_t next = pos + (s[pos] != 0);
|
||||
s[pos] = 0;
|
||||
|
||||
bmItem *item = bmItemNew(s);
|
||||
if (!item)
|
||||
break;
|
||||
|
||||
bmMenuAddItem(menu, item);
|
||||
s += pos + 1;
|
||||
s += next;
|
||||
}
|
||||
|
||||
free(buffer);
|
||||
|
@ -54,15 +54,15 @@ static char* _bmFilterTokenize(bmMenu *menu, char ***outTokv, unsigned int *outT
|
||||
if (!(buffer = _bmStrdup(menu->filter)))
|
||||
goto fail;
|
||||
|
||||
size_t pos = 0;
|
||||
size_t pos = 0, next;
|
||||
unsigned int tokc = 0, tokn = 0;
|
||||
char *s = buffer, **tmp = NULL;
|
||||
while ((pos = _bmStripToken(s, " ")) != 0) {
|
||||
while ((pos = _bmStripToken(s, " ", &next)) > 0) {
|
||||
if (++tokc > tokn && !(tmp = realloc(tmp, ++tokn * sizeof(char*))))
|
||||
goto fail;
|
||||
|
||||
tmp[tokc - 1] = s;
|
||||
s += pos + 1;
|
||||
s += next;
|
||||
}
|
||||
|
||||
*outTokv = tmp;
|
||||
|
@ -163,7 +163,7 @@ int _bmItemListRemoveItem(struct _bmItemList *list, const bmItem *item);
|
||||
|
||||
/* util.c */
|
||||
char* _bmStrdup(const char *s);
|
||||
size_t _bmStripToken(char *string, const char *token);
|
||||
size_t _bmStripToken(char *string, const char *token, size_t *outNext);
|
||||
int _bmStrupcmp(const char *hay, const char *needle);
|
||||
int _bmStrnupcmp(const char *hay, const char *needle, size_t len);
|
||||
char* _bmStrupstr(const char *hay, const char *needle);
|
||||
|
@ -34,11 +34,16 @@ char* _bmStrdup(const char *string)
|
||||
* Replaces next token in string with '\0' and returns position for the replaced token.
|
||||
*
|
||||
* @param string C "string" where token will be replaced.
|
||||
* @param outNext Reference to position of next delimiter, or 0 if none.
|
||||
* @return Position of the replaced token.
|
||||
*/
|
||||
size_t _bmStripToken(char *string, const char *token)
|
||||
size_t _bmStripToken(char *string, const char *token, size_t *outNext)
|
||||
{
|
||||
size_t len = strcspn(string, token);
|
||||
|
||||
if (outNext)
|
||||
*outNext = len + (string[len] != 0);
|
||||
|
||||
string[len] = 0;
|
||||
return len;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user