X-Git-Url: http://cgit.sxemacs.org/?a=blobdiff_plain;f=lib-src%2Fmovemail.c;h=909a7cc1bf8895e142a99625860eab1d6588ca9e;hb=92651d16c6fa315df82af964d387cf1bdd9761f1;hp=219bced0585f0ab6ec2baf01d8c47088c7150cca;hpb=c879e5b17b3d5fef34ab58fc66e1cbb4269e5bb4;p=sxemacs diff --git a/lib-src/movemail.c b/lib-src/movemail.c index 219bced..909a7cc 100644 --- a/lib-src/movemail.c +++ b/lib-src/movemail.c @@ -80,6 +80,8 @@ along with this program. If not, see . #include "../src/regex.h" #endif +#include + extern char *optarg; extern int optind, opterr; @@ -196,7 +198,10 @@ static char *unparse_lock_method(int); int main(int argc, char *argv[]) { - char *inname = 0, *outname = 0, *poppass = 0; + char *inname = 0, *outname = 0; +#if defined MAIL_USE_POP + char *poppass = 0; +#endif /* MAIL_USE_POP */ #ifndef DISABLE_DIRECT_ACCESS int indesc, outdesc; int nread; @@ -234,12 +239,15 @@ int main(int argc, char *argv[]) case 0: break; case 1: /* one of the standard arguments seen */ - if (!inname) + if (!inname) { inname = optarg; - else if (!outname) + } else if (!outname) { outname = optarg; - else +#if defined MAIL_USE_POP + } else { poppass = optarg; +#endif /* MAIL_USE_POP */ + } break; case 'i': /* infile */ @@ -283,12 +291,15 @@ int main(int argc, char *argv[]) } while (optind < argc) { - if (!inname) + if (!inname) { inname = argv[optind]; - else if (!outname) + } else if (!outname) { outname = argv[optind]; - else +#if defined MAIL_USE_POP + } else { poppass = argv[optind]; +#endif /* MAIL_USE_POP */ + } optind++; } @@ -416,16 +427,16 @@ int main(int argc, char *argv[]) { char buf[1024]; - while (1) { nread = read(indesc, buf, sizeof buf); - if (nread != write(outdesc, buf, nread)) { + if (nread < 0 || + nread != write(outdesc, buf, nread)) { int saved_errno = errno; unlink(outname); errno = saved_errno; pfatal_with_name(outname); } - if (nread < (int)sizeof buf) + if (nread < (int)sizeof(buf)) break; } } @@ -446,7 +457,8 @@ int main(int argc, char *argv[]) case FLOCKING: case LOCKING: #ifdef HAVE_FTRUNCATE - ftruncate(indesc, 0L); + if(ftruncate(indesc, 0L)!=0) + pfatal_and_delete(inname); #else close(open(inname, O_CREAT | O_TRUNC | O_RDWR, 0666)); #endif @@ -587,16 +599,20 @@ static void lock_dot(char *filename) /* Give up if cannot do that. */ #ifdef HAVE_MKSTEMP + /* Remove all group and other permissions.. */ + umask(S_IRWXG|S_IRWXO); desc = mkstemp(tempname); #else desc = open(tempname, O_WRONLY | O_CREAT | O_EXCL, 0666); #endif if (desc < 0) { - char *message = (char *)xmalloc(strlen(tempname) + 50); - sprintf(message, - "%s--see source file lib-src/movemail.c", - tempname); + int msz = strlen(tempname) + 50; + char *message = (char *)xmalloc(msz); + int sz = snprintf(message, msz, + "%s--see source file lib-src/movemail.c", + tempname); + assert(sz>=0 && sz < msz); pfatal_with_name(message); } close(desc); @@ -618,6 +634,7 @@ static void lock_dot(char *filename) } } strcpy(dotlock_filename, filename); + free(tempname); } #endif /* not DISABLE_DIRECT_ACCESS */ @@ -671,10 +688,10 @@ static char *concat(char *s1, char *s2, char *s3) int len1 = strlen(s1), len2 = strlen(s2), len3 = strlen(s3); char *result = (char *)xmalloc(len1 + len2 + len3 + 1); - strcpy(result, s1); - strcpy(result + len1, s2); - strcpy(result + len1 + len2, s3); - *(result + len1 + len2 + len3) = 0; + strncpy(result, s1, len1+1); + strncpy(result + len1, s2, len2+1); + strncpy(result + len1 + len2, s3, len3+1); + *(result + len1 + len2 + len3) = '\0'; return result; }