[mapplauncherd] Cleanup compilation warnings

Comparing signed vs unsigned integers.

Unused static data.

Questionable variable declarations.

Const correctness issues.

Unchecked socket and pipe i/o.

Unchecked chdir() call.

String sender that silently skips null strings while protocol does
not make it possible for receiver to detect such omissions.

Signed-off-by: Simo Piiroinen <simo.piiroinen@jolla.com>
pull/1/head
Simo Piiroinen 5 years ago
parent 9970c11190
commit 66db6e7063

@ -1,6 +1,8 @@
/*************************************************************************** /***************************************************************************
** **
** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
** Copyright (c) 2021 Open Mobile Platform LLC.
** Copyright (c) 2021 Jolla Ltd.
** All rights reserved. ** All rights reserved.
** Contact: Nokia Corporation (directui@nokia.com) ** Contact: Nokia Corporation (directui@nokia.com)
** **
@ -46,7 +48,7 @@ extern void report(enum report_type type, const char *msg, ...);
#ifndef DEBUG_LOGGING_DISABLED #ifndef DEBUG_LOGGING_DISABLED
#define debug(msg, ...) report(report_debug, msg, ##__VA_ARGS__) #define debug(msg, ...) report(report_debug, msg, ##__VA_ARGS__)
#else #else
#define debug(...) #define debug(...) do {} while (0)
#endif #endif
#define info(msg, ...) report(report_info, msg, ##__VA_ARGS__) #define info(msg, ...) report(report_info, msg, ##__VA_ARGS__)

@ -1,6 +1,8 @@
/*************************************************************************** /***************************************************************************
** **
** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
** Copyright (c) 2021 Open Mobile Platform LLC.
** Copyright (c) 2021 Jolla Ltd.
** All rights reserved. ** All rights reserved.
** Contact: Nokia Corporation (directui@nokia.com) ** Contact: Nokia Corporation (directui@nokia.com)
** **
@ -26,10 +28,21 @@
#include "report.h" #include "report.h"
#include "invokelib.h" #include "invokelib.h"
static void invoke_send_or_die(int fd, const void *data, size_t size)
{
if (write(fd, data, size) != (ssize_t)size) {
const char m[] = "*** socket write failure, terminating\n";
if (write(STDERR_FILENO, m, sizeof m - 1) == -1) {
// dontcare
}
_exit(EXIT_FAILURE);
}
}
void invoke_send_msg(int fd, uint32_t msg) void invoke_send_msg(int fd, uint32_t msg)
{ {
debug("%s: %08x\n", __FUNCTION__, msg); debug("%s: %08x\n", __FUNCTION__, msg);
write(fd, &msg, sizeof(msg)); invoke_send_or_die(fd, &msg, sizeof(msg));
} }
bool invoke_recv_msg(int fd, uint32_t *msg) bool invoke_recv_msg(int fd, uint32_t *msg)
@ -58,20 +71,17 @@ bool invoke_recv_msg(int fd, uint32_t *msg)
} }
} }
void invoke_send_str(int fd, char *str) void invoke_send_str(int fd, const char *str)
{ {
if (str) if (!str)
{ str = "";
uint32_t size; uint32_t size = strlen(str) + 1;
/* Send size. */ /* Send size. */
size = strlen(str) + 1; invoke_send_msg(fd, size);
invoke_send_msg(fd, size);
debug("%s: '%s'\n", __FUNCTION__, str); debug("%s: '%s'\n", __FUNCTION__, str);
/* Send the string. */ /* Send the string. */
write(fd, str, size); invoke_send_or_die(fd, str, size);
}
} }

@ -1,6 +1,8 @@
/*************************************************************************** /***************************************************************************
** **
** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
** Copyright (c) 2012 - 2021 Jolla Ltd.
** Copyright (c) 2021 Open Mobile Platform LLC.
** All rights reserved. ** All rights reserved.
** Contact: Nokia Corporation (directui@nokia.com) ** Contact: Nokia Corporation (directui@nokia.com)
** **
@ -25,7 +27,7 @@
void invoke_send_msg(int fd, uint32_t msg); void invoke_send_msg(int fd, uint32_t msg);
bool invoke_recv_msg(int fd, uint32_t *msg); bool invoke_recv_msg(int fd, uint32_t *msg);
void invoke_send_str(int fd, char *str); void invoke_send_str(int fd, const char *str);
// Existence of the test mode control file is checked // Existence of the test mode control file is checked
// to enable test mode. // to enable test mode.

@ -1,6 +1,8 @@
/*************************************************************************** /***************************************************************************
** **
** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
** Copyright (c) 2012 - 2021 Jolla Ltd.
** Copyright (c) 2021 Open Mobile Platform LLC.
** All rights reserved. ** All rights reserved.
** Contact: Nokia Corporation (directui@nokia.com) ** Contact: Nokia Corporation (directui@nokia.com)
** **
@ -55,7 +57,6 @@ static const unsigned int RESPAWN_DELAY = 1;
static const unsigned int MIN_RESPAWN_DELAY = 0; static const unsigned int MIN_RESPAWN_DELAY = 0;
static const unsigned int MAX_RESPAWN_DELAY = 10; static const unsigned int MAX_RESPAWN_DELAY = 10;
static const unsigned char EXIT_STATUS_APPLICATION_CONNECTION_LOST = 0xfa;
static const unsigned char EXIT_STATUS_APPLICATION_NOT_FOUND = 0x7f; static const unsigned char EXIT_STATUS_APPLICATION_NOT_FOUND = 0x7f;
// Environment // Environment
@ -99,7 +100,8 @@ static void sig_forwarder(int sig)
// Write signal number to the self-pipe // Write signal number to the self-pipe
char signal_id = (char) sig; char signal_id = (char) sig;
write(g_signal_pipe[1], &signal_id, 1); if (write(g_signal_pipe[1], &signal_id, 1) != 1)
_exit(EXIT_FAILURE);
// Send the signal to itself using the default handler // Send the signal to itself using the default handler
raise(sig); raise(sig);
@ -208,7 +210,7 @@ static int invoker_init(const char *app_type)
strcat(sun.sun_path, subpath); strcat(sun.sun_path, subpath);
maxSize -= strlen(sun.sun_path); maxSize -= strlen(sun.sun_path);
if (maxSize < strlen(app_type) || strchr(app_type, '/')) if (maxSize < (int)strlen(app_type) || strchr(app_type, '/'))
die(1, "Invalid type of application: %s\n", app_type); die(1, "Invalid type of application: %s\n", app_type);
strcat(sun.sun_path, app_type); strcat(sun.sun_path, app_type);
@ -274,7 +276,7 @@ static void invoker_send_magic(int fd, uint32_t options)
} }
// Sends the process name to be invoked. // Sends the process name to be invoked.
static void invoker_send_name(int fd, char *name) static void invoker_send_name(int fd, const char *name)
{ {
invoke_send_msg(fd, INVOKER_MSG_NAME); invoke_send_msg(fd, INVOKER_MSG_NAME);
invoke_send_str(fd, name); invoke_send_str(fd, name);
@ -546,7 +548,8 @@ static int wait_for_launched_process_to_exit(int socket_fd, bool wait_term)
{ {
// Clean up the pipe // Clean up the pipe
char signal_id; char signal_id;
read(g_signal_pipe[0], &signal_id, sizeof(signal_id)); if (read(g_signal_pipe[0], &signal_id, 1) != 1)
exit(EXIT_FAILURE);
// Set signals forwarding to the invoked process again // Set signals forwarding to the invoked process again
// (they were reset by the signal forwarder). // (they were reset by the signal forwarder).

@ -1,8 +1,8 @@
/*************************************************************************** /***************************************************************************
** **
** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
** Copyright (C) 2013 - 2021 Jolla Ltd. ** Copyright (c) 2013 - 2021 Jolla Ltd.
** Copyright (C) 2018 - 2020 Open Mobile Platform LLC. ** Copyright (c) 2018 - 2021 Open Mobile Platform LLC.
** All rights reserved. ** All rights reserved.
** Contact: Nokia Corporation (directui@nokia.com) ** Contact: Nokia Corporation (directui@nokia.com)
** **
@ -478,7 +478,16 @@ void Booster::setEnvironmentBeforeLaunch()
// Set PWD // Set PWD
const char * pwd = getenv("PWD"); const char * pwd = getenv("PWD");
if (pwd) chdir(pwd); if (pwd) {
if (chdir(pwd) == -1) {
Logger::logWarning("Booster: chdir(\"%s\") failed: %m", pwd);
pwd = "/";
if (chdir(pwd) == -1) {
Logger::logWarning("Booster: chdir(\"%s\") failed: %m", pwd);
exit(EXIT_FAILURE);
}
}
}
Logger::logDebug("Booster: launching process: '%s' ", m_appData->fileName().c_str()); Logger::logDebug("Booster: launching process: '%s' ", m_appData->fileName().c_str());
} }

@ -1,7 +1,8 @@
/*************************************************************************** /***************************************************************************
** **
** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
** Copyright (C) 2021 Jolla Ltd. ** Copyright (c) 2021 Jolla Ltd.
** Copyright (c) 2021 Open Mobile Platform LLC.
** All rights reserved. ** All rights reserved.
** Contact: Nokia Corporation (directui@nokia.com) ** Contact: Nokia Corporation (directui@nokia.com)
** **
@ -620,7 +621,7 @@ std::string Connection::getExecutablePath(pid_t pid)
static_assert(sizeof(INVOKER_PATH) < sizeof(exe)); static_assert(sizeof(INVOKER_PATH) < sizeof(exe));
path << "/proc/" << pid << "/exe"; path << "/proc/" << pid << "/exe";
len = readlink(path.str().c_str(), exe, sizeof(exe)); len = readlink(path.str().c_str(), exe, sizeof(exe));
if (len < 0 || len >= sizeof(exe)) if (len < 0 || (size_t)len >= sizeof(exe))
{ {
Logger::logError("Connection: %s: readlink failed for pid %d: %s", __FUNCTION__, pid, strerror(errno)); Logger::logError("Connection: %s: readlink failed for pid %d: %s", __FUNCTION__, pid, strerror(errno));
return std::string(); return std::string();

@ -1,8 +1,8 @@
/*************************************************************************** /***************************************************************************
** **
** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
** Copyright (C) 2013 - 2021 Jolla Ltd. ** Copyright (c) 2013 - 2021 Jolla Ltd.
** Copyright (C) 2020 Open Mobile Platform LLC. ** Copyright (c) 2020 - 2021 Open Mobile Platform LLC.
** All rights reserved. ** All rights reserved.
** Contact: Nokia Corporation (directui@nokia.com) ** Contact: Nokia Corporation (directui@nokia.com)
** **
@ -53,43 +53,39 @@ extern char ** environ;
Daemon * Daemon::m_instance = NULL; Daemon * Daemon::m_instance = NULL;
const int Daemon::m_boosterSleepTime = 2; const int Daemon::m_boosterSleepTime = 2;
const std::string Daemon::m_stateDir = std::string(getenv("XDG_RUNTIME_DIR"))+"/applauncherd"; static void write_dontcare(int fd, const void *data, size_t size)
const std::string Daemon::m_stateFile = Daemon::m_stateDir + "/saved-state";
static void sigChldHandler(int)
{
char v = SIGCHLD;
write(Daemon::instance()->sigPipeFd(), &v, 1);
}
static void sigTermHandler(int)
{ {
char v = SIGTERM; ssize_t rc = write(fd, data, size);
write(Daemon::instance()->sigPipeFd(), &v, 1); if (rc == -1)
Logger::logWarning("write to fd=%d failed: %m", fd);
else if ((size_t)rc != size)
Logger::logWarning("write to fd=%d failed", fd);
} }
static void sigUsr1Handler(int) static void write_to_signal_pipe(int sig)
{ {
char v = SIGUSR1; char v = (char)sig;
write(Daemon::instance()->sigPipeFd(), &v, 1); if (write(Daemon::instance()->sigPipeFd(), &v, 1) != 1) {
} /* If we can't write to internal signal forwarding
* pipe, we might as well quit */
static void sigUsr2Handler(int) const char m[] = "*** signal pipe write failure - terminating\n";
{ if (write(STDERR_FILENO, m, sizeof m - 1) == -1) {
char v = SIGUSR2; // dontcare
write(Daemon::instance()->sigPipeFd(), &v, 1); }
} _exit(EXIT_FAILURE);
}
static void sigPipeHandler(int)
{
char v = SIGPIPE;
write(Daemon::instance()->sigPipeFd(), &v, 1);
} }
static void sigHupHandler(int) static int read_from_signal_pipe(int fd)
{ {
char v = SIGHUP; char sig = 0;
write(Daemon::instance()->sigPipeFd(), &v, 1); if (read(fd, &sig, 1) != 1) {
/* If we can't read from internal signal forwarding
* pipe, we might as well quit */
Logger::logError("signal pipe read failure - terminating\n");
exit(EXIT_FAILURE);
}
return sig;
} }
Daemon::Daemon(int & argc, char * argv[]) : Daemon::Daemon(int & argc, char * argv[]) :
@ -108,12 +104,12 @@ Daemon::Daemon(int & argc, char * argv[]) :
// Install signal handlers. The original handlers are saved // Install signal handlers. The original handlers are saved
// in the daemon instance so that they can be restored in boosters. // in the daemon instance so that they can be restored in boosters.
setUnixSignalHandler(SIGCHLD, sigChldHandler); // reap zombies setUnixSignalHandler(SIGCHLD, write_to_signal_pipe); // reap zombies
setUnixSignalHandler(SIGTERM, sigTermHandler); // exit launcher setUnixSignalHandler(SIGTERM, write_to_signal_pipe); // exit launcher
setUnixSignalHandler(SIGUSR1, sigUsr1Handler); // enter normal mode from boot mode setUnixSignalHandler(SIGUSR1, write_to_signal_pipe); // enter normal mode from boot mode
setUnixSignalHandler(SIGUSR2, sigUsr2Handler); // enter boot mode (same as --boot-mode) setUnixSignalHandler(SIGUSR2, write_to_signal_pipe); // enter boot mode (same as --boot-mode)
setUnixSignalHandler(SIGPIPE, sigPipeHandler); // broken invoker's pipe setUnixSignalHandler(SIGPIPE, write_to_signal_pipe); // broken invoker's pipe
setUnixSignalHandler(SIGHUP, sigHupHandler); // re-exec setUnixSignalHandler(SIGHUP, write_to_signal_pipe); // re-exec
if (!Daemon::m_instance) if (!Daemon::m_instance)
{ {
@ -210,8 +206,7 @@ void Daemon::run(Booster *booster)
if (FD_ISSET(m_sigPipeFd[0], &rfds)) if (FD_ISSET(m_sigPipeFd[0], &rfds))
{ {
Logger::logDebug("Daemon: FD_ISSET(m_sigPipeFd[0])"); Logger::logDebug("Daemon: FD_ISSET(m_sigPipeFd[0])");
char dataReceived; int dataReceived = read_from_signal_pipe(m_sigPipeFd[0]);
read(m_sigPipeFd[0], &dataReceived, 1);
switch (dataReceived) switch (dataReceived)
{ {
@ -380,6 +375,10 @@ void Daemon::forkBooster(int sleepTime)
if (newPid == 0) /* Child process */ if (newPid == 0) /* Child process */
{ {
// Will be reopened with new identity when/if
// there is something to report
Logger::closeLog();
// Restore used signal handlers // Restore used signal handlers
restoreUnixSignalHandlers(); restoreUnixSignalHandlers();
@ -483,9 +482,10 @@ void Daemon::reapZombies()
FdMap::iterator fd = m_boosterPidToInvokerFd.find(pid); FdMap::iterator fd = m_boosterPidToInvokerFd.find(pid);
if (fd != m_boosterPidToInvokerFd.end()) if (fd != m_boosterPidToInvokerFd.end())
{ {
write((*fd).second, &INVOKER_MSG_EXIT, sizeof(uint32_t)); uint32_t command = INVOKER_MSG_EXIT;
int exitStatus = WEXITSTATUS(status); uint32_t argument = WEXITSTATUS(status);
write((*fd).second, &exitStatus, sizeof(int)); write_dontcare((*fd).second, &command, sizeof command);
write_dontcare((*fd).second, &argument, sizeof argument);
close((*fd).second); close((*fd).second);
m_boosterPidToInvokerFd.erase(fd); m_boosterPidToInvokerFd.erase(fd);
} }

@ -1,7 +1,8 @@
/*************************************************************************** /***************************************************************************
** **
** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
** Copyright (C) 2013 - 2021 Jolla Ltd. ** Copyright (c) 2013 - 2021 Jolla Ltd.
** Copyright (c) 2021 Open Mobile Platform LLC.
** All rights reserved. ** All rights reserved.
** Contact: Nokia Corporation (directui@nokia.com) ** Contact: Nokia Corporation (directui@nokia.com)
** **
@ -212,10 +213,6 @@ private:
//! Booster instance //! Booster instance
Booster * m_booster; Booster * m_booster;
//! Name of the state saving directory and file
static const std::string m_stateDir;
static const std::string m_stateFile;
#ifdef UNIT_TEST #ifdef UNIT_TEST
friend class Ut_Daemon; friend class Ut_Daemon;
#endif #endif

@ -1,6 +1,8 @@
/*************************************************************************** /***************************************************************************
** **
** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
** Copyright (c) 2013 - 2021 Jolla Ltd.
** Copyright (c) 2021 Open Mobile Platform LLC.
** All rights reserved. ** All rights reserved.
** Contact: Nokia Corporation (directui@nokia.com) ** Contact: Nokia Corporation (directui@nokia.com)
** **
@ -73,7 +75,7 @@ void Logger::logDebug(const char * format, ...)
{ {
if (m_debugMode) if (m_debugMode)
{ {
va_list(ap); va_list ap;
va_start(ap, format); va_start(ap, format);
writeLog(LOG_DEBUG, format, ap); writeLog(LOG_DEBUG, format, ap);
va_end(ap); va_end(ap);
@ -82,7 +84,7 @@ void Logger::logDebug(const char * format, ...)
void Logger::logInfo(const char * format, ...) void Logger::logInfo(const char * format, ...)
{ {
va_list(ap); va_list ap;
va_start(ap, format); va_start(ap, format);
writeLog(LOG_INFO, format, ap); writeLog(LOG_INFO, format, ap);
va_end(ap); va_end(ap);
@ -92,7 +94,7 @@ void Logger::logInfo(const char * format, ...)
void Logger::logWarning(const char * format, ...) void Logger::logWarning(const char * format, ...)
{ {
va_list(ap); va_list ap;
va_start(ap, format); va_start(ap, format);
writeLog(LOG_WARNING, format, ap); writeLog(LOG_WARNING, format, ap);
va_end(ap); va_end(ap);
@ -100,7 +102,7 @@ void Logger::logWarning(const char * format, ...)
void Logger::logError(const char * format, ...) void Logger::logError(const char * format, ...)
{ {
va_list(ap); va_list ap;
va_start(ap, format); va_start(ap, format);
writeLog(LOG_ERR, format, ap); writeLog(LOG_ERR, format, ap);
va_end(ap); va_end(ap);

Loading…
Cancel
Save