diff options
author | Stef Walter <stef@memberwebs.com> | 2005-08-25 19:06:47 +0000 |
---|---|---|
committer | Stef Walter <stef@memberwebs.com> | 2005-08-25 19:06:47 +0000 |
commit | a861a0200b526ec48a0eebc9abaededa04b72318 (patch) | |
tree | a023a6b182febf07b87f552c4056240ac6ee754c /common/smtppass.c | |
parent | 9d2890bf108060d61081c2dc34962bd55978decc (diff) |
Support embedded nulls in email data.
Diffstat (limited to 'common/smtppass.c')
-rw-r--r-- | common/smtppass.c | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/common/smtppass.c b/common/smtppass.c index 0ea9ca5..e94f95e 100644 --- a/common/smtppass.c +++ b/common/smtppass.c @@ -38,6 +38,8 @@ * Olivier Beyssac <ob@r14.freenix.org> */ +#define _GNU_SOURCE + #include <sys/time.h> #include <sys/types.h> #include <sys/socket.h> @@ -1478,15 +1480,21 @@ int sp_done_data(spctx_t* ctx) FILE* file = 0; int had_header = 0; int ret = 0; - char line[SP_LINE_LENGTH]; + char *line; char header[MAX_HEADER_LENGTH]; - size_t header_len; + size_t header_len, line_len; + ssize_t rc; ASSERT(ctx->cachename[0]); /* Must still be around */ ASSERT(!ctx->cachefile); /* File must be closed */ memset(header, 0, sizeof(header)); + /* Alloc line buffer */ + line_len = SP_LINE_LENGTH; + if((line = (char *)malloc(line_len)) == NULL) + RETURN(-1); + /* Open the file */ file = fopen(ctx->cachename, "r"); if(file == NULL) @@ -1528,7 +1536,7 @@ int sp_done_data(spctx_t* ctx) } /* Transfer actual file data */ - while(fgets(line, SP_LINE_LENGTH, file) != NULL) + while((rc = getline(&line, &line_len, file)) != -1) { /* * If the line is <CRLF>.<CRLF> we need to change it so that @@ -1555,7 +1563,7 @@ int sp_done_data(spctx_t* ctx) } } - if(spio_write_data_raw(ctx, &(ctx->server), line, strlen(line)) == -1) + if(spio_write_data_raw(ctx, &(ctx->server), line, rc) == -1) RETURN(-1); } @@ -1580,6 +1588,8 @@ int sp_done_data(spctx_t* ctx) cleanup: + if(line) + free(line); if(file) fclose(file); /* read-only so no error check */ |