mirror of
https://salsa.debian.org/dskoll/remind.git
synced 2026-04-17 06:48:47 +02:00
Set CLOEXEC flag on files we open.
When running programs in server mode, connect stdin and stdout to /dev/null
This commit is contained in:
@@ -1151,7 +1151,7 @@ int TriggerReminder(ParsePtr p, Trigger *t, TimeTrig *tim, int dse, int is_queue
|
||||
case MSG_TYPE:
|
||||
case PASSTHRU_TYPE:
|
||||
if (msg_command) {
|
||||
DoMsgCommand(msg_command, DBufValue(&buf));
|
||||
DoMsgCommand(msg_command, DBufValue(&buf), is_queued);
|
||||
} else {
|
||||
if (output) {
|
||||
DBufPuts(output, DBufValue(&buf));
|
||||
@@ -1171,7 +1171,7 @@ int TriggerReminder(ParsePtr p, Trigger *t, TimeTrig *tim, int dse, int is_queue
|
||||
break;
|
||||
|
||||
case RUN_TYPE:
|
||||
System(DBufValue(&buf));
|
||||
System(DBufValue(&buf), is_queued);
|
||||
break;
|
||||
|
||||
default: /* Unknown/illegal type? */
|
||||
@@ -1398,7 +1398,7 @@ static int ParsePriority(ParsePtr s, Trigger *t)
|
||||
/* Execute the '-k' command, escaping shell chars in message. */
|
||||
/* */
|
||||
/***************************************************************/
|
||||
int DoMsgCommand(char const *cmd, char const *msg)
|
||||
int DoMsgCommand(char const *cmd, char const *msg, int is_queued)
|
||||
{
|
||||
int r;
|
||||
int i, l;
|
||||
@@ -1435,7 +1435,7 @@ int DoMsgCommand(char const *cmd, char const *msg)
|
||||
}
|
||||
r = OK;
|
||||
|
||||
System(DBufValue(&execBuffer));
|
||||
System(DBufValue(&execBuffer), is_queued);
|
||||
|
||||
finished:
|
||||
DBufFree(&buf);
|
||||
|
||||
18
src/files.c
18
src/files.c
@@ -15,7 +15,7 @@
|
||||
#include "config.h"
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#include <fcntl.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
#include <ctype.h>
|
||||
@@ -100,6 +100,18 @@ static int CheckSafety (void);
|
||||
static int CheckSafetyAux (struct stat *statbuf);
|
||||
static int PopFile (void);
|
||||
static int IncludeCmd(char const *);
|
||||
|
||||
void set_cloexec(int fd)
|
||||
{
|
||||
int flags;
|
||||
flags = fcntl(fd, F_GETFD);
|
||||
if (flags >= 0) {
|
||||
flags |= FD_CLOEXEC;
|
||||
fcntl(fd, F_SETFD, flags);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void OpenPurgeFile(char const *fname, char const *mode)
|
||||
{
|
||||
DynamicBuffer fname_buf;
|
||||
@@ -123,6 +135,7 @@ static void OpenPurgeFile(char const *fname, char const *mode)
|
||||
if (!PurgeFP) {
|
||||
fprintf(ErrFp, "Cannot open `%s' for writing: %s\n", DBufValue(&fname_buf), strerror(errno));
|
||||
}
|
||||
set_cloexec(fileno(PurgeFP));
|
||||
DBufFree(&fname_buf);
|
||||
}
|
||||
|
||||
@@ -327,6 +340,7 @@ int OpenFile(char const *fname)
|
||||
}
|
||||
} else {
|
||||
fp = fopen(fname, "r");
|
||||
if (fp) set_cloexec(fileno(fp));
|
||||
if (DebugFlag & DB_TRACE_FILES) {
|
||||
fprintf(ErrFp, "Reading `%s': Opening file on disk\n", fname);
|
||||
}
|
||||
@@ -346,6 +360,7 @@ int OpenFile(char const *fname)
|
||||
if (strcmp(fname, "-")) {
|
||||
fp = fopen(fname, "r");
|
||||
if (!fp || !CheckSafety()) return E_CANT_OPEN;
|
||||
set_cloexec(fileno(fp));
|
||||
if (PurgeMode) OpenPurgeFile(fname, "w");
|
||||
} else {
|
||||
fp = stdin;
|
||||
@@ -542,6 +557,7 @@ static int PopFile(void)
|
||||
if (strcmp(i->filename, "-")) {
|
||||
fp = fopen(i->filename, "r");
|
||||
if (!fp || !CheckSafety()) return E_CANT_OPEN;
|
||||
set_cloexec(fileno(fp));
|
||||
if (PurgeMode) OpenPurgeFile(i->filename, "a");
|
||||
} else {
|
||||
fp = stdin;
|
||||
|
||||
40
src/main.c
40
src/main.c
@@ -14,6 +14,8 @@
|
||||
#define _XOPEN_SOURCE 600
|
||||
#include "config.h"
|
||||
|
||||
#include <fcntl.h>
|
||||
#include <sys/wait.h>
|
||||
#include <errno.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
@@ -1654,11 +1656,45 @@ SaveLastTimeTrig(TimeTrig const *t)
|
||||
memcpy(&LastTimeTrig, t, sizeof(LastTimeTrig));
|
||||
}
|
||||
|
||||
/* Wrapper to ignore warnings about ignoring return value of system() */
|
||||
/* Wrapper to ignore warnings about ignoring return value of system()
|
||||
Also redirects stdin and stdout to /dev/null for queued reminders */
|
||||
|
||||
void
|
||||
System(char const *cmd)
|
||||
System(char const *cmd, int is_queued)
|
||||
{
|
||||
int r;
|
||||
pid_t kid;
|
||||
int fd;
|
||||
int status;
|
||||
if (is_queued && IsServerMode()) {
|
||||
/* Server mode... redirect stdin and stdout to /dev/null */
|
||||
kid = fork();
|
||||
if (kid == (pid_t) -1) {
|
||||
/* Fork failed... nothing we can do */
|
||||
return;
|
||||
} else if (kid == 0) {
|
||||
/* In the child */
|
||||
(void) close(STDIN_FILENO);
|
||||
(void) close(STDOUT_FILENO);
|
||||
fd = open("/dev/null", O_RDONLY);
|
||||
if (fd >= 0 && fd != STDIN_FILENO) {
|
||||
dup2(fd, STDIN_FILENO);
|
||||
close(STDIN_FILENO);
|
||||
}
|
||||
fd = open("/dev/null", O_WRONLY);
|
||||
if (fd >= 0 && fd != STDOUT_FILENO) {
|
||||
dup2(fd, STDOUT_FILENO);
|
||||
close(STDOUT_FILENO);
|
||||
}
|
||||
} else {
|
||||
/* In the parent */
|
||||
while (waitpid(kid, &status, 0) != kid) {
|
||||
continue;
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
/* This is the child process */
|
||||
r = system(cmd);
|
||||
if (r == 0) {
|
||||
return;
|
||||
|
||||
@@ -118,7 +118,7 @@ void DestroyVars (int all);
|
||||
int PreserveVar (char const *name);
|
||||
int DoPreserve (Parser *p);
|
||||
int DoSatRemind (Trigger *trig, TimeTrig *tt, ParsePtr p);
|
||||
int DoMsgCommand (char const *cmd, char const *msg);
|
||||
int DoMsgCommand (char const *cmd, char const *msg, int is_queued);
|
||||
int ParseNonSpaceChar (ParsePtr p, int *err, int peek);
|
||||
unsigned int HashVal (char const *str);
|
||||
int DateOK (int y, int m, int d);
|
||||
@@ -168,7 +168,7 @@ void PrintJSONKeyPairString(char const *name, char const *val);
|
||||
void PrintJSONKeyPairDate(char const *name, int dse);
|
||||
void PrintJSONKeyPairDateTime(char const *name, int dt);
|
||||
void PrintJSONKeyPairTime(char const *name, int t);
|
||||
void System(char const *cmd);
|
||||
void System(char const *cmd, int queued);
|
||||
int ShellEscape(char const *in, DynamicBuffer *out);
|
||||
int AddGlobalOmit(int dse);
|
||||
void set_lat_and_long_from_components(void);
|
||||
@@ -179,6 +179,7 @@ int GetTerminalBackground(void);
|
||||
char const *get_day_name(int wkday);
|
||||
char const *get_month_name(int mon);
|
||||
|
||||
void set_cloexec(int fd);
|
||||
int push_call(char const *filename, char const *func, int lineno);
|
||||
void clear_callstack(void);
|
||||
int print_callstack(FILE *fp);
|
||||
|
||||
@@ -136,7 +136,7 @@ void IssueSortedReminders(void)
|
||||
switch(cur->typ) {
|
||||
case MSG_TYPE:
|
||||
if (MsgCommand && *MsgCommand) {
|
||||
DoMsgCommand(MsgCommand, cur->text);
|
||||
DoMsgCommand(MsgCommand, cur->text, 0);
|
||||
} else {
|
||||
if (cur->trigdate != olddate) {
|
||||
IssueSortBanner(cur->trigdate);
|
||||
@@ -155,7 +155,7 @@ void IssueSortedReminders(void)
|
||||
break;
|
||||
|
||||
case RUN_TYPE:
|
||||
System(cur->text);
|
||||
System(cur->text, 0);
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user