[PATCH 1/4] reformime: support binary encoding
Joshua Judson Rosen
jrosen at harvestai.com
Fri Oct 10 20:20:38 UTC 2014
Ping? Any takers?
On 2014-10-02 14:12, Joshua Judson Rosen wrote:
> This is important to allow use of reformime in CGI scripts
> that handle uploads, since web-browsers typically POST using binary
> rather than base64, 7bit, or 8bit.
>
> Signed-off-by: Joshua Judson Rosen <jrosen at harvestai.com>
> ---
> mailutils/reformime.c | 43 +++++++++++++++++++++++++++++++++++++++----
> 1 file changed, 39 insertions(+), 4 deletions(-)
>
> diff --git a/mailutils/reformime.c b/mailutils/reformime.c
> index 8e7d455..507fc06 100644
> --- a/mailutils/reformime.c
> +++ b/mailutils/reformime.c
> @@ -138,6 +138,9 @@ static int parse(const char *boundary, char **argv)
> } else {
> /* No, process one non-multipart section */
> char *end;
> + char end2[4] = ""; /* buffer for an EOL-string */
> + size_t end_bufsz;
> + ssize_t end_len, end2_len;
> pid_t pid = pid;
> FILE *fp;
>
> @@ -181,24 +184,56 @@ static int parse(const char *boundary, char **argv)
>
> /* write to fp */
> end = NULL;
> + end_bufsz = 0;
> + end2_len = 0;
> if (0 == strcasecmp(encoding, "base64")) {
> read_base64(stdin, fp, '-');
> } else
> if (0 != strcasecmp(encoding, "7bit")
> && 0 != strcasecmp(encoding, "8bit")
> + && 0 != strcasecmp(encoding, "binary")
> ) {
> - /* quoted-printable, binary, user-defined are unsupported so far */
> + /* quoted-printable and user-defined are unsupported so far */
> bb_error_msg_and_die("encoding '%s' not supported", encoding);
> } else {
> - /* plain 7bit or 8bit */
> - while ((end = xmalloc_fgets(stdin)) != NULL) {
> + /* plain 7bit, 8bit, or binary */
> + while ((end_len = getline(&end, &end_bufsz, stdin)) > 0) {
> if ('-' == end[0]
> && '-' == end[1]
> && strncmp(end + 2, boundary, boundary_len) == 0
> ) {
> break;
> }
> - fputs(end, fp);
> +
> + if (end2_len) {
> + /* If we got here, this line isn't actually
> + the boundary-marker; so flush out any EOL
> + bytes that are buffered from the last line;
> + we want to discard the necessary EOL between
> + the data and the boundary, but only that EOL.
> + */
> + fwrite(end2, sizeof (char), end2_len, fp);
> + end2_len = 0;
> + }
> +
> + /* Buffer any EOL bytes at the end of this line
> + until the next iteration--if the next line is
> + the boundary-marker, then the only reason that
> + this EOL is here is to put the boundary-marker
> + on its own line, and we should therefor discard
> + this EOL:
> + */
> + if (end_len >= 1 && end[end_len-1] == '\n') {
> + end2_len++;
> +
> + if (end_len >= 2 && end[end_len-2] == '\r') {
> + end2_len++;
> + }
> + }
> + strncpy (end2, end + end_len - end2_len, sizeof end2);
> +
> + fwrite(end, sizeof (char), end_len - end2_len, fp);
> +
> }
> }
> fclose(fp);
>
--
"'tis an ill wind that blows no minds."
More information about the busybox
mailing list