Re: [PATCH 1/5] builtin-mailinfo.c infrastrcture changes

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Don Zickus <dzickus@xxxxxxxxxx> writes:

> List of major changes/fixes:
> - can't create empty patch files fix
> - empty patch files don't fail, this failure will come inside git-am
> - multipart boundaries are now handled
> - only output inbody headers if a patch exists otherwise assume those
> headers are part of the reply and instead output the original headers
> - decode and filter base64 patches correctly
> - various other accidental fixes
>
> I believe I didn't break any existing functionality or compatibility (other
> than what I describe above, which is really only the empty patch file).
>
> I tested this through various mailing list archives and everything seemed to
> parse correctly (a couple thousand emails).

Thanks.

> @@ -177,17 +175,35 @@ static int slurp_attr(const char *line, const char *name, char *attr)
>  	return 1;
>  }
>  
> -static int handle_subcontent_type(char *line)
> +struct content_type {
> +	char *boundary;
> +	int boundary_len;
> +};
> +
> +static struct content_type content[]={
> +	{ NULL },
> +	{ NULL },
> +	{ NULL },
> +	{ NULL },
> +	{ NULL },
> +};

The reason why this array has 5 elements (not 4, not 6) is...?

> +
> +static struct content_type *content_top = content;
> +
> +static int handle_content_type(char *line)
>  {
> +	char boundary[256];
> +
> +	if (strcasestr(line, "text/") < 0)
> +		 message_type = TYPE_OTHER;

Did you mean

	if (strncasecmp(line, "text/", 5))

It makes me wonder how a couple thousand mails (or for that
matter our own testsuite) could have passed the test with a
thing like this...

> +	if (slurp_attr(line, "boundary=", boundary + 2)) {
> +		memcpy(boundary, "--", 2);
> +		content_top++;
> +		content_top->boundary_len = strlen(boundary);
> +		content_top->boundary = xmalloc(content_top->boundary_len+1);
> +		strcpy(content_top->boundary, boundary);
>  	}

Does anybody check the content[] stack overflow?

> @@ -341,57 +290,65 @@ static void cleanup_space(char *buf)
>  }
>  
>  static void decode_header(char *it);
> -typedef int (*header_fn_t)(char *);
> -struct header_def {
> -	const char *name;
> -	header_fn_t func;
> -	int namelen;
> +static char *header[10] = {
> +	"From",
> +	"Subject",
> +	"Date",
> +	NULL,
> +	NULL,
> +	NULL,
>  };

Why initialize only three with NULL when you have four more?
What are the 7 entries other than From/Subject/Date for?  Future
extension?  Wouldn't 

	static char *header[] = {
        	"From", "Subject", "Date", NULL,
	};

or even:

	static char *header[] = {
        	"From", "Subject", "Date",
	};

easier to handle (for the latter, you would need your loop with:

	for (i = 0; i < ARRAY_SIZE(header); i++)
        	...

> +	/* Content stuff */
> +	if (!strncasecmp(line, "Content-Type: ", 14)) {

I'd rather not insist SP after colon (I do not think it even has
to exist, but I think we check for isspace() in the current code).

> +static int handle_boundary(void)
> +{
> +again:
> +	if (!memcmp(line+content_top->boundary_len, "--", 2)) {
> +		/* we hit an end boundary */
> +		/* pop the current boundary off the stack */
> +		free(content_top->boundary);
> +		content_top--;
> +		handle_filter("\n");

Stack underflow?

> +static void handle_body(void)
>  {
> ...
> +		switch (transfer_encoding) {
> +		case TE_BASE64:
> +		{
> +			/* binary data most likely doesn't have newlines */
> +			if (message_type != TYPE_TEXT) {
> +				rc=handle_filter(line);
> +				break;
> +			}
> +
> +			/* this is a decoded line that may contain
> +			 * multiple new lines.  Pass only one chunk
> +			 * at a time to handle_filter()
> +			 */
> +
> +			char *op=line;
> +

builtin-mailinfo.c:786: warning: ISO C90 forbids mixed declarations and code.

> @@ -809,18 +833,16 @@ int mailinfo(FILE *in, FILE *out, int ks, const char *encoding,
>  		fclose(cmitmsg);
>  		return -1;
>  	}
> +
> +	p_hdr_data = xcalloc(10, sizeof(char *));
> +	s_hdr_data = xcalloc(10, sizeof(char *));

These tens look unexplained magic...

> diff --git a/git-am.sh b/git-am.sh
> index 2c73d11..8fa466a 100755
> --- a/git-am.sh
> +++ b/git-am.sh
> @@ -290,6 +290,7 @@ do
>  		git-mailinfo $keep $utf8 "$dotest/msg" "$dotest/patch" \
>  			<"$dotest/$msgnum" >"$dotest/info" ||
>  			stop_here $this
> +		test -s $dotest/patch || stop_here $this
>  		git-stripspace < "$dotest/msg" > "$dotest/msg-clean"
>  		;;
>  	esac

I think this interface change probably is a good thing.  I
wonder if we need a matching change to applymbox, though.

-
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]