return (-1);
while (!feof(v)) {
- fgets(line, sizeof(line), v);
+ if (fgets(line, sizeof(line), v) == NULL)
+ break;
/* We hit a comment */
if (strchr(line, '#'))
*strchr(line, '#') = 0;
return (1);
while (!feof(a)) {
- fgets(line, sizeof(line), a);
+ if (fgets(line, sizeof(line), a) == NULL)
+ break;
/* We hit a comment */
if (strchr(line, '#'))
*strchr(line, '#') = 0;
config->features = 0;
while (!feof(conf)) {
- fgets(line, sizeof(line), conf);
+ if (fgets(line, sizeof(line), conf) == NULL)
+ break;
/* We hit a comment */
if (strchr(line, '#'))
*strchr(line, '#') = 0;
break;
if (line[0] == '\n')
break;
- write(bounceq.mailfd, line, strlen(line));
+ if ((size_t)write(bounceq.mailfd, line, strlen(line)) != strlen(line))
+ goto fail;
}
if (fsync(bounceq.mailfd) != 0)
goto fail;
{
va_list va;
char cmd[4096];
- ssize_t len = 0;
+ size_t len, pos;
+ int s;
+ ssize_t n;
va_start(va, fmt);
- vsprintf(cmd, fmt, va);
+ s = vsnprintf(cmd, sizeof(cmd) - 2, fmt, va);
+ va_end(va);
+ if (s == sizeof(cmd) - 2 || s < 0)
+ errx(1, "Internal error: oversized command string");
+ /* We *know* there are at least two more bytes available */
+ strcat(cmd, "\r\n");
+ len = strlen(cmd);
if (((config->features & SECURETRANS) != 0) &&
((config->features & NOSSL) == 0)) {
- len = SSL_write(config->ssl, (const char*)cmd, strlen(cmd));
- SSL_write(config->ssl, "\r\n", 2);
+ while ((s = SSL_write(config->ssl, (const char*)cmd, len)) <= 0) {
+ s = SSL_get_error(config->ssl, s);
+ if (s != SSL_ERROR_WANT_READ &&
+ s != SSL_ERROR_WANT_WRITE)
+ return (-1);
+ }
}
else {
- len = write(fd, cmd, strlen(cmd));
- write(fd, "\r\n", 2);
+ pos = 0;
+ while (pos < len) {
+ n = write(fd, cmd + pos, len - pos);
+ if (n < 0)
+ return (-1);
+ pos += n;
+ }
}
- va_end(va);
- return (len+2);
+ return (len);
}
int