openbsd-ports/audio/xmcd/patches/patch-cda_d_cda_c
millert 9b2f192946 Fix SIGCHLD handling; use SIG_DFL to reset SIGCHLD behavior to
default, not SIG_IGN which has different semantics these days.
OK naddy@
2007-04-12 12:28:02 +00:00

162 lines
4.7 KiB
Plaintext

$OpenBSD: patch-cda_d_cda_c,v 1.3 2007/04/12 12:28:02 millert Exp $
--- cda_d/cda.c.orig Sat Feb 5 00:26:38 2000
+++ cda_d/cda.c Tue May 6 12:36:11 2003
@@ -349,23 +349,52 @@ cda_init(curstat_t *s)
STATIC void
cda_start(curstat_t *s)
{
+ struct stat stbuf;
+
/* Start up libutil */
util_start();
/* Start up I/O interface */
di_start(s);
+ /*
+ ** NO_FOLLOW isn't supported by all flavours of Unix,
+ ** but at least by linux and openbsd.
+ ** thomas@suse.de
+ */
/* Open FIFOs - daemon side */
- if ((cda_sfd[0] = open(spipe, O_RDONLY)) < 0) {
+ if ((cda_sfd[0] = open(spipe, O_RDONLY | O_NOFOLLOW)) < 0) {
perror("CD audio daemon: cannot open send pipe");
cda_quit(s);
exit(4);
}
- if ((cda_rfd[0] = open(rpipe, O_WRONLY)) < 0) {
+ if ((cda_rfd[0] = open(rpipe, O_WRONLY | O_NOFOLLOW)) < 0) {
perror("CD audio daemon: cannot open recv pipe");
cda_quit(s);
exit(5);
}
+
+ /* Check FIFOs */
+ if (stat(spipe, &stbuf) < 0 || !S_ISFIFO(stbuf.st_mode)) {
+ (void) fprintf(errfp,
+ "CD audio: Send pipe error (daemon): %s\n",
+ spipe);
+ di_halt(s);
+ /* Remove lock */
+ if (dlock[0] != '\0')
+ (void) UNLINK(dlock);
+ exit(6);
+ }
+ if (stat(rpipe, &stbuf) < 0 || !S_ISFIFO(stbuf.st_mode)) {
+ (void) fprintf(errfp,
+ "CD audio: Receive pipe error (daemon): %s\n",
+ rpipe);
+ di_halt(s);
+ /* Remove lock */
+ if (dlock[0] != '\0')
+ (void) UNLINK(dlock);
+ exit(6);
+ }
}
@@ -396,7 +425,7 @@ cda_daemonlock(void)
fd = open(dlock, O_CREAT | O_EXCL | O_WRONLY);
if (fd < 0) {
if (errno == EEXIST) {
- if ((fd = open(dlock, O_RDONLY)) < 0)
+ if ((fd = open(dlock, O_RDONLY | O_NOFOLLOW)) < 0)
return FALSE;
if (read(fd, buf, 12) > 0)
@@ -430,7 +459,7 @@ cda_daemonlock(void)
(void) write(fd, buf, strlen(buf));
(void) close(fd);
- (void) chmod(dlock, 0644);
+ (void) chmod(dlock, 0644); /* woudln't 0622 suffice ? */
return TRUE;
}
@@ -3592,7 +3621,7 @@ cda_daemon_alive(void)
(void) sprintf(dlock, "%s/cdad.%x", TEMP_DIR, (int) cd_rdev);
- if ((fd = open(dlock, O_RDONLY)) < 0)
+ if ((fd = open(dlock, O_RDONLY | O_NOFOLLOW)) < 0)
return FALSE;
if (read(fd, buf, 12) < 0) {
@@ -3644,7 +3673,7 @@ cda_daemon(curstat_t *s)
/* Make temporary directory, if needed */
(void) sprintf(emsgp, app_data.str_tmpdirerr, TEMP_DIR);
if (LSTAT(TEMP_DIR, &stbuf) < 0) {
- if (!util_mkdir(TEMP_DIR, 0777)) {
+ if (!util_mkdir(TEMP_DIR, 0700)) {
(void) fprintf(errfp, "%s\n", emsgp);
return 1;
}
@@ -3657,7 +3686,7 @@ cda_daemon(curstat_t *s)
MEM_FREE(emsgp);
#endif /* NOMKTMPDIR */
- (void) signal(SIGCHLD, SIG_IGN);
+ (void) signal(SIGCHLD, SIG_DFL);
/* Become a daemon process */
switch (FORK()) {
@@ -3817,12 +3846,14 @@ main(int argc, char **argv)
errfp = stderr;
s = &status;
+
/* Hack: Aside from stdin, stdout, stderr, there shouldn't
* be any other files open, so force-close them. This is
* necessary in case xmcd was inheriting any open file
* descriptors from a parent process which is for the
* CD-ROM device, and violating exclusive-open requirements
* on some platforms.
+ * thomas@suse.de: not necessary anymore on modern systems
*/
for (i = 3; i < 10; i++)
(void) close(i);
@@ -3941,7 +3972,7 @@ main(int argc, char **argv)
if (remote > 0)
app_data.cddb_rmtdsbl = (remote == 1) ? FALSE : TRUE;
(void) strcpy(cddb_cldata.prog, PROGNAME);
- (void) strcpy(cddb_cldata.user, util_loginname());
+ (void) strcpy(cddb_cldata.user, util_loginname()); /* bufferoverflow with orig. code here thomas@suse.de */
cddb_cldata.isdemo = di_isdemo;
cddb_cldata.curstat_addr = curstat_addr;
cddb_cldata.fatal_msg = cda_fatal_msg;
@@ -3981,24 +4012,30 @@ main(int argc, char **argv)
cda_parse_devlist(s);
/* Open FIFOs - command side */
- if ((cda_sfd[1] = open(spipe, O_WRONLY)) < 0) {
+ if ((cda_sfd[1] = open(spipe, O_WRONLY | O_NOFOLLOW)) < 0) {
perror("CD audio: cannot open send pipe");
CDA_FATAL(
"Run \"cda on\" first to initialize CD audio daemon."
);
}
- if ((cda_rfd[1] = open(rpipe, O_RDONLY)) < 0) {
+ if ((cda_rfd[1] = open(rpipe, O_RDONLY | O_NOFOLLOW)) < 0) {
perror("CD audio: cannot open recv pipe for reading");
CDA_FATAL(
"Run \"cda on\" first to initialize CD audio daemon."
);
}
- if ((cda_rfd[0] = open(rpipe, O_WRONLY)) < 0) {
+ if ((cda_rfd[0] = open(rpipe, O_WRONLY | O_NOFOLLOW)) < 0) {
perror("CD audio: cannot open recv pipe for writing");
CDA_FATAL(
"Run \"cda on\" first to initialize CD audio daemon."
);
}
+
+ /* Check FIFOs */
+ if (stat(spipe, &stbuf) < 0 || !S_ISFIFO(stbuf.st_mode))
+ CDA_FATAL("Send pipe error");
+ if (stat(rpipe, &stbuf) < 0 || !S_ISFIFO(stbuf.st_mode))
+ CDA_FATAL("Receive pipe error");
/* Handle some signals */
(void) signal(SIGINT, onintr);