#include <sys/types.h>
#include <sys/stat.h>
+#ifndef min
+# define min(a,b) ((a) < (b) ? (a) : (b))
+#endif
+
#define PIDFILE "/tmp/fakesmtp.pid"
#define LINESIZE 1024
if (bytesinbuf > 0 && (p = strchr(buffer, '\r')) &&
*(p + 1) == '\n') {
*p = '\0';
- strncpy(data, buffer, LINESIZE);
- data[LINESIZE - 1] = '\0';
cc = strlen(buffer);
+ memcpy(data, buffer, min(cc + 1, LINESIZE));
+ data[LINESIZE - 1] = '\0';
/*
* Shuffle leftover bytes back to the beginning
* If there is already a "From " line,
* then leave it alone. Else we add one.
*/
- char tmpbuffer[sizeof buffer-7];
+ char tmpbuffer[sizeof buffer-21];
char *tp, *ep;
- strncpy(tmpbuffer, buffer, sizeof(tmpbuffer));
+ (void) strncpy(tmpbuffer, buffer,
+ min(strlen(buffer) + 1,
+ sizeof(tmpbuffer) - 1));
ep = "nobody@nowhere";
tp = dctime(dlocaltimenow());
snprintf (buffer, sizeof(buffer), "From %s %s%s", ep, tp, tmpbuffer);
prefix_len = strlen(prefix);
suffix_len = strlen(suffix);
/* sizeof pattern includes its final NULL, so don't add another. */
- len = directory_len + pathsep_len + prefix_len + sizeof pattern +
- suffix_len;
+ len =
+ directory_len + pathsep_len + prefix_len + sizeof pattern + suffix_len;
if ((template = malloc(len))) {
char *tp = template;
(void) strncpy(tp, prefix, prefix_len);
tp += prefix_len;
- (void) strncpy(tp, pattern, sizeof pattern - 1);
+ (void) memcpy(tp, pattern, sizeof pattern);
tp += sizeof pattern - 1;
(void) strncpy(tp, suffix, suffix_len);
strncpy (response, buffer + LEN(TRM), sizeof(response));
}
else
- strncpy (response, buffer, sizeof(response));
+ strncpy (response, buffer,
+ min (strlen(buffer) + 1, sizeof(response) - 1));
return OK;
}