From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 2155) id B3EF23858D1E; Mon, 6 Feb 2023 19:47:30 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org B3EF23858D1E DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1675712850; bh=qVSrFGZJPoTryvVnsBa/655bHS8aHkvJAP6nP/Zl/Bk=; h=To:Subject:Date:From:From; b=crE/qK2/O3rn2j30nS9f7KyRJ/CExl8MyVxkUMiodRvT2hhjyGtOS/becVtFY6HqQ 4TM5YEVNjis1oIHxV2/+tYLb0HQf0owBXu/dnmoYbqO8I6CyARtrcf06Bj/WcyrkbT +AOgUeiABoJ+iUZW+omUXvA5QVGcXE7ELxecrNV4= To: cygwin-apps-cvs@sourceware.org Subject: [cygrunsrv - a wrapper for unix daemons to make them controllable as windows services] branch master, updated. 405add89a98ee2c995c38dbbc47c8b95a2d721d8 X-Git-Refname: refs/heads/master X-Git-Reftype: branch X-Git-Oldrev: 9be82487e5f9eb0dfc102f3c702923c95521d0bc X-Git-Newrev: 405add89a98ee2c995c38dbbc47c8b95a2d721d8 Message-Id: <20230206194730.B3EF23858D1E@sourceware.org> Date: Mon, 6 Feb 2023 19:47:30 +0000 (GMT) From: Corinna Vinschen List-Id: https://sourceware.org/git/gitweb.cgi?p=cygwin-apps/cygrunsrv.git;h=405add89a98ee2c995c38dbbc47c8b95a2d721d8 commit 405add89a98ee2c995c38dbbc47c8b95a2d721d8 Author: Corinna Vinschen Date: Mon Feb 6 20:43:38 2023 +0100 handle quoted service paths sanely Diff: --- cygrunsrv.cc | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/cygrunsrv.cc b/cygrunsrv.cc index d6fd76008e51..7b550221d191 100644 --- a/cygrunsrv.cc +++ b/cygrunsrv.cc @@ -1506,16 +1506,31 @@ list_services (const char *server, bool verbose) } if (!QueryServiceConfig (sh, qsc_buf, QSC_BUF_SIZE, &bytes_needed)) - fprintf (stderr, "%s: warning: QueryServiceConfig failed for '%s': " - "Win32 error %u\n%s", appname, srv_buf[i].lpServiceName, - (unsigned) GetLastError (), winerror (GetLastError ())); + { + fprintf (stderr, "%s: warning: QueryServiceConfig failed for '%s': " + "Win32 error %u\n%s", appname, srv_buf[i].lpServiceName, + (unsigned) GetLastError (), winerror (GetLastError ())); + CloseServiceHandle (sh); + sh = (SC_HANDLE) 0; + continue; + } + /* The path might be quoted. Drop the quotes. */ + char service_path[strlen (qsc_buf->lpBinaryPathName) + 1]; + char *endptr = stpcpy (service_path, qsc_buf->lpBinaryPathName[0] == '"' + ? qsc_buf->lpBinaryPathName + 1 + : qsc_buf->lpBinaryPathName); +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wstringop-overflow" + if (endptr > service_path && endptr[-1] == '"') + endptr[-1] = '\0'; +#pragma GCC diagnostic pop /* is this us? */ - else if (same_filename (qsc_buf->lpBinaryPathName, mypath)) - { + if (same_filename (service_path, mypath)) + { if (!verbose) { - if (strcasecmp (qsc_buf->lpBinaryPathName, mypath)) + if (strcasecmp (service_path, mypath)) printf ("(%s)\n", srv_buf[i].lpServiceName); else printf ("%s\n", srv_buf[i].lpServiceName);