From 2ec80ad92840df9750e9ad5beed494cb0b202ba9 Mon Sep 17 00:00:00 2001 From: Michael Tokarev Date: Tue, 17 Mar 2026 11:27:18 +0300 Subject: [PATCH] net/slirp: allow hostfwd socket paths with dashes The format of hostfwd parameter is: hostfwd=hostpart-guestaddr:guestport so a minus sign can not be part of the hostpart. If hostpart specifies a unix socket path, this becomes problematic. To solve this, look for the LAST minus/dash char in the string, not first. Unfortunately, [-guestaddr] is optional (defaults to 10.0.0.15), so we still can't parse the thing in an uniform way. Extend get_str_sep() to accept negative separator to indicate searching from the end of buffer, to find the last occurence. Update slirp_hostfwd to search for the last separator when parsing unix domain socket path. Inspired-by: Christopher Palmer-Richez Resolves: https://gitlab.com/qemu-project/qemu/-/issues/347 Signed-off-by: Michael Tokarev --- net/slirp.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/net/slirp.c b/net/slirp.c index a00e0a9651..9e9941fe73 100644 --- a/net/slirp.c +++ b/net/slirp.c @@ -54,7 +54,8 @@ static int get_str_sep(char *buf, int buf_size, const char **pp, int sep) const char *p, *p1; int len; p = *pp; - p1 = strchr(p, sep); + /* negative sep means to search -sep from the end of buf */ + p1 = sep >= 0 ? strchr(p, sep) : strrchr(p, -sep); if (!p1) return -1; len = p1 - p; @@ -848,7 +849,7 @@ static int slirp_hostfwd(SlirpState *s, const char *redir_str, Error **errp) #if !defined(WIN32) && SLIRP_CHECK_VERSION(4, 7, 0) if (is_unix) { - if (get_str_sep(buf, sizeof(buf), &p, '-') < 0) { + if (get_str_sep(buf, sizeof(buf), &p, 0 - '-') < 0) { fail_reason = "Missing - separator"; goto fail_syntax; }