[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