commit ed974584dc2333c95ff73381a62a8fbf90e108d1 from: Markus Uhlin date: Fri Mar 6 01:45:46 2026 UTC Improved mail_file_to_address() commit - 3216929ceb74f6dab10df9014ee08eefdb6283ca commit + ed974584dc2333c95ff73381a62a8fbf90e108d1 blob - 530b9e79bba923238e50412505947f74495a90a7 blob + 2f891ac2b81055d02f696257fc354a63a24acf0c --- FICS/utils.c +++ FICS/utils.c @@ -269,35 +269,52 @@ mail_string_to_user(int p, char *subj, char *str) PUBLIC int mail_file_to_address(char *addr, char *subj, char *fname) { - FILE *fp1, *fp2; + FILE *fp[2] = { NULL, NULL }; char com[1000] = { '\0' }; char tmp[MAX_LINE_SIZE] = { '\0' }; + int ret; /* maybe unused */ - (void) fp2; (void) tmp; #ifdef SENDMAILPROG - snprintf(com, sizeof com, "%s %s\n", SENDMAILPROG, SENDMAILPROG_ARGS); + ret = snprintf(com, sizeof com, "%s %s\n", SENDMAILPROG, + SENDMAILPROG_ARGS); #else - snprintf(com, sizeof com, "%s -s \"%s\" %s < %s&", MAILPROGRAM, subj, - addr, fname); + ret = snprintf(com, sizeof com, "%s -s \"%s\" %s < %s&", MAILPROGRAM, + subj, addr, fname); #endif - if ((fp1 = popen(com, "w")) == NULL) + + if (ret < 0 || (size_t)ret >= sizeof com) { + warnx("%s: command too long", __func__); return -1; + } + + if ((fp[0] = popen(com, "w")) == NULL) + return -1; + #ifdef SENDMAILPROG - if ((fp2 = fopen(fname, "r")) == NULL) { - pclose(fp1); + if ((fp[1] = fopen(fname, "r")) == NULL) { + (void) pclose(fp[0]); return -1; } - fprintf(fp1, "To: %s\nSubject: %s\n", addr, subj); + ret = fprintf(fp[0], "To: %s\nSubject: %s\n", addr, subj); - while (fgets(tmp, sizeof tmp, fp2) != NULL && !feof(fp2)) - fputs(tmp, fp1); - fclose(fp2); + if (ret < 0) + warnx("%s: fprintf() error", __func__); + + while (fgets(tmp, sizeof tmp, fp[1]) != NULL && + fputs(tmp, fp[0]) != EOF) { + /* null */; + } + + if (fclose(fp[1]) != 0) + warn("%s: fclose() error", __func__); #endif - pclose(fp1); + + if (pclose(fp[0]) == -1) + warn("%s: pclose() error", __func__); return 0; }