ctdl_printf(c, "MIME-Version: 1.0\r");
ctdl_printf(c, "Content-Type: multipart/mixed; boundary=\"%s\"\r", mime_boundary);
ctdl_write(c, HKEY("\r\n"));
- ctdl_write(c, HKEY("\r\n"));
ctdl_printf(c, "--%s\r", mime_boundary); // start of message body
}
for (i=0; i<num_attachments; ++i) {
extract_token(attid, att, i, ',', sizeof(attid));
one_att = pop_upload(attid);
- syslog(LOG_DEBUG, "💥 attachment: %s", one_att.filename);
+
+ // After calling pop_upload(), the attachment is no longer in the global list.
+ // The file descriptor has zero links, so when we close it, the filesystem will remove it from disk.
+
+ syslog(LOG_DEBUG, "💥 attachment: %s , len=%ld", one_att.filename, one_att.length);
ctdl_printf(c, "--%s--\r", mime_boundary);
ctdl_printf(c, "Content-Type: %s; name=\"%s\"\r", one_att.content_type, one_att.filename);
ctdl_printf(c, "Content-Disposition: attachment; filename=\"%s\"\r", one_att.filename);
char *raw_att = malloc(one_att.length);
if (raw_att) {
- fread(raw_att, one_att.length, 1, one_att.fp);
+ rewind(one_att.fp);
+ if (fread(raw_att, one_att.length, 1, one_att.fp) != 1) {
+ syslog(LOG_ERR, "messages: %m");
+ }
// now encode it
-
+ char *encoded_att = malloc((one_att.length * 150) / 100);
+ if (encoded_att) {
+ size_t encoded_length = CtdlEncodeBase64(encoded_att, raw_att, one_att.length, BASE64_YES_LINEBREAKS);
+ ctdl_write(c, encoded_att, encoded_length);
+ syslog(LOG_DEBUG, "Encoded attachment: len=%ld", encoded_length);
+ free(encoded_att);
+ }
+ free(raw_att);
}
fclose(one_att.fp);
u.length = length;
// Write the upload to a file that we can access later when the user saves the message.
+ // tmpfile() creates a file with zero links in the directory, so it will be deleted when it is closed.
u.fp = tmpfile();
if (!u.fp) {
syslog(LOG_ERR, "upload: %m");
return;
}
- fwrite(content, length, 1, u.fp); // this file will be deleted by the OS when it is closed
+ if (fwrite(content, length, 1, u.fp) != 1) {
+ syslog(LOG_ERR, "upload: %m");
+ fclose(u.fp);
+ return;
+ }
// Add it to the list of uploads the server is holding.
pthread_mutex_lock(&upload_list_mutex);