]> git.cameronkatri.com Git - bsdgames-darwin.git/blobdiff - fish/fish.c
Buffer overflow fix (from OpenBSD)
[bsdgames-darwin.git] / fish / fish.c
index 03171e963515e36ffc26dd81676e2caf76f9c085..df12fe7e0f7eb1d16b87d8dc27a47eede8c37404 100644 (file)
@@ -1,4 +1,4 @@
-/*     $NetBSD: fish.c,v 1.4 1997/10/10 12:58:32 lukem Exp $   */
+/*     $NetBSD: fish.c,v 1.7 1999/04/24 22:09:06 kristerw Exp $        */
 
 /*-
  * Copyright (c) 1990, 1993
@@ -46,17 +46,20 @@ __COPYRIGHT("@(#) Copyright (c) 1990, 1993\n\
 #if 0
 static char sccsid[] = "@(#)fish.c     8.1 (Berkeley) 5/31/93";
 #else
-__RCSID("$NetBSD: fish.c,v 1.4 1997/10/10 12:58:32 lukem Exp $");
+__RCSID("$NetBSD: fish.c,v 1.7 1999/04/24 22:09:06 kristerw Exp $");
 #endif
 #endif /* not lint */
 
 #include <sys/types.h>
-#include <sys/errno.h>
+#include <sys/wait.h>
+#include <errno.h>
 #include <fcntl.h>
 #include <stdio.h>
 #include <stdlib.h>
+#include <unistd.h>
 #include <string.h>
 #include <time.h>
+#include <err.h>
 #include "pathnames.h"
 
 #define        RANKS           13
@@ -91,7 +94,7 @@ int   nrandom __P((int));
 void   printhand __P((int *));
 void   printplayer __P((int));
 int    promove __P((void));
-void   usage __P((void));
+void   usage __P((void)) __attribute__((__noreturn__));
 int    usermove __P((void));
 
 int
@@ -159,7 +162,7 @@ usermove()
        for (;;) {
                (void)printf("You ask me for: ");
                (void)fflush(stdout);
-               if (fgets(buf, BUFSIZ, stdin) == NULL)
+               if (fgets(buf, sizeof(buf), stdin) == NULL)
                        exit(0);
                if (buf[0] == '\0')
                        continue;
@@ -446,7 +449,8 @@ void
 instructions()
 {
        int input;
-       char buf[1024];
+       pid_t pid;
+       int status;
 
        (void)printf("Would you like instructions (y or n)? ");
        input = getchar();
@@ -454,8 +458,20 @@ instructions()
        if (input != 'y')
                return;
 
-       (void)sprintf(buf, "%s %s", _PATH_MORE, _PATH_INSTR);
-       (void)system(buf);
+       switch (pid = fork()) {
+       case 0: /* child */
+               (void)setuid(getuid());
+               (void)setgid(getgid());
+               (void)execl(_PATH_MORE, "more", _PATH_INSTR, NULL);
+               err(1, "%s %s", _PATH_MORE, _PATH_INSTR);
+               /*NOTREACHED*/
+       case -1:
+               err(1, "fork");
+               /*NOTREACHED*/
+       default:
+               (void)waitpid(pid, &status, 0);
+               break;
+       }
        (void)printf("Hit return to continue...\n");
        while ((input = getchar()) != EOF && input != '\n');
 }