From 735972b4c681efeff3c4137816cb913174a839be Mon Sep 17 00:00:00 2001 From: Jonathan Lebon Date: Mon, 2 Dec 2013 11:17:05 -0500 Subject: [PATCH 1/2] Resolves: #1035752 Upstream commit e7d52b3. --- csclient.cxx | 2 +- stap-serverd.cxx | 34 ++++++++++++++++++---------------- 2 files changed, 19 insertions(+), 17 deletions(-) diff --git a/csclient.cxx b/csclient.cxx index cce5428..4cfeb08 100644 --- a/csclient.cxx +++ b/csclient.cxx @@ -829,7 +829,7 @@ compile_server_client::passes_0_4 () << TIMESPRINT << endl; } - if (rc) + if (rc && !s.listing_mode) { clog << _("Passes: via server failed. Try again with another '-v' option.") << endl; } diff --git a/stap-serverd.cxx b/stap-serverd.cxx index 53a8d3a..035d06c 100644 --- a/stap-serverd.cxx +++ b/stap-serverd.cxx @@ -63,7 +63,7 @@ extern "C" { using namespace std; static void cleanup (); -static PRStatus spawn_and_wait (const vector &argv, +static PRStatus spawn_and_wait (const vector &argv, int *result, const char* fd0, const char* fd1, const char* fd2, const char *pwd, const vector& envVec = vector ()); @@ -1234,18 +1234,19 @@ handleRequest (const string &requestDirName, const string &responseDirName, stri get_stap_locale (staplang, envVec, stapstderr, &client_version); /* All ready, let's run the translator! */ - rc = spawn_and_wait(stapargv, "/dev/null", stapstdout.c_str (), stapstderr.c_str (), - requestDirName.c_str (), envVec); + int staprc; + rc = spawn_and_wait(stapargv, &staprc, "/dev/null", stapstdout.c_str (), + stapstderr.c_str (), requestDirName.c_str (), envVec); + if (rc != PR_SUCCESS) + { + server_error(_("Failed spawning translator")); + return; + } /* Save the RC */ - string staprc = responseDirName + "/rc"; - f = fopen(staprc.c_str (), "w"); - if (f) - { - /* best effort basis */ - fprintf(f, "%d", rc); - fclose(f); - } + ofstream ofs((responseDirName + "/rc").c_str()); + ofs << staprc; + ofs.close(); // In unprivileged modes, if we have a module built, we need to sign the sucker. privilege_t privilege = getRequestedPrivilege (stapargv); @@ -1316,7 +1317,7 @@ handleRequest (const string &requestDirName, const string &responseDirName, stri /* A front end for stap_spawn that handles stdin, stdout, stderr, switches to a working directory and returns overall success or failure. */ static PRStatus -spawn_and_wait (const vector &argv, +spawn_and_wait (const vector &argv, int *spawnrc, const char* fd0, const char* fd1, const char* fd2, const char *pwd, const vector& envVec) { @@ -1380,8 +1381,8 @@ spawn_and_wait (const vector &argv, return PR_FAILURE; } - rc = stap_waitpid (0, pid); - if (rc == -1) + *spawnrc = stap_waitpid (0, pid); + if (*spawnrc == -1) { server_error (_("Error in waitpid")); return PR_FAILURE; @@ -1540,14 +1541,15 @@ handle_connection (void *arg) handleRequest(requestDirName, responseDirName, stapstderr); /* Zip the response. */ + int ziprc; argv.clear (); argv.push_back ("zip"); argv.push_back ("-q"); argv.push_back ("-r"); argv.push_back (responseFileName); argv.push_back ("."); - rc = spawn_and_wait (argv, NULL, NULL, NULL, responseDirName); - if (rc != PR_SUCCESS) + rc = spawn_and_wait (argv, &ziprc, NULL, NULL, NULL, responseDirName); + if (rc != PR_SUCCESS || ziprc != 0) { server_error (_("Unable to compress server response")); goto cleanup; -- 1.8.3.1