switch to strtok_r for comma-separator urls
this avoids an infinite loop when there is an invalid hint number
This commit is contained in:
parent
4f515865f6
commit
eb6389e042
23
termite.cc
23
termite.cc
|
@ -136,24 +136,21 @@ static void launch_url(const char *text, search_panel_info *info) {
|
|||
char *end;
|
||||
errno = 0;
|
||||
|
||||
while (true) {
|
||||
unsigned long id = strtoul(text, &end, 10);
|
||||
std::unique_ptr<char, decltype(&free)> copy(strdup(text), free);
|
||||
for (char *s_ptr = copy.get(), *saveptr; ; s_ptr = nullptr) {
|
||||
const char *token = strtok_r(s_ptr, ",", &saveptr);
|
||||
if (!token) {
|
||||
break;
|
||||
}
|
||||
|
||||
if (!errno && end != text) {
|
||||
if (id <= info->url_list.size())
|
||||
unsigned long id = strtoul(token, &end, 10);
|
||||
if (!errno && end != text && id && id <= info->url_list.size()) {
|
||||
launch_browser(info->url_list[id - 1].url.get());
|
||||
|
||||
switch (*end) {
|
||||
case ',':
|
||||
text = end + 1;
|
||||
continue;
|
||||
case '\0':
|
||||
return;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
g_printerr("url hint invalid: %s\n", text);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void draw_marker(cairo_t *cr, const char *font, long x, long y, int padding, unsigned id) {
|
||||
char buffer[std::numeric_limits<unsigned>::digits10 + 1];
|
||||
|
|
Loading…
Reference in New Issue