diff options
Diffstat (limited to 'sysutils/screen/files/patch-src_attacher.c')
-rw-r--r-- | sysutils/screen/files/patch-src_attacher.c | 108 |
1 files changed, 108 insertions, 0 deletions
diff --git a/sysutils/screen/files/patch-src_attacher.c b/sysutils/screen/files/patch-src_attacher.c new file mode 100644 index 000000000000..3dd7d179b3c4 --- /dev/null +++ b/sysutils/screen/files/patch-src_attacher.c @@ -0,0 +1,108 @@ +diff --git attacher.c attacher.c +index f2b60f0..9138176 100644 +--- attacher.c ++++ attacher.c +@@ -431,53 +431,62 @@ void SendCmdMessage(char *sty, char *match, char **av, int query) + sty[FILENAME_MAX] = 0; + if (strlen(sty) > 2 * MAXSTR - 1) + sty[2 * MAXSTR - 1] = 0; +- sprintf(SocketPath + strlen(SocketPath), "/%s", sty); ++ ++ snprintf(SocketPath + strlen(SocketPath), ++ sizeof(SocketPath) - strlen(SocketPath), "/%s", sty); ++ + if ((s = MakeClientSocket(1)) == -1) + exit(1); + } +- memset((char *)&m, 0, sizeof(Message)); ++ ++ memset(&m, 0, sizeof(Message)); + m.type = query ? MSG_QUERY : MSG_COMMAND; ++ + if (attach_tty) { +- strncpy(m.m_tty, attach_tty_is_in_new_ns ? attach_tty_name_in_ns : attach_tty, ARRAY_SIZE(m.m_tty) - 1); +- m.m_tty[ARRAY_SIZE(m.m_tty) - 1] = 0; ++ snprintf(m.m_tty, sizeof(m.m_tty), "%s", ++ attach_tty_is_in_new_ns ? attach_tty_name_in_ns : attach_tty); + } ++ + p = m.m.command.cmd; + n = 0; +- size_t space_left = ARRAY_SIZE(m.m.command.cmd); ++ size_t space_left = sizeof(m.m.command.cmd); + + for (; *av && n < MAXARGS - 1; ++av, ++n) { +- int printed = snprintf(p, space_left, "%s", *av); +- if (printed < 0 || (size_t)printed >= space_left) +- Panic(0, "Total length of the command to send too large.\n"); ++ int printed = snprintf(p, space_left, "%s", *av); ++ if (printed < 0 || (size_t)printed >= space_left) ++ Panic(0, "Total length of the command to send too large.\n"); + +- printed += 1; // add null terminator +- p += printed; +- space_left -= printed; ++ /* move past string and null terminator */ ++ p += printed + 1; ++ space_left -= printed + 1; + } +- *p = 0; ++ ++ *p = '\0'; + m.m.command.nargs = n; +- strncpy(m.m.attach.auser, LoginName, ARRAY_SIZE(m.m.attach.auser) - 1); +- m.m.command.auser[ARRAY_SIZE(m.m.command.auser) - 1] = 0; ++ ++ snprintf(m.m.command.auser, sizeof(m.m.command.auser), "%s", LoginName); + m.protocol_revision = MSG_REVISION; +- strncpy(m.m.command.preselect, preselect ? preselect : "", ARRAY_SIZE(m.m.command.preselect) - 1); +- m.m.command.preselect[ARRAY_SIZE(m.m.command.preselect) - 1] = 0; ++ snprintf(m.m.command.preselect, sizeof(m.m.command.preselect), "%s", ++ preselect ? preselect : ""); + m.m.command.apid = getpid(); ++ + if (query) { + /* Create a server socket so we can get back the result */ + char *sp = SocketPath + strlen(SocketPath); +- char query[] = "-queryX"; + char c; + int r = -1; ++ + for (c = 'A'; c <= 'Z'; c++) { +- query[6] = c; +- strncpy(sp, query, strlen(SocketPath)); ++ snprintf(sp, sizeof(SocketPath) - strlen(SocketPath), ++ "-query%c", c); + if ((r = MakeServerSocket()) >= 0) + break; + } ++ + if (r < 0) { + for (c = '0'; c <= '9'; c++) { +- query[6] = c; +- strncpy(sp, query, strlen(SocketPath)); ++ snprintf(sp, sizeof(SocketPath) - strlen(SocketPath), ++ "-query%c", c); + if ((r = MakeServerSocket()) >= 0) + break; + } +@@ -486,8 +495,8 @@ void SendCmdMessage(char *sty, char *match, char **av, int query) + if (r < 0) + Panic(0, "Could not create a listening socket to read the results."); + +- strncpy(m.m.command.writeback, SocketPath, ARRAY_SIZE(m.m.command.writeback) - 1); +- m.m.command.writeback[ARRAY_SIZE(m.m.command.writeback) - 1] = '\0'; ++ snprintf(m.m.command.writeback, sizeof(m.m.command.writeback), ++ "%s", SocketPath); + + /* Send the message, then wait for a response */ + xsignal(SIGCONT, QueryResultSuccess); +@@ -504,7 +513,7 @@ void SendCmdMessage(char *sty, char *match, char **av, int query) + ReceiveRaw(r); + close(r); + unlink(SocketPath); +- if (QueryResult == 2) /* An error happened */ ++ if (QueryResult == 2) /* An error happened */ + exit(1); + } else { + if (WriteMessage(s, &m)) |