Date: Sat, 25 Oct 2008 11:50:03 GMT From: Stefan Walter <stefan@freebsd.org> To: freebsd-ports-bugs@FreeBSD.org Subject: Re: ports/127321: japanese/kon2-16dot: buffer overflow and mouse bugs Message-ID: <200810251150.m9PBo3ep068016@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
The following reply was made to PR ports/127321; it has been noted by GNATS. From: Stefan Walter <stefan@freebsd.org> To: GNATS <FreeBSD-gnats-submit@FreeBSD.org> Cc: Subject: Re: ports/127321: japanese/kon2-16dot: buffer overflow and mouse bugs Date: Sat, 25 Oct 2008 13:43:58 +0200 --17pEHd4RhPHOinZp Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Uncompressed version of the patch attached. --17pEHd4RhPHOinZp Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="kon2.diff" Index: font/fld.c =================================================================== RCS file: /home/toshi/cvs/kon2/font/fld.c,v retrieving revision 1.1.1.1 diff -u -r1.1.1.1 fld.c --- font/fld.c 30 Sep 2008 08:02:59 -0000 1.1.1.1 +++ font/fld.c 23 Oct 2008 09:24:33 -0000 @@ -52,36 +52,13 @@ {NULL, NULL} }; -void UnloadShmem(char fnum) -{ - key_t shmkey; - int shmid; - struct shmid_ds shmseg; - -#if defined(linux) - shmkey = ftok(CONFIG_NAME, fnum); -#elif defined(__FreeBSD__) - shmkey = 5000 + (fnum & 0x7F); -#endif - if ((shmid = shmget(shmkey, sizeof(struct fontInfo), 0444)) < 0) - return; - shmctl(shmid, IPC_STAT, &shmseg); - if (shmseg.shm_nattch < 1) { - shmctl(shmid, IPC_RMID, 0); - } -} - int CheckLoadedFont(char fnum) { key_t shmkey; extern int forceLoad; if (forceLoad) return(EOF); -#if defined(linux) - shmkey = ftok(SHMEM_NAME, fnum); -#elif defined(__FreeBSD__) - shmkey = 5000 + (fnum & 0x7F); -#endif + shmkey = ftok(CONFIG_NAME, fnum); if (shmget(shmkey, 1, 0444) == EOF) return(EOF); return(0); } @@ -93,11 +70,7 @@ int shmid; u_char *shmbuff; -#if defined(linux) - shmkey = ftok(SHMEM_NAME, fi->type); -#elif defined(__FreeBSD__) - shmkey = 5000 + (fi->type & 0x0000007F); -#endif + shmkey = ftok(CONFIG_NAME, fi->type); shmid = shmget(shmkey, fi->size+sizeof(struct fontInfo), IPC_CREAT|0666); shmbuff = shmat(shmid, 0, 0); @@ -134,11 +107,7 @@ int shmid; struct fontInfo *fi; -#if defined(linux) shmkey = ftok(CONFIG_NAME, fnum); -#elif defined(__FreeBSD__) - shmkey = 5000 + (fnum & 0x7F); -#endif if ((shmid = shmget(shmkey, sizeof(struct fontInfo), 0444)) < 0) return(0); fi = (struct fontInfo*)shmat(shmid, 0, SHM_RDONLY); @@ -194,7 +163,7 @@ (n & CHR_DBC) ? fDRegs[n&~CHR_DFLD].registry: fSRegs[n&~CHR_SFLD].registry); - UnloadShmem(n | CHR_SFLD); + DownShmem(n | CHR_SFLD); break; } st = ST_ARG; Index: font/fontx2.c =================================================================== RCS file: /home/toshi/cvs/kon2/font/fontx2.c,v retrieving revision 1.1.1.1 diff -u -r1.1.1.1 fontx2.c --- font/fontx2.c 30 Sep 2008 08:02:59 -0000 1.1.1.1 +++ font/fontx2.c 23 Oct 2008 09:24:33 -0000 @@ -37,6 +37,7 @@ #include <string.h> #include <sys/socket.h> +#include <defs.h> #include <interface.h> #include <fnld.h> @@ -170,7 +171,7 @@ font = FontLoadSFontx(fp, header); else exit(0); } - free(header); + SafeFree(header); return(font); } Index: include/defs.h =================================================================== RCS file: /home/toshi/cvs/kon2/include/defs.h,v retrieving revision 1.1.1.1 diff -u -r1.1.1.1 defs.h --- include/defs.h 30 Sep 2008 08:02:59 -0000 1.1.1.1 +++ include/defs.h 23 Oct 2008 09:27:32 -0000 @@ -37,4 +37,6 @@ #define FAILURE (-1) #define SUCCESS (0) +#define SafeFree(x) do { if ((x) != NULL) free(x), (x) = NULL; } while (0) + #endif Index: include/fnld.h =================================================================== RCS file: /home/toshi/cvs/kon2/include/fnld.h,v retrieving revision 1.1.1.1 diff -u -r1.1.1.1 fnld.h --- include/fnld.h 30 Sep 2008 08:02:59 -0000 1.1.1.1 +++ include/fnld.h 23 Oct 2008 09:24:33 -0000 @@ -51,6 +51,10 @@ #define FR_ATTACH 1 #define FR_PROXY 2 +#if defined(__FreeBSD__) +#define ftok(p, n) (5000 + ((n) & 0x7F)) +#endif + extern struct fontRegs fSRegs[], fDRegs[]; extern struct fontRegs *sbFReg, *dbFReg; Index: include/mem.h =================================================================== RCS file: /home/toshi/cvs/kon2/include/mem.h,v retrieving revision 1.1.1.2 diff -u -r1.1.1.2 mem.h --- include/mem.h 30 Sep 2008 08:09:55 -0000 1.1.1.2 +++ include/mem.h 23 Oct 2008 09:24:33 -0000 @@ -111,6 +111,5 @@ extern void wmove(void *, void *, int); extern void lmove(void *, void *, int); #endif -extern void SafeFree(void **); #endif Index: include/term.h =================================================================== RCS file: /home/toshi/cvs/kon2/include/term.h,v retrieving revision 1.1.1.1 diff -u -r1.1.1.1 term.h --- include/term.h 30 Sep 2008 08:02:59 -0000 1.1.1.1 +++ include/term.h 23 Oct 2008 09:24:33 -0000 @@ -36,5 +36,6 @@ extern void TermStart(void); /* start procesing */ extern void TermRestart(int fd); /* restart kon (args are read from fd) */ extern int masterPty; /* master pseudo-tty file descriptor */ +extern int TermGetNumber(void); #endif Index: include/vt.h =================================================================== RCS file: /home/toshi/cvs/kon2/include/vt.h,v retrieving revision 1.1.1.2 diff -u -r1.1.1.2 vt.h --- include/vt.h 30 Sep 2008 08:09:55 -0000 1.1.1.2 +++ include/vt.h 23 Oct 2008 09:24:33 -0000 @@ -59,12 +59,10 @@ ins, active, wrap, -#if defined(__FreeBSD__) - text_mode, - cursor_key_mode; -#else text_mode; -#endif +#if defined(__FreeBSD__) + bool cursor_key_mode; +#endif /* __FreeBSD__ */ }; extern struct _con_info con; Index: lib/coding.c =================================================================== RCS file: /home/toshi/cvs/kon2/lib/coding.c,v retrieving revision 1.1.1.1 diff -u -r1.1.1.1 coding.c --- lib/coding.c 30 Sep 2008 08:02:59 -0000 1.1.1.1 +++ lib/coding.c 23 Oct 2008 09:24:33 -0000 @@ -28,6 +28,7 @@ #include <config.h> #include <stdio.h> +#include <string.h> #include <errno.h> #include <interface.h> Index: lib/font.c =================================================================== RCS file: /home/toshi/cvs/kon2/lib/font.c,v retrieving revision 1.1.1.1 diff -u -r1.1.1.1 font.c --- lib/font.c 30 Sep 2008 08:02:59 -0000 1.1.1.1 +++ lib/font.c 23 Oct 2008 09:24:33 -0000 @@ -44,11 +44,7 @@ int shmid; struct shmid_ds shmseg; -#if defined(linux) shmkey = ftok(CONFIG_NAME, fnum); -#elif defined(__FreeBSD__) - shmkey = 5000 + (fnum & 0x7F); -#endif if ((shmid = shmget(shmkey, sizeof(struct fontInfo), 0444)) < 0) return; shmctl(shmid, IPC_STAT, &shmseg); @@ -63,11 +59,7 @@ key_t shmkey; int shmid; -#if defined(linux) shmkey = ftok(CONFIG_NAME, fnum); -#elif defined(__FreeBSD__) - shmkey = 5000 + (fnum & 0x7F); -#endif if ((shmid = shmget(shmkey, sizeof(struct fontInfo), 0444)) < 0) return(0); return((u_char*)shmat(shmid, 0, SHM_RDONLY)); } Index: lib/getcap.c =================================================================== RCS file: /home/toshi/cvs/kon2/lib/getcap.c,v retrieving revision 1.1.1.1 diff -u -r1.1.1.1 getcap.c --- lib/getcap.c 30 Sep 2008 08:02:59 -0000 1.1.1.1 +++ lib/getcap.c 23 Oct 2008 09:24:33 -0000 @@ -73,8 +73,10 @@ fprintf(stderr, "cap %s redefined (default %s)\r\n", name, def_value ? def_value : "None"); #endif + SafeFree(cp->name); cp->name = strdup(name); cp->func = func; + SafeFree(cp->def_value); if (def_value) cp->def_value = strdup(def_value); return; @@ -86,8 +88,10 @@ fprintf(stderr, "cap %s defined (default %s)\r\n", name, def_value ? def_value : "None"); #endif + SafeFree(cp->name); cp->name = strdup(name); cp->func = func; + SafeFree(cp->def_value); if (def_value) cp->def_value = strdup(def_value); return; @@ -110,12 +114,9 @@ fprintf(stderr, "cap %s deleted\r\n", cp->name); #endif cp->initialized = 0; - if (cp->name) - free(cp->name); - if (cp->arg) - free(cp->arg); - if (cp->def_value) - free(cp->def_value); + SafeFree(cp->name); + SafeFree(cp->arg); + SafeFree(cp->def_value); cp->name = cp->arg = cp->def_value = NULL; } } @@ -149,10 +150,13 @@ if ((c = FindCap(p)) != NULL) { /* Found matching capability. Get body from file. */ char *l = buf; + int bnum = 0; while (fgets(line, MAX_COLS, capFp) != NULL && line[0] == '\t') { char *l2 = line; while (*l2 != '\n' && *l2 != '#') { + if (++bnum > BUF_SIZE - 2) + fatal("buffer overflow at configuration file\n"); *l++ = *l2++; } *l++ = '\n'; @@ -223,6 +227,7 @@ /* Protected capability. */ return FAILURE; } + SafeFree(cp->arg); cp->arg = strdup(value); #ifdef DEBUG fprintf(stderr, "Setting arg for %s to %s\r\n", capName, value); @@ -234,8 +239,12 @@ bool BoolConf(const char *confstr) { - char name[MAX_COLS]; - sscanf(confstr, "%s", name); + char *name, *last, *sep = " \t\r\n"; + + name = strtok_r((char *)confstr, sep, &last); + if (name == NULL) + return FALSE; + if (strcasecmp(name, "On") == 0 || strcasecmp(name, "True") == 0) { return TRUE; Index: lib/mem.c =================================================================== RCS file: /home/toshi/cvs/kon2/lib/mem.c,v retrieving revision 1.1.1.2 diff -u -r1.1.1.2 mem.c --- lib/mem.c 30 Sep 2008 08:09:56 -0000 1.1.1.2 +++ lib/mem.c 23 Oct 2008 09:24:33 -0000 @@ -79,10 +79,3 @@ } #endif -void SafeFree(void **p) -{ - if (*p) { - free(*p); - *p = NULL; - } -} Index: src/child.c =================================================================== RCS file: /home/toshi/cvs/kon2/src/child.c,v retrieving revision 1.1.1.2 diff -u -r1.1.1.2 child.c --- src/child.c 30 Sep 2008 08:09:56 -0000 1.1.1.2 +++ src/child.c 23 Oct 2008 09:24:33 -0000 @@ -40,16 +40,18 @@ #include <version.h> #include <vc.h> -static char *startupStr, *execProg; +static char *startupStr = NULL, *execProg = NULL; int ConfigExecProg(const char *string) { + SafeFree(execProg); execProg = strdup(string); return SUCCESS; } static int ConfigStartup(const char *string) { + SafeFree(startupStr); startupStr = strdup(string); return SUCCESS; } @@ -81,7 +83,8 @@ void ChildCleanup(void) { - free(startupStr); + SafeFree(startupStr); + SafeFree(execProg); } void ChildStart(FILE *errfp) @@ -105,46 +108,44 @@ win.ws_col = dInfo.txmax + 1; win.ws_xpixel = win.ws_ypixel = 0; ioctl(STDIN_FILENO, TIOCSWINSZ, &win); - sprintf(buff,"TERM=vt100"); -#endif + strcpy(buff, "TERM=vt100-color"); +#endif /* __FreeBSD__ */ tcap = strdup(buff); putenv(tcap); - if (startupMessage) + if (startupMessage) { printf("\rKON2 Kanji On Console " VERSION - " using VT number %c\r\n" + " using VT number %d\n" "%*s\r\n" -#if defined(__FreeBSD__) - "%*s\r\n", *(ttyname(fileno(errfp))+9), -#else /* linux */ - "%*s\r\n", *(ttyname(fileno(errfp))+8), -#endif + "%*s\r\n", + TermGetNumber(), dInfo.txmax, "Copyright (C) " "1993-1996 Takashi MANABE", dInfo.txmax, "1993, 1994 MAEDA Atusi "); #if defined(__FreeBSD__) - printf("\rKON for FreeBSD-2.x ver0.01 Takashi OGURA\r\n"); + printf("\rKON for FreeBSD-2.x ver0.01 Takashi OGURA\r\n"); #endif - + } /* - printf("KON using VT number %c.\n\n", - *(ttyname(fileno(errfp))+8)); + printf("KON using VT number %d.\n\n", TermGetNumber()); */ fflush(stdout); if (execProg) execlp(execProg, execProg, 0); else { + char *ptr; if ((execProg = getenv("SHELL")) == NULL) execProg = "/bin/sh"; if ((tail = rindex(execProg, '/')) == NULL) tail = " sh"; - sprintf(buff, "-%s", tail + 1); - execl(execProg, buff, 0); + ptr = strdup(tail); + *ptr = '-'; + execl(execProg, ptr, 0); } fprintf(errfp, "KON> couldn't exec shell\r\n"); fprintf(errfp, "%s: %s\r\n", execProg, strerror(errno)); Index: src/errors.c =================================================================== RCS file: /home/toshi/cvs/kon2/src/errors.c,v retrieving revision 1.1.1.1 diff -u -r1.1.1.1 errors.c --- src/errors.c 30 Sep 2008 08:02:59 -0000 1.1.1.1 +++ src/errors.c 23 Oct 2008 09:24:33 -0000 @@ -48,7 +48,7 @@ vfprintf(stderr, format, args); } else { VtEmu(head, strlen(head)); - vsprintf(buf, format, args); + vsnprintf(buf, sizeof(buf), format, args); VtEmu(buf, strlen(buf)); } } Index: src/main.c =================================================================== RCS file: /home/toshi/cvs/kon2/src/main.c,v retrieving revision 1.1.1.2 diff -u -r1.1.1.2 main.c --- src/main.c 30 Sep 2008 08:09:56 -0000 1.1.1.2 +++ src/main.c 23 Oct 2008 09:24:33 -0000 @@ -29,11 +29,45 @@ #include <stdlib.h> #include <unistd.h> +#if defined(__FreeBSD__) +#include <err.h> +#include <osreldate.h> +#if __FreeBSD_version >= 410000 +# include <sys/consio.h> +# include <sys/kbio.h> +#else +# include <machine/console.h> +#endif +#endif /* __FreeBSD__ */ + #include <getcap.h> #include <version.h> #include <term.h> +/* handler for atexit() */ +static void +reset_text_mode(void) +{ + int mode; + +#if defined(__FreeBSD__) + if (ioctl(0, KDGETMODE, &mode) == -1) + warn("ioctl(0, KDGETMODE)"); + else if (mode != KD_TEXT) { + ioctl(0, KDSETMODE, KD_TEXT); + } + +#elif defined(__NetBSD__) + if (ioctl(0, WSDISPLAYIO_GMODE, &mode) == -1) + warn("ioctl(0, WSDISPLAYIO_GMODE)"); + else if (mode != WSDISPLAYIO_MODE_EMUL) { + mode = WSDISPLAYIO_MODE_EMUL; + ioctl(0, WSDISPLAYIO_SMODE, &mode); + } +#endif /* __NetBSD__ */ +} + int main(int argc, const char *argv[]) { char *p; @@ -43,6 +77,7 @@ fprintf(stderr, "can not get I/O permissions.\n"); exit(EXIT_FAILURE); } + atexit(reset_text_mode); ChangeNewConsole(); TermInit(argc - 1, argv + 1); if (ReadConfig(CONFIG_NAME) < 0) { Index: src/mouse.c =================================================================== RCS file: /home/toshi/cvs/kon2/src/mouse.c,v retrieving revision 1.1.1.2 diff -u -r1.1.1.2 mouse.c --- src/mouse.c 30 Sep 2008 08:09:56 -0000 1.1.1.2 +++ src/mouse.c 23 Oct 2008 09:24:33 -0000 @@ -122,11 +122,11 @@ } }; -static int mouseBaud; +static int mouseBaud = B1200; static int ConfigMouseBaud(const char *config) { - int baud; + int baud = 0; sscanf(config, "%d", &baud); @@ -149,19 +149,23 @@ return SUCCESS; } -static char *mouseDev; +static char *mouseDev = NULL; static int ConfigMouseDev(const char *config) { - char name[MAX_COLS]; - sscanf(config, "%s", name); + char *name, *last, *sep = " \t\r\n"; - if (mouseDev) free(mouseDev); + name = strtok_r((char *)config, sep, &last); + if (name == NULL) { + warn("unknown mouse type ignored; assuming no mouse\r\n"); + return SUCCESS; + } + SafeFree(mouseDev); mouseDev = strdup(name); return SUCCESS; } -static int pasteButton; +static int pasteButton = MOUSE_RGT; static int Config3Buttons(const char *config) { @@ -172,12 +176,15 @@ static int ConfigMouse(const char *config) { struct mouseconf *p; - char name[MAX_COLS]; + char *name, *last, *sep = " \t\r\n"; mouseType = MOUSE_NONE; mInfo.has_mouse = FALSE; - strncpy(name, config, MAX_COLS - 1); - name[MAX_COLS - 1] = '\0'; + name = strtok_r((char *)config, sep, &last); + if (name == NULL) { + warn("unknown mouse type ignored; assuming no mouse\r\n"); + return SUCCESS; + } for (p = mice; p->name != NULL; p++) { if (strcasecmp(name, p->name) == 0) { mouseType = p->type; @@ -254,7 +261,7 @@ if ((mfd = open(mouseDev, O_RDWR|O_NONBLOCK)) < 0) { warn("couldn't open mouse device; mouse disabled\n"); Perror(mouseDev); - free(mouseDev); + SafeFree(mouseDev); mouseDev = NULL; mInfo.has_mouse = FALSE; return -1; Index: src/term.c =================================================================== RCS file: /home/toshi/cvs/kon2/src/term.c,v retrieving revision 1.1.1.2 diff -u -r1.1.1.2 term.c --- src/term.c 30 Sep 2008 08:09:56 -0000 1.1.1.2 +++ src/term.c 23 Oct 2008 09:24:33 -0000 @@ -76,7 +76,7 @@ int masterPty; /* master pseudo-tty file descriptor */ -#define MAX_TTYNAME 10 +#define MAX_TTYNAME 20 static int childPid, sockFd, slavePty; static struct termio oldTio; @@ -235,13 +235,16 @@ } ConsoleInit(video); while (i < argc) { - const char *arg; + const char *arg = argv[i]; - if (argv[i][0] != '-') { - warn("bad arg `%s'; assumed `-%s'\r\n", argv[i]); - arg = (char *) argv[i]; - } else - arg = (char *) argv[i] + 1; + if (*arg != '-') + warn("bad arg `%s'; assumed `-%s'\n", arg, arg); + else + ++arg; + if (!strcasecmp(arg, "help")) { + message("Usage: kon2 [video] [-option value] ...\n"); + exit(EXIT_FAILURE); + } i++; if (i >= argc) { error("no value for `%s'\r\n", arg); @@ -258,6 +261,25 @@ static int savedArgc; /* argc of startup time */ static const char **savedArgv; /* argv of startup time */ +static int ttyNumber = 0; + +int +set_vt_number(void) +{ +#if defined(__FreeBSD__) + ttyNumber = strtol(ttyname(0) + 9, NULL, 16); +#elif defined(linux) + ttyNumber = atoi(ttyname(0) + 8); +#endif /* linux */ + return ttyNumber; +} + +int +TermGetNumber(void) +{ + return ttyNumber; +} + /* Do initialization before reading config file */ void TermInit(int argc, const char *argv[]) { @@ -266,6 +288,7 @@ init.display = init.utmp = init.socket = init.termio = FALSE; /* Initialize subsystems. */ + set_vt_number(); CapInit(); ChildInit(); MouseInit(); @@ -355,8 +378,8 @@ mouseFd = MouseStart(); } - chown("/dev/tty0", getuid(), getgid()); #if defined(linux) + chown("/dev/tty0", getuid(), getgid()); sockFd = SocketInit(ttyname(0) + 8); #elif defined(__FreeBSD__) sockFd = SocketInit(ttyname(0) + 9); @@ -381,6 +404,7 @@ /* Signal Setting */ signal(SIGCHLD, ExitPty); + signal(SIGPIPE, SIG_IGN); signal(SIGHUP, ExitTerm); signal(SIGTERM, ExitTerm); signal(SIGSEGV, ExitTerm); @@ -458,18 +482,13 @@ PerrorExit("/dev/console"); } #elif defined(__FreeBSD__) -#if __FreeBSD_version >= 501100 - cfd = open("/dev/ttyv0", O_WRONLY); - if (cfd < 0 && (cfd = open("/dev/ttyv0", O_RDONLY)) < 0) { - PerrorExit("/dev/ttyv0"); - } -#else - cfd = open("/dev/vga", O_WRONLY); - if (cfd < 0 && (cfd = open("/dev/vga", O_RDONLY)) < 0) { - PerrorExit("/dev/vga"); + cfd = open("/dev/vga", O_RDONLY); + if (cfd == -1) { + cfd = open("/dev/console", O_RDONLY); + if (cfd == -1) + PerrorExit("/dev/console"); } -#endif -#endif +#endif /* __FreeBSD__ */ ioctl(cfd, VT_ACTIVATE, orgVtNum); close(cfd); } @@ -486,28 +505,36 @@ cfd = open("/dev/console", O_WRONLY); if (cfd < 0 && (cfd = open("/dev/console", O_RDONLY)) < 0) fatal("can't open /dev/console"); -#elif defined(__FreeBSD__) -#if __FreeBSD_version >= 501100 - cfd = open("/dev/ttyv0", O_WRONLY); - if (cfd < 0 && (cfd = open("/dev/ttyv0", O_RDONLY)) < 0) - fatal("can't open /dev/ttyv0"); -#else - cfd = open("/dev/vga", O_WRONLY); - if (cfd < 0 && (cfd = open("/dev/vga", O_RDONLY)) < 0) - fatal("can't open /dev/vga"); -#endif -#endif + ioctl(cfd, KDGETMODE, &mode); if (mode == KD_TEXT) { close(cfd); return; } -#if defined(linux) ioctl(cfd, VT_GETSTATE, &vts); orgVtNum = vts.v_active; -#endif - ioctl(cfd, VT_OPENQRY, &vtNum); - if (vtNum < 0) + +#elif defined(__FreeBSD__) + /* check for syscons mode */ + if (ioctl(0, KDGETMODE, &mode) == -1) + fatal("KON is require the syscons(4)"); + else if (mode != KD_TEXT) + fatal("unknown terminal mode."); + else if (strcmp(ttyname(0), "/dev/console") != 0) + return; + + cfd = open("/dev/vga", O_RDONLY); + if (cfd == -1) { + cfd = open("/dev/console", O_RDONLY); + if (cfd == -1) + fatal("can't open /dev/console"); + } + if (ioctl(cfd, VT_GETINDEX, &orgVtNum) == -1) + fatal("ioctl(VT_GETINDEX)"); +#endif /* __FreeBSD__ */ + + errno = 0; + if (ioctl(cfd, VT_OPENQRY, &vtNum) == -1 || vtNum < 0) fatal("can't get free VC"); parent = getpid(); if ((child = fork()) == -1) @@ -515,12 +542,13 @@ if (child) { signal(SIGHUP, ExitPty); pause(); + fatal("internal error."); } setsid(); #if defined(linux) sprintf(vtty, "/dev/tty%d", vtNum); #elif defined(__FreeBSD__) - sprintf(vtty, "/dev/ttyv%d", vtNum); + sprintf(vtty, "/dev/ttyv%d", vtNum - 1); #endif if ((vfd = open(vtty, O_RDWR)) < 0) fatal("can't open %s", vtty); @@ -531,5 +559,6 @@ dup2(vfd, 0); dup2(vfd, 1); dup2(vfd, 2); + close(vfd); kill(parent, SIGHUP); } Index: src/vc.c =================================================================== RCS file: /home/toshi/cvs/kon2/src/vc.c,v retrieving revision 1.1.1.2 diff -u -r1.1.1.2 vc.c --- src/vc.c 30 Sep 2008 08:09:56 -0000 1.1.1.2 +++ src/vc.c 23 Oct 2008 09:24:33 -0000 @@ -792,22 +792,21 @@ return SUCCESS; } -static char *videoName; +static char *videoName = NULL; static int ConfigDisplay(const char *config) { struct videoconf *v; - char name[MAX_COLS]; - - sscanf(config, "%s", name); + char *name, *last, *sep = " \t\r\n"; + + name = strtok_r((char *)config, sep, &last); + if (name == NULL) { + error("invalid entry for %s\r\n", videoName); + return FAILURE; + } for (v = videos; v->name != NULL; v++) { if (strcasecmp(name, v->name) == 0) { - config = strchr(config, '\n'); - if (config == NULL) { - error("invalid entry for %s\r\n", videoName); - return FAILURE; - } - if (v->set(&vInfo, config) == FAILURE) + if (v->set(&vInfo, last) == FAILURE) return FAILURE; message("video type `%s' selected\r\n", name); if (vInfo.has_hard_scroll) { @@ -873,6 +872,7 @@ void ConsoleInit(const char *video) { + SafeFree(videoName); videoName = strdup(video); DefineCap(videoName, ConfigDisplay, NULL); DefineCap("BeepCounter", ConfigBeep, "5"); @@ -900,12 +900,12 @@ { scrollLine = textHead = 0; vInfo.detatch(); - SafeFree((void **)&textBuff); - SafeFree((void **)&attrBuff); - SafeFree((void **)&flagBuff); + SafeFree(textBuff); + SafeFree(attrBuff); + SafeFree(flagBuff); #ifdef linux ioperm(COUNTER_ADDR, 1, FALSE); #endif - SafeFree((void **)&videoName); + SafeFree(videoName); } Index: src/vt.c =================================================================== RCS file: /home/toshi/cvs/kon2/src/vt.c,v retrieving revision 1.1.1.2 diff -u -r1.1.1.2 vt.c --- src/vt.c 30 Sep 2008 08:09:56 -0000 1.1.1.2 +++ src/vt.c 23 Oct 2008 09:24:33 -0000 @@ -107,7 +107,7 @@ con.bcol = saveAttr->bcol; tmp = saveAttr; saveAttr = tmp->prev; - free(tmp); + SafeFree(tmp); } } @@ -606,20 +606,23 @@ static int ConfigCoding(const char *confstr) { - char reg[3][MAX_COLS]; + char *name, *last, *sep = " \t\r\n"; int n, i; - *reg[0] = *reg[1] = *reg[2] = '\0'; - sscanf(confstr, "%s %s %s", reg[0], reg[1], reg[2]); - for (i = 0; i < 3 && *reg[i]; i ++) { - n = (int)CodingByRegistry(reg[i]); + name = strtok_r((char *)confstr, sep, &last); + for (i = 0; i < 3; i++) { + if (name == NULL) { + error("invalid coding system\n"); + return FAILURE; + } + n = (int)CodingByRegistry(name); if (n < 0) { - if (!strcasecmp(reg[i], "EUC")) + if (!strcasecmp(name, "EUC")) lInfo.sc = CODE_EUC; - else if (!strcasecmp(reg[i], "SJIS")) + else if (!strcasecmp(name, "SJIS")) lInfo.sc = CODE_SJIS; /* - else if (!strcasecmp(reg[i], "BIG5")) + else if (!strcasecmp(name, "BIG5")) lInfo.sc = CODE_BIG5; */ else @@ -633,6 +636,7 @@ fprintf(fp,"[<%s> %d %d %d %d]\n", reg[i], n, lInfo.sb, lInfo.db, lInfo.sc); fclose(fp);} #endif + name = strtok_r(NULL, sep, &last); } return SUCCESS; } Index: src/display/j31sx.c =================================================================== RCS file: /home/toshi/cvs/kon2/src/display/j31sx.c,v retrieving revision 1.1.1.1 diff -u -r1.1.1.1 j31sx.c --- src/display/j31sx.c 30 Sep 2008 08:02:59 -0000 1.1.1.1 +++ src/display/j31sx.c 23 Oct 2008 09:24:33 -0000 @@ -49,7 +49,6 @@ #include <sys/mman.h> #include <linux/mm.h> #include <sys/kd.h> -#undef free #include <stdlib.h> #include <mem.h> @@ -365,8 +364,6 @@ ioperm(CGA_COLOR, 1, 0); munmap(gram, GRAPH_SIZE); - - SafeFree((void **)&gram); } static struct videoInfo J31SXInfo = Index: src/display/s3.c =================================================================== RCS file: /home/toshi/cvs/kon2/src/display/s3.c,v retrieving revision 1.1.1.1 diff -u -r1.1.1.1 s3.c --- src/display/s3.c 30 Sep 2008 08:02:59 -0000 1.1.1.1 +++ src/display/s3.c 23 Oct 2008 09:24:33 -0000 @@ -43,7 +43,6 @@ #include <sys/mman.h> #include <linux/mm.h> #include <sys/kd.h> -#undef free #include <stdlib.h> #include <mem.h> Index: src/display/svga.c =================================================================== RCS file: /home/toshi/cvs/kon2/src/display/svga.c,v retrieving revision 1.1.1.1 diff -u -r1.1.1.1 svga.c --- src/display/svga.c 30 Sep 2008 08:02:59 -0000 1.1.1.1 +++ src/display/svga.c 23 Oct 2008 09:24:33 -0000 @@ -45,7 +45,6 @@ /* #include <linux/mm.h> */ #include <sys/kd.h> #endif -#undef free #include <stdlib.h> #include <mem.h> Index: src/display/vga.c =================================================================== RCS file: /home/toshi/cvs/kon2/src/display/vga.c,v retrieving revision 1.1.1.2 diff -u -r1.1.1.2 vga.c --- src/display/vga.c 30 Sep 2008 08:09:56 -0000 1.1.1.2 +++ src/display/vga.c 23 Oct 2008 09:24:33 -0000 @@ -56,7 +56,6 @@ #endif vm_size_t page_size; #endif -#undef free #include <stdlib.h> #include <mem.h> @@ -691,10 +690,9 @@ munmap(gramMem, dInfo.gsize); - SafeFree((void **)&gramMem); - SafeFree((void **)&fontBuff1); + SafeFree(fontBuff1); if (savePlane3) - SafeFree((void **)&fontBuff2); + SafeFree(fontBuff2); } /* Configure */ --17pEHd4RhPHOinZp--
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200810251150.m9PBo3ep068016>