From 4cc079b6b63b4a37072e5d408a5fce1988561754 Mon Sep 17 00:00:00 2001
From: Přemysl Janouch
Date: Sun, 29 Jan 2017 18:18:58 +0100
Subject: Fix segfault on insufficient privileges
---
nncmpp.c | 31 ++++++++++++++++---------------
1 file changed, 16 insertions(+), 15 deletions(-)
diff --git a/nncmpp.c b/nncmpp.c
index 0b651ac..5051f78 100644
--- a/nncmpp.c
+++ b/nncmpp.c
@@ -811,6 +811,10 @@ app_init_context (void)
strv_init (&g.streams);
item_list_init (&g.playlist);
+ str_map_init (&g.playback_info);
+ g.playback_info.key_xfrm = tolower_ascii_strxfrm;
+ g.playback_info.free = free;
+
// This is also approximately what libunistring does internally,
// since the locale name is canonicalized by locale_charset().
// Note that non-Unicode locales are handled pretty inefficiently.
@@ -2581,10 +2585,7 @@ mpd_update_playback_state (void)
static void
mpd_process_info (const struct strv *data)
{
- struct str_map map;
- str_map_init (&map);
- map.key_xfrm = tolower_ascii_strxfrm;
- map.free = free;
+ struct str_map *map = &g.playback_info;
// First there's the status, followed by playlist items chunked by "file"
unsigned long n; char *key, *value;
@@ -2595,26 +2596,26 @@ mpd_process_info (const struct strv *data)
if (!strcasecmp_ascii (key, "playlistlength")
&& xstrtoul (&n, value, 10))
item_list_resize (&g.playlist, n);
- str_map_set (&map, key, xstrdup (value));
+ str_map_set (map, key, xstrdup (value));
}
- g.playback_info = map;
// It's much better to process the playlist from the back
- str_map_init (&map);
- map.key_xfrm = tolower_ascii_strxfrm;
+ struct str_map item;
+ str_map_init (&item);
+ item.key_xfrm = tolower_ascii_strxfrm;
for (size_t i = data->len - 1; i-- && data->vector[i]; )
{
if (!(key = mpd_parse_kv (data->vector[i], &value)))
continue;
- str_map_set (&map, key, value);
+ str_map_set (&item, key, value);
if (!strcasecmp_ascii (key, "file"))
{
- if (xstrtoul_map (&map, "pos", &n))
- item_list_set (&g.playlist, n, &map);
- str_map_clear (&map);
+ if (xstrtoul_map (&item, "pos", &n))
+ item_list_set (&g.playlist, n, &item);
+ str_map_clear (&item);
}
}
- str_map_free (&map);
+ str_map_free (&item);
}
static void
@@ -2624,7 +2625,7 @@ mpd_on_info_response (const struct mpd_response *response,
(void) user_data;
// TODO: preset an error player state?
- str_map_free (&g.playback_info);
+ str_map_clear (&g.playback_info);
if (!response->success)
print_debug ("%s: %s",
"retrieving MPD info failed", response->message_text);
@@ -2742,7 +2743,7 @@ mpd_on_failure (void *user_data)
mpd_queue_reconnect ();
item_list_resize (&g.playlist, 0);
- str_map_free (&g.playback_info);
+ str_map_clear (&g.playback_info);
mpd_update_playback_state ();
current_tab_update ();
--
cgit v1.2.3-70-g09d2