#include "../src/regex.h"
#endif
+#include <assert.h>
+
extern char *optarg;
extern int optind, opterr;
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;
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 */
}
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++;
}
{
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;
}
}
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
/* 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);
}
}
strcpy(dotlock_filename, filename);
+ free(tempname);
}
#endif /* not DISABLE_DIRECT_ACCESS */
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;
}