Paul Eggert
2001-Sep-28 18:47 UTC
openssh-2.9.9p2 assumes pid_t, uid_t, etc. are not 'long'
openssh-2.9.9p2 assumes that pid_t, uid_t, gid_t, and mode_t are no wider than int. GCC complains about this assumption on 32-bit Solaris 8 sparc, where these types are 'long', not 'int'. This isn't an actual problem at runtime on this host, as long and int are the same width, but it is a problem on other hosts where pid_t is wider than int. E.g., I've heard that 64-bit AIX has 64-bit pid_t in some compilation environments. Here is a patch. 2001-09-28 Paul Eggert <eggert at twinsun.com> * authfile.c (key_perm_ok): Work even if system integer types are 'long', not 'int'. * entropy.c (prng_check_seedfile, prng_write_seedfile, prng_read_seedfile): Likewise. * serverloop.c (server_loop, server_loop2): Likewise. * session.c (session_dump, session_by_pid, session_exit_message, session_close_by_pid, session_have_children, session_close_by_channel): Likewise. * ssh-agent.c, sshd.c (main): Likewise. * sshpty.c (pty_setowner): Likewise. * uidswap.c: (temporarily_use_uid): Likewise. ==================================================================RCS file: authfile.c,v retrieving revision 2.9.9.2 retrieving revision 2.9.9.2.0.1 diff -pu -r2.9.9.2 -r2.9.9.2.0.1 --- authfile.c 2001/09/23 13:53:22 2.9.9.2 +++ authfile.c 2001/09/28 18:37:50 2.9.9.2.0.1 @@ -501,7 +501,7 @@ key_perm_ok(int fd, const char *filename error("@ WARNING: UNPROTECTED PRIVATE KEY FILE! @"); error("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"); error("Permissions 0%3.3o for '%s' are too open.", - st.st_mode & 0777, filename); + (int) (st.st_mode & 0777), filename); error("It is recommended that your private key files are NOT accessible by others."); error("This private key will be ignored."); return 0; ==================================================================RCS file: entropy.c,v retrieving revision 2.9 retrieving revision 2.9.9.2.0.1 diff -pu -r2.9 -r2.9.9.2.0.1 --- entropy.c 2001/08/06 06:51:49 2.9 +++ entropy.c 2001/09/28 18:37:50 2.9.9.2.0.1 @@ -596,8 +596,8 @@ prng_check_seedfile(char *filename) { /* mode 0600, owned by root or the current user? */ if (((st.st_mode & 0177) != 0) || !(st.st_uid == original_uid)) { - debug("WARNING: PRNG seedfile %.100s must be mode 0600, owned by uid %d", - filename, getuid()); + debug("WARNING: PRNG seedfile %.100s must be mode 0600, owned by uid %ld", + filename, (long)getuid()); return(0); } @@ -621,8 +621,8 @@ prng_write_seedfile(void) { pw = getpwuid(original_uid); if (pw == NULL) - fatal("Couldn't get password entry for current user (%i): %s", - original_uid, strerror(errno)); + fatal("Couldn't get password entry for current user (%ld): %s", + (long)original_uid, strerror(errno)); /* Try to ensure that the parent directory is there */ snprintf(filename, sizeof(filename), "%.512s/%s", pw->pw_dir, @@ -660,8 +660,8 @@ prng_read_seedfile(void) { pw = getpwuid(original_uid); if (pw == NULL) - fatal("Couldn't get password entry for current user (%i): %s", - original_uid, strerror(errno)); + fatal("Couldn't get password entry for current user (%ld): %s", + (long)original_uid, strerror(errno)); snprintf(filename, sizeof(filename), "%.512s/%s", pw->pw_dir, SSH_PRNG_SEED_FILE); ==================================================================RCS file: serverloop.c,v retrieving revision 2.9.9.2 retrieving revision 2.9.9.2.0.1 diff -pu -r2.9.9.2 -r2.9.9.2.0.1 --- serverloop.c 2001/09/18 05:53:13 2.9.9.2 +++ serverloop.c 2001/09/28 18:37:50 2.9.9.2.0.1 @@ -631,8 +631,8 @@ server_loop(pid_t pid, int fdin_arg, int if (wait_pid == -1) packet_disconnect("wait: %.100s", strerror(errno)); else if (wait_pid != pid) - error("Strange, wait returned pid %d, expected %d", - wait_pid, pid); + error("Strange, wait returned pid %ld, expected %ld", + (long)wait_pid, (long)pid); /* Check if it exited normally. */ if (WIFEXITED(wait_status)) { @@ -730,7 +730,7 @@ server_loop2(Authctxt *authctxt) if (pid > 0) session_close_by_pid(pid, status); else { - error("waitpid returned %d: %s", pid, strerror(errno)); + error("waitpid returned %ld: %s", (long)pid, strerror(errno)); break; } } ==================================================================RCS file: session.c,v retrieving revision 2.9.9.2.0.1 retrieving revision 2.9.9.2.0.2 diff -pu -r2.9.9.2.0.1 -r2.9.9.2.0.2 --- session.c 2001/09/28 18:17:11 2.9.9.2.0.1 +++ session.c 2001/09/28 18:37:50 2.9.9.2.0.2 @@ -1539,12 +1539,12 @@ session_dump(void) int i; for(i = 0; i < MAX_SESSIONS; i++) { Session *s = &sessions[i]; - debug("dump: used %d session %d %p channel %d pid %d", + debug("dump: used %d session %d %p channel %d pid %ld", s->used, s->self, s, s->chanid, - s->pid); + (long)s->pid); } } @@ -1586,13 +1586,13 @@ static Session * session_by_pid(pid_t pid) { int i; - debug("session_by_pid: pid %d", pid); + debug("session_by_pid: pid %ld", (long)pid); for(i = 0; i < MAX_SESSIONS; i++) { Session *s = &sessions[i]; if (s->used && s->pid == pid) return s; } - error("session_by_pid: unknown pid %d", pid); + error("session_by_pid: unknown pid %ld", (long)pid); session_dump(); return NULL; } @@ -1874,8 +1874,8 @@ session_exit_message(Session *s, int sta if (c == NULL) fatal("session_exit_message: session %d: no channel %d", s->self, s->chanid); - debug("session_exit_message: session %d channel %d pid %d", - s->self, s->chanid, s->pid); + debug("session_exit_message: session %d channel %d pid %ld", + s->self, s->chanid, (long)s->pid); if (WIFEXITED(status)) { channel_request_start(s->chanid, @@ -1916,7 +1916,7 @@ session_exit_message(Session *s, int sta static void session_close(Session *s) { - debug("session_close: session %d pid %d", s->self, s->pid); + debug("session_close: session %d pid %ld", s->self, (long)s->pid); if (s->ttyfd != -1) { fatal_remove_cleanup(session_pty_cleanup, (void *)s); session_pty_cleanup(s); @@ -1938,7 +1938,7 @@ session_close_by_pid(pid_t pid, int stat { Session *s = session_by_pid(pid); if (s == NULL) { - debug("session_close_by_pid: no session for pid %d", pid); + debug("session_close_by_pid: no session for pid %ld", (long)pid); return; } if (s->chanid != -1) @@ -1954,7 +1954,7 @@ session_have_children(void) for(i = 0; i < MAX_SESSIONS; i++) { Session *s = &sessions[i]; if (s->used && s->pid != -1) { - debug("session_have_children: id %d pid %d", i, s->pid); + debug("session_have_children: id %d pid %ld", i, (long)s->pid); return 1; } } @@ -1978,15 +1978,15 @@ session_close_by_channel(int id, void *a channel_cancel_cleanup(s->chanid); s->chanid = -1; - debug("session_close_by_channel: channel %d kill %d", id, s->pid); + debug("session_close_by_channel: channel %d kill %ld", id, (long)s->pid); if (s->pid == 0) { /* close session immediately */ session_close(s); } else { /* notify child, delay session cleanup */ if (kill(s->pid, (s->ttyfd == -1) ? SIGTERM : SIGHUP) < 0) - error("session_close_by_channel: kill %d: %s", - s->pid, strerror(errno)); + error("session_close_by_channel: kill %ld: %s", + (long)s->pid, strerror(errno)); } } ==================================================================RCS file: ssh-agent.c,v retrieving revision 2.9.9.2 retrieving revision 2.9.9.2.0.1 diff -pu -r2.9.9.2 -r2.9.9.2.0.1 --- ssh-agent.c 2001/08/06 22:06:35 2.9.9.2 +++ ssh-agent.c 2001/09/28 18:37:50 2.9.9.2.0.1 @@ -912,7 +912,7 @@ main(int ac, char **av) format = c_flag ? "unsetenv %s;\n" : "unset %s;\n"; printf(format, SSH_AUTHSOCKET_ENV_NAME); printf(format, SSH_AGENTPID_ENV_NAME); - printf("echo Agent pid %d killed;\n", pid); + printf("echo Agent pid %ld killed;\n", (long)pid); exit(0); } parent_pid = getpid(); @@ -965,7 +965,7 @@ main(int ac, char **av) format = c_flag ? "setenv %s %s;\n" : "%s=%s; export %s;\n"; printf(format, SSH_AUTHSOCKET_ENV_NAME, socket_name, SSH_AUTHSOCKET_ENV_NAME); - printf("echo Agent pid %d;\n", parent_pid); + printf("echo Agent pid %ld;\n", (long)parent_pid); goto skip; } pid = fork(); @@ -982,7 +982,7 @@ main(int ac, char **av) SSH_AUTHSOCKET_ENV_NAME); printf(format, SSH_AGENTPID_ENV_NAME, pidstrbuf, SSH_AGENTPID_ENV_NAME); - printf("echo Agent pid %d;\n", pid); + printf("echo Agent pid %ld;\n", (long)pid); exit(0); } if (setenv(SSH_AUTHSOCKET_ENV_NAME, socket_name, 1) == -1 || ==================================================================RCS file: sshd.c,v retrieving revision 2.9.9.2 retrieving revision 2.9.9.2.0.1 diff -pu -r2.9.9.2 -r2.9.9.2.0.1 --- sshd.c 2001/09/18 04:03:04 2.9.9.2 +++ sshd.c 2001/09/28 18:37:50 2.9.9.2.0.1 @@ -1068,7 +1068,7 @@ main(int ac, char **av) if (pid < 0) error("fork: %.100s", strerror(errno)); else - debug("Forked child %d.", pid); + debug("Forked child %ld.", (long)pid); close(startup_p[1]); ==================================================================RCS file: sshpty.c,v retrieving revision 2.9.9.2 retrieving revision 2.9.9.2.0.1 diff -pu -r2.9.9.2 -r2.9.9.2.0.1 --- sshpty.c 2001/08/14 20:41:35 2.9.9.2 +++ sshpty.c 2001/09/28 18:37:50 2.9.9.2.0.1 @@ -381,12 +381,12 @@ pty_setowner(struct passwd *pw, const ch if (chown(ttyname, pw->pw_uid, gid) < 0) { if (errno == EROFS && (st.st_uid == pw->pw_uid || st.st_uid == 0)) - error("chown(%.100s, %d, %d) failed: %.100s", - ttyname, pw->pw_uid, gid, + error("chown(%.100s, %ld, %ld) failed: %.100s", + ttyname, (long)pw->pw_uid, (long)gid, strerror(errno)); else - fatal("chown(%.100s, %d, %d) failed: %.100s", - ttyname, pw->pw_uid, gid, + fatal("chown(%.100s, %ld, %ld) failed: %.100s", + ttyname, (long)pw->pw_uid, (long)gid, strerror(errno)); } } @@ -395,11 +395,11 @@ pty_setowner(struct passwd *pw, const ch if (chmod(ttyname, mode) < 0) { if (errno == EROFS && (st.st_mode & (S_IRGRP | S_IROTH)) == 0) - error("chmod(%.100s, 0%o) failed: %.100s", - ttyname, mode, strerror(errno)); + error("chmod(%.100s, 0%lo) failed: %.100s", + ttyname, (long)mode, strerror(errno)); else - fatal("chmod(%.100s, 0%o) failed: %.100s", - ttyname, mode, strerror(errno)); + fatal("chmod(%.100s, 0%lo) failed: %.100s", + ttyname, (long)mode, strerror(errno)); } } } ==================================================================RCS file: uidswap.c,v retrieving revision 2.9.9.2 retrieving revision 2.9.9.2.0.1 diff -pu -r2.9.9.2 -r2.9.9.2.0.1 --- uidswap.c 2001/08/15 23:17:22 2.9.9.2 +++ uidswap.c 2001/09/28 18:37:50 2.9.9.2.0.1 @@ -52,8 +52,8 @@ temporarily_use_uid(struct passwd *pw) #ifdef SAVED_IDS_WORK_WITH_SETEUID saved_euid = geteuid(); saved_egid = getegid(); - debug("temporarily_use_uid: %d/%d (e=%d)", - pw->pw_uid, pw->pw_gid, saved_euid); + debug("temporarily_use_uid: %ld/%ld (e=%ld)", + (long)pw->pw_uid, (long)pw->pw_gid, (long)saved_euid); if (saved_euid != 0) { privileged = 0; return;
Wayne Davison
2001-Sep-29 20:06 UTC
openssh-2.9.9p2 assumes pid_t, uid_t, etc. are not 'long'
On Fri, 28 Sep 2001, Paul Eggert wrote:> openssh-2.9.9p2 assumes that pid_t, uid_t, gid_t, and mode_t are no > wider than int.I submitted a patch for this back on April 4th and it has yet to be applied. At the time I heard an objection that these types are required to be "int" by POSIX, but from everything I can see, that is not the case. For instance, check out this page from the SUS2 spec (a superset of POSIX) that is available online (unlike POSIX): http://www.opengroup.org/onlinepubs/007908799/xsh/systypes.h.html The key spot on that page is this: blksize_t, pid_t and ssize_t are signed integral types This is consistent with what I've heard from people who have the POSIX spec as a reference. So, I still believe that this patch needs to be applied. If the portable branch wants to keep things close to the BSD version, then we should get the BSD version to apply this patch -- it may not be needed for BSD, but it won't hurt the BSD version to cast an int to a long and use %ld. ..wayne..
Possibly Parallel Threads
- compiler warnings about format strings
- openssh-2.9.9p2 subscript violation problems with ctype macros
- openssh-2.9.9p2 session.c uses two undeclared void functions
- ssh drops privs when it can't find ~/.ssh/prng_seed
- functions : server_input_channel_req userauth_pubkey