summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'app-i18n/kon2/files/kon2-0.3.9b-bufover-fix.patch')
-rw-r--r--app-i18n/kon2/files/kon2-0.3.9b-bufover-fix.patch401
1 files changed, 401 insertions, 0 deletions
diff --git a/app-i18n/kon2/files/kon2-0.3.9b-bufover-fix.patch b/app-i18n/kon2/files/kon2-0.3.9b-bufover-fix.patch
new file mode 100644
index 000000000000..75db3fff8218
--- /dev/null
+++ b/app-i18n/kon2/files/kon2-0.3.9b-bufover-fix.patch
@@ -0,0 +1,401 @@
+diff -ruN kon2-0.3.9b.orig/font/bdf.c kon2-0.3.9b/font/bdf.c
+--- kon2-0.3.9b.orig/font/bdf.c 2003-04-10 15:43:45.000000000 +0900
++++ kon2-0.3.9b/font/bdf.c 2003-04-10 15:43:58.000000000 +0900
+@@ -41,6 +41,12 @@
+ extern struct fontInfo fi;
+ extern forceLoad;
+
++int buffer_error()
++{
++ fprintf(stderr,"buffer overflow\n");
++ exit(1);
++}
++
+ u_char *FontLoadBdf(fp)
+ FILE *fp;
+ {
+@@ -61,23 +67,37 @@
+ p = line + sizeof("FONTBOUNDINGBOX");
+ sscanf(p, "%d %d", &width, &high);
+ } else if (!strncmp("CHARSET_REGISTRY", line, 16)) {
+- p = line + sizeof("CHARSET_REGISTRY");
+- while(*p != '"') p ++;
++ p = line + sizeof("CHARSET_REGISTRY") - 1;
++ while(*p != '"') {
++ p ++;
++ if (p - line > 255) buffer_error();
++ }
+ w = ++p;
+- while(*p != '"') p ++;
++ while(*p != '"') {
++ p ++;
++ if (p - line > 255) buffer_error();
++ }
+ *p = '\0';
+- strcpy(reg, w);
++ strncpy(reg, w, sizeof(reg));
+ } else if (!strncmp("CHARSET_ENCODING", line, 16)) {
+- p = line + sizeof("CHARSET_ENCODING");
+- while(*p != '"') p ++;
++ p = line + sizeof("CHARSET_ENCODING") - 1;
++ while(*p != '"') {
++ p ++;
++ if (p - line > 255) buffer_error();
++ }
+ w = ++p;
+- while(*p != '"') p ++;
++ while(*p != '"') {
++ p ++;
++ if (p - line > 255) buffer_error();
++ }
+ *p = '\0';
+- strcat(reg, "-");
+- strcat(reg, w);
++ if (strlen(reg) + 1 + strlen(w) + 1 < sizeof(reg)) {
++ strcat(reg, "-");
++ strcat(reg, w);
++ } else buffer_error();
+ fi.type = CodingByRegistry(reg);
+ } else if (!num && !strncmp("CHARS ", line, 6)) {
+- p = line + sizeof("CHARS");
++ p = line + sizeof("CHARS") - 1;
+ sscanf(p, "%d", &num);
+ break;
+ }
+@@ -162,3 +182,4 @@
+ exit(0);
+ }
+ #endif
++
+diff -ruN kon2-0.3.9b.orig/kbiff/kbiff.c kon2-0.3.9b/kbiff/kbiff.c
+--- kon2-0.3.9b.orig/kbiff/kbiff.c 2003-04-10 15:43:45.000000000 +0900
++++ kon2-0.3.9b/kbiff/kbiff.c 2003-04-10 15:43:58.000000000 +0900
+@@ -24,13 +24,15 @@
+ time_t old_mtime=0;
+ int n, update=1;
+ struct stat st;
++ int bufflen;
+
+ if ((term = getenv("TERM")) == NULL
+ || (mail = getenv("MAIL")) == NULL) exit(1);
+ setupterm(term, 1, &n);
+ if (n != 1) exit(1);
+ if (!has_status_line) exit(1);
+- if ((buff = calloc(columns + 1, 1)) == NULL) exit(1);
++ bufflen = columns + 1;
++ if ((buff = calloc(bufflen, 1)) == NULL) exit(1);
+ putp(tparm(to_status_line, 0, 0));
+ putp(from_status_line);
+ fflush(stdout);
+@@ -39,14 +41,14 @@
+ while (1) {
+ if (!stat(mail, &st) && st.st_size) {
+ if (st.st_mtime > old_mtime) {
+- sprintf(buff, "New mail received %s",
+- ctime(&st.st_mtime));
++ snprintf(buff, bufflen, "New mail received %s",
++ ctime(&st.st_mtime));
+ update = 1;
+ old_mtime = st.st_mtime;
+ }
+ } else {
+ if (st.st_mtime > old_mtime) {
+- sprintf(buff, "No mail");
++ snprintf(buff, bufflen, "No mail");
+ update = 1;
+ old_mtime = st.st_mtime;
+ }
+diff -ruN kon2-0.3.9b.orig/lib/getcap.c kon2-0.3.9b/lib/getcap.c
+--- kon2-0.3.9b.orig/lib/getcap.c 2003-04-10 15:43:45.000000000 +0900
++++ kon2-0.3.9b/lib/getcap.c 2003-04-10 15:43:58.000000000 +0900
+@@ -73,6 +73,12 @@
+ fprintf(stderr, "cap %s redefined (default %s)\r\n", name,
+ def_value ? def_value : "None");
+ #endif
++ /* release previous value - ukai */
++ if (cp->name)
++ free(cp->name);
++ if (cp->def_value)
++ free(cp->def_value);
++
+ cp->name = strdup(name);
+ cp->func = func;
+ if (def_value)
+@@ -223,6 +229,9 @@
+ /* Protected capability. */
+ return FAILURE;
+ }
++ /* release previous value - ukai */
++ if (cp->arg)
++ free(cp->arg);
+ cp->arg = strdup(value);
+ #ifdef DEBUG
+ fprintf(stderr, "Setting arg for %s to %s\r\n", capName, value);
+@@ -234,15 +243,18 @@
+
+ bool BoolConf(const char *confstr)
+ {
+- char name[MAX_COLS];
+- sscanf(confstr, "%s", name);
++ char *name;
++ name = (char*)malloc(strlen(confstr) + 1);
++ sscanf(confstr, "%s", name); /* its safe because name[strlen(confstr)+1] */
+ if (strcasecmp(name, "On") == 0 ||
+ strcasecmp(name, "True") == 0) {
++ free(name);
+ return TRUE;
+ } else if (strcasecmp(name, "Off") != 0 &&
+ strcasecmp(name, "False") != 0) {
+ fprintf(stderr, "Warning: value `%s' unrecognized as boolean; assuming `Off'\r\r\n",
+ name);
+ }
++ free(name);
+ return FALSE;
+ }
+diff -ruN kon2-0.3.9b.orig/lib/sockface.c kon2-0.3.9b/lib/sockface.c
+--- kon2-0.3.9b.orig/lib/sockface.c 2003-04-10 15:43:45.000000000 +0900
++++ kon2-0.3.9b/lib/sockface.c 2003-04-10 15:43:58.000000000 +0900
+@@ -86,9 +86,11 @@
+ if (ioctl(fd, VT_GETSTATE, &vs) < 0) {
+ return EOF;
+ }
+- sprintf(sa->sa_data, "%s%d", SOCKET_BASENAME, vs.v_active);
++ snprintf(sa->sa_data, sizeof(sa->sa_data),
++ "%s%d", SOCKET_BASENAME, vs.v_active);
+ #elif defined(__FreeBSD__)
+- sprintf(sa->sa_data, "%s", SOCKET_BASENAME);
++ snprintf(sa->sa_data, sizeof(sa->sa_data),
++ "%s", SOCKET_BASENAME);
+ #endif
+ return(0);
+ }
+diff -ruN kon2-0.3.9b.orig/src/child.c kon2-0.3.9b/src/child.c
+--- kon2-0.3.9b.orig/src/child.c 2003-04-10 15:43:45.000000000 +0900
++++ kon2-0.3.9b/src/child.c 2003-04-10 15:43:58.000000000 +0900
+@@ -46,7 +46,12 @@
+ {
+ int i=0;
+ execProg = strdup(string);
+- while(args[i]) execProgArgs[i] = args[i++];
++ for (i = 0; i < 256; i++) {
++ if (args[i])
++ execProgArgs[i] = args[i];
++ else
++ break;
++ }
+ execProgArgs[i]=NULL;
+ return SUCCESS;
+ }
+@@ -63,6 +68,7 @@
+ {
+ char *p;
+
++ /* run as user, not effective user root, see ChildStart() */
+ p = strtok(startupStr, "\n");
+ while(p) {
+ system(p);
+@@ -101,18 +107,19 @@
+ char *shell;
+ setgid(getgid());
+ setuid(getuid());
++ /* run as user, not effective user root */
+
+ RunStartupCmd();
+ #endif
+
+ #if defined(linux)
+ #ifdef MINI_KON
+- strcpy(buff, "TERM=linux");
++ strcpy(buff, "TERM=linux"); /* ok - buff[256] */
+ #else
+- strcpy(buff, "TERM=kon");
++ strcpy(buff, "TERM=kon"); /* ok - buff[256] */
+ #endif
+ #elif defined(__FreeBSD__)
+- sprintf(buff,"TERM=vt100");
++ sprintf(buff,"TERM=vt100"); /* ok - buff[256] */
+ #endif
+
+ tcap = strdup(buff);
+@@ -143,7 +150,7 @@
+ execProg = "/bin/sh";
+ if ((tail = rindex(execProg, '/')) == NULL)
+ tail = " sh";
+- sprintf(buff, "-%s", tail + 1);
++ snprintf(buff, sizeof(buff), "-%s", tail + 1);
+ execl(execProg, buff, 0);
+ }
+ fprintf(errfp, "KON> couldn't exec shell\r\n");
+diff -ruN kon2-0.3.9b.orig/src/errors.c kon2-0.3.9b/src/errors.c
+--- kon2-0.3.9b.orig/src/errors.c 2003-04-10 15:43:45.000000000 +0900
++++ kon2-0.3.9b/src/errors.c 2003-04-10 15:43:58.000000000 +0900
+@@ -50,7 +50,7 @@
+ vfprintf(stderr, format, args);
+ } else {
+ VtEmu(head, strlen(head));
+- vsprintf(buf, format, args);
++ vsnprintf(buf, MAX_MSGLEN, format, args);
+ VtEmu(buf, strlen(buf));
+ }
+ #endif
+diff -ruN kon2-0.3.9b.orig/src/mouse.c kon2-0.3.9b/src/mouse.c
+--- kon2-0.3.9b.orig/src/mouse.c 2003-04-10 15:43:45.000000000 +0900
++++ kon2-0.3.9b/src/mouse.c 2003-04-10 15:43:58.000000000 +0900
+@@ -159,7 +159,7 @@
+ char *name;
+
+ name = malloc(strlen(config) + 1);
+- sscanf(config, "%s", name);
++ sscanf(config, "%s", name); /* ok, name[strlen(config)+1] */
+
+ if (mouseDev) free(mouseDev);
+ mouseDev = strdup(name);
+@@ -183,7 +183,7 @@
+ mouseType = MOUSE_NONE;
+ mInfo.has_mouse = FALSE;
+ name = malloc(strlen(config) + 1);
+- sscanf(config, "%s", name);
++ sscanf(config, "%s", name); /* ok, name[strlen(config)+1] */
+ for (p = mice; p->name != NULL; p++) {
+ if (strcasecmp(name, p->name) == 0) {
+ mouseType = p->type;
+diff -ruN kon2-0.3.9b.orig/src/sock.c kon2-0.3.9b/src/sock.c
+--- kon2-0.3.9b.orig/src/sock.c 2003-04-10 15:43:45.000000000 +0900
++++ kon2-0.3.9b/src/sock.c 2003-04-10 15:43:58.000000000 +0900
+@@ -86,9 +86,9 @@
+ struct sockaddr sinfo;
+
+ #if defined(linux)
+- sprintf(sinfo.sa_data, "/tmp/.kon%s", tty);
++ snprintf(sinfo.sa_data, sizeof(sinfo.sa_data), "/tmp/.kon%s", tty);
+ #elif defined(__FreeBSD__)
+- sprintf(sinfo.sa_data, "/tmp/.kon");
++ snprintf(sinfo.sa_data, sizeof(sinfo.sa_data), "/tmp/.kon");
+ #endif
+ unlink(sinfo.sa_data);
+ if ((sfd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) {
+diff -ruN kon2-0.3.9b.orig/src/term.c kon2-0.3.9b/src/term.c
+--- kon2-0.3.9b.orig/src/term.c 2003-04-10 15:43:45.000000000 +0900
++++ kon2-0.3.9b/src/term.c 2003-04-10 15:43:58.000000000 +0900
+@@ -395,7 +395,7 @@
+ /* Open PTY(master) */
+ for (ls = 'p'; ls <= 's'; ls ++) {
+ for (ln = 0; ln <= 0xF; ln ++) {
+- sprintf(ptyName, "/dev/pty%1c%1x", ls, ln);
++ snprintf(ptyName, sizeof(ptyName), "/dev/pty%1c%1x", ls, ln);
+ if ((masterPty = open(ptyName, O_RDWR)) >= 0) break;
+ }
+ if (masterPty >= 0) break;
+@@ -573,9 +573,9 @@
+ }
+ setsid();
+ #if defined(linux)
+- sprintf(vtty, "/dev/tty%d", vtNum);
++ snprintf(vtty, sizeof(vtty), "/dev/tty%d", vtNum);
+ #elif defined(__FreeBSD__)
+- sprintf(vtty, "/dev/ttyv%d", vtNum);
++ snprintf(vtty, sizeof(vtty), "/dev/ttyv%d", vtNum);
+ #endif
+ if ((vfd = open(vtty, O_RDWR)) < 0)
+ KonFatal("can't open %s", vtty);
+diff -ruN kon2-0.3.9b.orig/src/vc.c kon2-0.3.9b/src/vc.c
+--- kon2-0.3.9b.orig/src/vc.c 2003-04-10 15:43:45.000000000 +0900
++++ kon2-0.3.9b/src/vc.c 2003-04-10 15:43:58.000000000 +0900
+@@ -830,7 +830,7 @@
+ char *name;
+
+ name = malloc(strlen(config) + 1);
+- sscanf(config, "%s", name);
++ sscanf(config, "%s", name); /* ok, name[strlen(config)+1] */
+ for (v = videos; v->name != NULL; v++) {
+ if (strcasecmp(name, v->name) == 0) {
+ config = strchr(config, '\n');
+diff -ruN kon2-0.3.9b.orig/src/vt.c kon2-0.3.9b/src/vt.c
+--- kon2-0.3.9b.orig/src/vt.c 2003-04-10 15:43:45.000000000 +0900
++++ kon2-0.3.9b/src/vt.c 2003-04-10 15:47:21.000000000 +0900
+@@ -212,12 +212,12 @@
+ if (arg == 6) {
+ int x = (con.x < con.xmax) ? con.x : con.xmax;
+ int y = (con.y < con.ymax) ? con.y : con.ymax;
+- sprintf(report, "\x1B[%d;%dR", y + 1, x + 1);
++ snprintf(report, sizeof(report), "\x1B[%d;%dR", y + 1, x + 1);
+ } else if (arg == 5)
+- strcpy(report, "\x1B[0n\0");
++ strcpy(report, "\x1B[0n\0"); /* ok */
+ break;
+ case 'c':
+- if (arg == 0) strcpy(report, "\x1B[?6c\0");
++ if (arg == 0) strcpy(report, "\x1B[?6c\0"); /* ok */
+ break;
+ }
+ write(masterPty, report, strlen(report));
+@@ -303,7 +303,7 @@
+ if (ch >= '0' && ch <= '9') {
+ varg[narg] = (varg[narg] * 10) + (ch - '0');
+ } else if (ch == ';') {
+- /* 引数は MAX_NARG までしかサポートしない!! */
++ /* only support as args less than MAX_NARG */
+ if (narg < MAX_NARG) {
+ narg ++;
+ varg[narg] = 0;
+@@ -688,11 +688,13 @@
+
+ static int ConfigCoding(const char *confstr)
+ {
+- char reg[3][MAX_COLS];
++ char *reg[3];
+ int n, i;
+
++ for (i = 0; i < 3; i++)
++ reg[i] = malloc (strlen (confstr) + 1);
+ *reg[0] = *reg[1] = *reg[2] = '\0';
+- sscanf(confstr, "%s %s %s", reg[0], reg[1], reg[2]);
++ sscanf(confstr, "%s %s %s", reg[0], reg[1], reg[2]); /* safe, enough space allocated for reg[0,1,2] */
+ for (i = 0; i < 3 && *reg[i]; i ++) {
+ n = (int)CodingByRegistry(reg[i]);
+ if (n < 0) {
+diff -ruN kon2-0.3.9b.orig/tools/logto.c kon2-0.3.9b/tools/logto.c
+--- kon2-0.3.9b.orig/tools/logto.c 2003-04-10 15:43:45.000000000 +0900
++++ kon2-0.3.9b/tools/logto.c 2003-04-10 15:43:58.000000000 +0900
+@@ -21,7 +21,7 @@
+ len = 0;
+ } else {
+ getcwd(path, _POSIX_PATH_MAX);
+- sprintf(name, "%s/%s", path, argv[1]);
++ snprintf(name, sizeof(name), "%s/%s", path, argv[1]);
+ len = strlen(name) + 1;
+ }
+ SocketSendStr(s, STR_LOGTO);
+diff -ruN kon2-0.3.9b.orig/tools/newvc.c kon2-0.3.9b/tools/newvc.c
+--- kon2-0.3.9b.orig/tools/newvc.c 2003-04-10 15:43:45.000000000 +0900
++++ kon2-0.3.9b/tools/newvc.c 2003-04-10 15:43:58.000000000 +0900
+@@ -96,7 +96,7 @@
+ if (newVcNum < 0) {
+ error("can't find unused virtual console", NULL);
+ }
+- sprintf(newTtyName, "/dev/tty%d", newVcNum);
++ snprintf(newTtyName, sizeof(newTtyName), "/dev/tty%d", newVcNum);
+
+ setsid();
+
+@@ -135,6 +135,7 @@
+
+ setuid(getuid());
+ setgid(getgid());
++ /* now run as user, not effective uid 0 */
+
+ if ((shell = getenv("SHELL")) == NULL) {
+ shell = "/bin/sh";
+@@ -152,8 +153,10 @@
+
+ command = argv[1];
+ for (i = 1; i < argc; i++) {
+- strncat(cmdBuf, argv[i], MAXCMDLEN);
+- strncat(cmdBuf, " ", MAXCMDLEN);
++ if (strlen(cmdBuf) + strlen(argv[i]) + 2 < sizeof(cmdBuf)) {
++ strcat(cmdBuf, argv[i]);
++ strcat(cmdBuf, " ");
++ }
+ }
+ }
+ newArgv[0] = command;