From: Jeremy Harris Date: Mon, 29 Jul 2024 16:26:37 +0000 (+0100) Subject: Log & debug: care with 64b PIDs X-Git-Url: https://git.exim.org/exim.git/commitdiff_plain/6f3d774993c37967d5ad236691a194a40cc9da3f Log & debug: care with 64b PIDs --- diff --git a/src/src/daemon.c b/src/src/daemon.c index f3c49e25e..823c91937 100644 --- a/src/src/daemon.c +++ b/src/src/daemon.c @@ -898,7 +898,7 @@ while ((pid = waitpid(-1, &status, WNOHANG)) > 0) { DEBUG(D_any) { - debug_printf("child %d ended: status=0x%x\n", (int)pid, status); + debug_printf("child %ld ended: status=0x%x\n", (long)pid, status); #ifdef WCOREDUMP if (WIFEXITED(status)) debug_printf(" normal exit, %d\n", WEXITSTATUS(status)); @@ -986,7 +986,7 @@ static BOOL operate_on_pid_file(const enum pid_op operation, const pid_t pid) { char pid_line[sizeof(int) * 3 + 2]; -const int pid_len = snprintf(pid_line, sizeof(pid_line), "%d\n", (int)pid); +const int pid_len = snprintf(pid_line, sizeof(pid_line), "%ld\n", (long)pid); BOOL lines_match = FALSE; uschar * path, * base, * dir; @@ -1116,7 +1116,7 @@ since we may require privs for the containing directory */ static void daemon_die(void) { -int pid; +pid_t pid; DEBUG(D_any) debug_printf("SIGTERM/SIGINT seen\n"); #if !defined(DISABLE_TLS) && (defined(EXIM_HAVE_INOTIFY) || defined(EXIM_HAVE_KEVENT)) @@ -1324,8 +1324,8 @@ for (struct cmsghdr * cp = CMSG_FIRSTHDR(&msg); struct ucred * cr = (struct ucred *) CMSG_DATA(cp); if (cr->uid && cr->uid != exim_uid) { - DEBUG(D_queue_run) debug_printf("%s: sender creds pid %d uid %d gid %d\n", - __FUNCTION__, (int)cr->pid, (int)cr->uid, (int)cr->gid); + DEBUG(D_queue_run) debug_printf("%s: sender creds pid %ld uid %d gid %d\n", + __FUNCTION__, (long)cr->pid, (int)cr->uid, (int)cr->gid); } # elif defined(LOCAL_CREDS) /* BSD-ish */ struct sockcred * cr = (struct sockcred *) CMSG_DATA(cp); @@ -2435,7 +2435,7 @@ if (f.inetd_wait_mode) sprintf(CS p, "with no wait timeout"); log_write(0, LOG_MAIN, - "exim %s daemon started: pid=%d, launched with listening socket, %s", + "exim %s daemon started: pid=%ld, launched with listening socket, %s", version_string, getpid(), big_buffer); set_process_info("daemon(%s): pre-listening socket", version_string); @@ -2541,7 +2541,7 @@ else if (f.daemon_listen) } log_write(0, LOG_MAIN, - "exim %s daemon started: pid=%d, %s, listening for %s", + "exim %s daemon started: pid=%ld, %s, listening for %s", version_string, getpid(), qinfo, big_buffer); set_process_info("daemon(%s): %s, listening for %s", version_string, qinfo, big_buffer); @@ -2551,7 +2551,7 @@ else /* no listening sockets, only queue-runs */ { const uschar * s = describe_queue_runners(); log_write(0, LOG_MAIN, - "exim %s daemon started: pid=%d, %s, not listening for SMTP", + "exim %s daemon started: pid=%ld, %s, not listening for SMTP", version_string, getpid(), s); set_process_info("daemon(%s): %s, not listening", version_string, s); } @@ -2872,7 +2872,7 @@ for (;;) if (sighup_seen) { - log_write(0, LOG_MAIN, "pid %d: SIGHUP received: re-exec daemon", + log_write(0, LOG_MAIN, "pid %ld: SIGHUP received: re-exec daemon", getpid()); close_daemon_sockets(daemon_notifier_fd, fd_polls, listen_socket_count); unlink_notifier_socket(); @@ -2881,7 +2881,7 @@ for (;;) sighup_argv[0] = exim_path; exim_nullstd(); execv(CS exim_path, (char *const *)sighup_argv); - log_write(0, LOG_MAIN|LOG_PANIC_DIE, "pid %d: exec of %s failed: %s", + log_write(0, LOG_MAIN|LOG_PANIC_DIE, "pid %ld: exec of %s failed: %s", getpid(), exim_path, strerror(errno)); log_close_all(); } diff --git a/src/src/deliver.c b/src/src/deliver.c index ef2800efe..9d26d07c0 100644 --- a/src/src/deliver.c +++ b/src/src/deliver.c @@ -2246,7 +2246,7 @@ if ( !shadowing addr->return_filename = spool_fname(US"msglog", message_subdir, message_id, - string_sprintf("-%d-%d", getpid(), return_count++)); + string_sprintf("-%ld-%d", (long)getpid(), return_count++)); if ((addr->return_file = open_msglog_file(addr->return_filename, 0400, &error)) < 0) { @@ -3347,8 +3347,8 @@ same channel (pipe). */ -DEBUG(D_deliver) debug_printf("reading pipe for subprocess %d (%s)\n", - (int)p->pid, eop? "ended" : "not ended yet"); +DEBUG(D_deliver) debug_printf("reading pipe for subprocess %ld (%s)\n", + (long)p->pid, eop? "ended" : "not ended yet"); while (!done) { @@ -3360,8 +3360,9 @@ while (!done) size_t required = PIPE_HEADER_SIZE; /* first the pipehaeder, later the data */ ssize_t got; - DEBUG(D_deliver) debug_printf( - "expect %lu bytes (pipeheader) from tpt process %d\n", (u_long)required, pid); + DEBUG(D_deliver) + debug_printf("expect %lu bytes (pipeheader) from tpt process %ld\n", + (u_long)required, (long)pid); /* We require(!) all the PIPE_HEADER_SIZE bytes here, as we know, they're written in a timely manner, so waiting for the write shouldn't hurt a lot. @@ -3371,16 +3372,16 @@ while (!done) if ((got = readn(fd, pipeheader, required)) != required) { msg = string_sprintf("got " SSIZE_T_FMT " of %d bytes (pipeheader) " - "from transport process %d for transport %s", - got, PIPE_HEADER_SIZE, pid, addr->transport->driver_name); + "from transport process %ld for transport %s", + got, PIPE_HEADER_SIZE, (long)pid, addr->transport->driver_name); done = TRUE; break; } pipeheader[PIPE_HEADER_SIZE] = '\0'; DEBUG(D_deliver) - debug_printf("got %ld bytes (pipeheader) '%c' from transport process %d\n", - (long) got, *id, pid); + debug_printf("got %ld bytes (pipeheader) '%c' from transport process %ld\n", + (long) got, *id, (long)pid); { /* If we can't decode the pipeheader, the subprocess seems to have a @@ -3390,16 +3391,16 @@ while (!done) if (*endc) { msg = string_sprintf("failed to read pipe " - "from transport process %d for transport %s: error decoding size from header", - pid, addr->transport->driver_name); + "from transport process %ld for transport %s: error decoding size from header", + (long)pid, addr ? addr->transport->driver_name : US"?"); done = TRUE; break; } } DEBUG(D_deliver) - debug_printf("expect %lu bytes (pipedata) from transport process %d\n", - (u_long)required, pid); + debug_printf("expect %lu bytes (pipedata) from transport process %ld\n", + (u_long)required, (long)pid); /* Same as above, the transport process will write the bytes announced in a timely manner, so we can just wait for the bytes, getting less than expected @@ -3407,8 +3408,8 @@ while (!done) if ((got = readn(fd, big_buffer, required)) != required) { msg = string_sprintf("got only " SSIZE_T_FMT " of " SIZE_T_FMT - " bytes (pipedata) from transport process %d for transport %s", - got, required, pid, addr->transport->driver_name); + " bytes (pipedata) from transport process %ld for transport %s", + got, required, (long)pid, addr->transport->driver_name); done = TRUE; break; } @@ -3597,8 +3598,8 @@ while (!done) { ADDR_MISMATCH: msg = string_sprintf("address count mismatch for data read from pipe " - "for transport process %d for transport %s", pid, - addrlist->transport->driver_name); + "for transport process %ld for transport %s", + (long)pid, addrlist->transport->driver_name); done = TRUE; break; } @@ -3742,8 +3743,8 @@ while (!done) close(recvd_fd); DEBUG(D_deliver) - debug_printf("continue: tpt '%s' host '%s' addr '%s' seq %d\n", - continue_transport, continue_hostname, + debug_printf("continue: fd %d tpt %s host '%s' addr '%s' seq %d\n", + recvd_fd, continue_transport, continue_hostname, continue_host_address, continue_sequence); break; } @@ -3785,8 +3786,8 @@ while (!done) default: msg = string_sprintf("malformed data (%d) read from pipe for transport " - "process %d for transport %s", ptr[-1], pid, - addr->transport->driver_name); + "process %ld for transport %s", ptr[-1], (long)pid, + addr ? addr->transport->driver_name : US"?"); done = TRUE; break; } @@ -3819,7 +3820,7 @@ something is wrong. */ if (!msg && addr) msg = string_sprintf("insufficient address data read from pipe " - "for transport process %d for transport %s", pid, + "for transport process %ld for transport %s", (long)pid, addr->transport->driver_name); /* If an error message is set, something has gone wrong in getting back @@ -3831,7 +3832,8 @@ if (msg) addr->transport_return = DEFER; addr->special_action = SPECIAL_FREEZE; addr->message = msg; - log_write(0, LOG_MAIN|LOG_PANIC, "Delivery status for %s: %s\n", addr->address, addr->message); + log_write(0, LOG_MAIN|LOG_PANIC, "Delivery status for %s: %s\n", + addr->address, addr->message); } /* Return TRUE to indicate we have got all we need from this process, even @@ -4024,8 +4026,8 @@ for (;;) /* Normally we do not repeat this loop */ { if ((pid = parlist[poffset].pid) != 0 && kill(pid, 0) == 0) { - DEBUG(D_deliver) debug_printf("process %d still exists: assume " - "stolen by strace\n", (int)pid); + DEBUG(D_deliver) debug_printf("process %ld still exists: assume " + "stolen by strace\n", (long)pid); break; /* With poffset set */ } } @@ -4086,8 +4088,8 @@ for (;;) /* Normally we do not repeat this loop */ if (endedpid == pid) goto PROCESS_DONE; if (endedpid != (pid_t)(-1) || errno != EINTR) log_write(0, LOG_MAIN|LOG_PANIC_DIE, "Unexpected error return " - "%d (errno = %d) from waitpid() for process %d", - (int)endedpid, errno, (int)pid); + "%d (errno = %d) from waitpid() for process %ld", + (int)endedpid, errno, (long)pid); } } } @@ -4109,8 +4111,8 @@ for (;;) /* Normally we do not repeat this loop */ /* This situation is an error, but it's probably better to carry on looking for another process than to give up (as we used to do). */ - log_write(0, LOG_MAIN|LOG_PANIC, "Process %d finished: not found in remote " - "transport process list", pid); + log_write(0, LOG_MAIN|LOG_PANIC, "Process %ld finished: not found in remote " + "transport process list", (long)pid); } /* End of the "for" loop */ /* Come here when all the data was completely read after a poll(), and @@ -4121,9 +4123,9 @@ PROCESS_DONE: DEBUG(D_deliver) { if (status == 0) - debug_printf("remote delivery process %d ended\n", (int)pid); + debug_printf("remote delivery process %ld ended\n", (long)pid); else - debug_printf("remote delivery process %d ended: status=%04x\n", (int)pid, + debug_printf("remote delivery process %ld ended: status=%04x\n", (long)pid, status); } @@ -5837,9 +5839,9 @@ if (!(bounce_recipient = addr_failed->prop.errors_address)) /* Make a subprocess to send a message, using its stdin */ if ((pid = child_open_exim(&fd, US"bounce-message")) < 0) - log_write(0, LOG_MAIN|LOG_PANIC_DIE, "Process %d (parent %d) failed to " - "create child process to send failure message: %s", getpid(), - getppid(), strerror(errno)); + log_write(0, LOG_MAIN|LOG_PANIC_DIE, "Process %ld (parent %ld) failed to " + "create child process to send failure message: %s", + (long)getpid(), (long)getppid(), strerror(errno)); /* Creation of child succeeded */ @@ -6489,13 +6491,13 @@ if (addr_senddsn) int fd; pid_t pid = child_open_exim(&fd, US"DSN"); - DEBUG(D_deliver) debug_printf("DSN: child_open_exim returns: %d\n", pid); + DEBUG(D_deliver) debug_printf("DSN: child_open_exim returns: %ld\n", (long)pid); if (pid < 0) /* Creation of child failed */ { - log_write(0, LOG_MAIN|LOG_PANIC_DIE, "Process %d (parent %d) failed to " - "create child process to send success-dsn message: %s", getpid(), - getppid(), strerror(errno)); + log_write(0, LOG_MAIN|LOG_PANIC_DIE, "Process %ld (parent %ld) failed to " + "create child process to send success-dsn message: %s", + (long)getpid(), (long)getppid(), strerror(errno)); DEBUG(D_deliver) debug_printf("DSN: child_open_exim failed\n"); } @@ -6656,7 +6658,7 @@ report_time_since(×tamp_startup, US"delivery start"); /* testcase 0022, 210 info = queue_run_pid == (pid_t)0 ? string_sprintf("delivering %s", id) - : string_sprintf("delivering %s (queue run pid %d)", id, queue_run_pid); + : string_sprintf("delivering %s (queue run pid %ld)", id, (long)queue_run_pid); /* If the D_process_info bit is on, set_process_info() will output debugging information. If not, we want to show this initial information if D_deliver or