diff --git a/assets/linux-ubuntu-2404.svg b/assets/linux-ubuntu-2404.svg
new file mode 100644
index 0000000..8c389d5
--- /dev/null
+++ b/assets/linux-ubuntu-2404.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 3.886 3.886" height="14.687" width="14.687"><defs><style>@font-face{font-family:"PT Sans Narrow";src:url(data:application/font-woff;charset=utf-8;base64,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) format("woff"); font-weight:normal;font-style:normal;}</style></defs><circle cx="1.943" cy="1.943" r="1.943" fill="#f9f9f9" fill-opacity=".522"/><g transform="matrix(1.48833 0 0 1.48833 901.017 169.1449)"><circle r="1.126" cy="-112.35" cx="-604.071" fill="#fff" paint-order="markers fill stroke"/><path d="M-604.277-111.167c-.26-.05-.475-.16-.662-.354a1.14 1.14 0 0 1-.283-.478 1.2 1.2 0 0 1 .794-1.496c.418-.127.868-.02 1.18.282.2.193.31.405.355.678.09.54-.21 1.075-.723 1.293a1.35 1.35 0 0 1-.661.08zm.715-.347c.08-.07.08-.174 0-.247-.05-.05-.14-.06-.2-.02-.08.05-.103.15-.05.227.03.05.08.08.147.08.05 0 .06 0 .1-.04zm-.37-.145c.03-.01.05-.02.07-.08.04-.09.1-.12.206-.117.08 0 .08 0 .118-.05.08-.1.16-.29.16-.386v-.03h-.24v.04c-.01.06-.05.142-.09.2a.48.48 0 0 1-.5.159c-.04-.01-.07-.01-.07-.01l-.06.103-.05.09.03.02c.09.05.33.08.434.05zm-.467-.207l.06-.1-.06-.06c-.03-.03-.08-.09-.1-.135-.03-.06-.03-.09-.03-.188s0-.125.03-.185c.02-.04.06-.1.09-.136l.06-.07-.06-.1c-.03-.05-.06-.1-.07-.1s-.1.07-.144.123c-.05.06-.117.17-.135.234-.01.05-.01.06.01.08.08.08.07.212 0 .302-.02.03-.01.07.05.185.04.07.19.237.22.237.01 0 .04-.04.07-.1zm-.424-.334c.09-.04.12-.174.05-.252s-.18-.09-.253 0c-.03.03-.04.05-.04.1 0 .13.12.21.237.154zm1.448-.214c0-.1-.06-.26-.148-.37l-.05-.06h-.09c-.08 0-.09 0-.137-.04-.03-.02-.06-.05-.07-.09-.03-.07-.04-.07-.218-.07-.108 0-.15 0-.215.03-.04.02-.09.03-.09.04a1.45 1.45 0 0 0 .109.207l.08-.02a.46.46 0 0 1 .439.114.54.54 0 0 1 .135.246v.05h.12c.117 0 .12 0 .12-.03zm-.18-.526c.106-.1.05-.267-.1-.28-.133-.01-.22.113-.164.234.02.05.04.06.1.08s.12 0 .164-.04z" fill="#ff7f2a"/></g><text xml:space="preserve" x="-613.117" y="-109.556" font-size="1.839" font-family="PT Sans Narrow" letter-spacing="0" word-spacing="0" writing-mode="lr-tb" direction="ltr" dominant-baseline="auto" baseline-shift="baseline"><tspan x="1.58" y="2.65" font-weight="600" font-family="A-OTF Shin Go Pro">f</tspan></text></svg>
\ No newline at end of file
diff --git a/src/power/p-sai.c b/src/power/p-sai.c
index 95cd597..b27bc48 100644
--- a/src/power/p-sai.c
+++ b/src/power/p-sai.c
@@ -266,7 +266,7 @@ local_srv_state(void *userobj, void *sh, lws_ss_constate_t state,
{
local_srv_t *g = (local_srv_t *)userobj;
saip_server_plat_t *sp;
- char *path = NULL;
+ char *path = NULL, pn[128];
size_t len;
lwsl_ss_user(lws_ss_from_user(g), "state %s", lws_ss_state_name(state));
@@ -298,23 +298,26 @@ local_srv_state(void *userobj, void *sh, lws_ss_constate_t state,
g->pos = 0;
- if (!strncmp(path, "/stay/", 6)) {
- sp = find_platform(&path[6]);
+ if (len > 6 && !strncmp(path, "/stay/", 6)) {
+ lws_strnncpy(pn, &path[6], len - 6, sizeof(pn));
+
+ sp = find_platform(pn);
if (sp)
g->size = (size_t)lws_snprintf(g->payload, sizeof(g->payload),
"%c", '0' + sp->stay);
else
g->size = (size_t)lws_snprintf(g->payload, sizeof(g->payload),
- "unknown host %s", &path[6]);
+ "unknown host %s", pn);
goto bail;
}
- if (!strncmp(path, "/power-on/", 10)) {
- sp = find_platform(&path[10]);
+ if (len > 10 && !strncmp(path, "/power-on/", 10)) {
+ lws_strnncpy(pn, &path[10], len - 10, sizeof(pn));
+ sp = find_platform(pn);
if (!sp) {
g->size = (size_t)lws_snprintf(g->payload, sizeof(g->payload),
- "Unable to find host %s", &path[11]);
+ "Unable to find host %s", pn);
goto bail;
}
if (sp->power_on_mac) {
@@ -322,16 +325,16 @@ local_srv_state(void *userobj, void *sh, lws_ss_constate_t state,
sp->power_on_mac, strlen(sp->power_on_mac)) !=
(ssize_t)strlen(sp->power_on_mac))
g->size = (size_t)lws_snprintf(g->payload, sizeof(g->payload),
- "Write to resume %s failed %d", &path[10], errno);
+ "Write to resume %s failed %d", pn, errno);
else
g->size = (size_t)lws_snprintf(g->payload, sizeof(g->payload),
- "Resumed %s with stay", &path[10]);
+ "Resumed %s with stay", pn);
sp->stay = 1;
goto bail;
}
if (!sp->power_on_url) {
g->size = (size_t)lws_snprintf(g->payload, sizeof(g->payload),
- "no power-on-url entry for %s", &path[10]);
+ "no power-on-url entry for %s", pn);
goto bail;
}
if (lws_ss_create(power.context, 0,
@@ -352,20 +355,22 @@ local_srv_state(void *userobj, void *sh, lws_ss_constate_t state,
goto bail;
}
- if (strncmp(path, "/power-off/", 11)) {
+ if (len < 11 || strncmp(path, "/power-off/", 11)) {
g->size = (size_t)lws_snprintf(g->payload, sizeof(g->payload),
"URL path needs to start with /power-off/");
goto bail;
}
+ lws_strnncpy(pn, &path[11], len - 11, sizeof(pn));
+
/*
* Let's have a look at the platform
*/
g->size = (size_t)lws_snprintf(g->payload, sizeof(g->payload),
- "Unable to find host %s", &path[11]);
+ "Unable to find host %s", pn);
- sp = find_platform(&path[11]);
+ sp = find_platform(pn);
if (sp) {
/*
* OK this is it, schedule it to happen