Thread (8 messages) flat view 8 messages, 4 authors, 2016-06-15

Re: [PATCH] quickfetch(): Prevent overflow of the rev-list command line

From: Johan Herland <hidden>
Date: 2016-06-15 22:47:02

On Wednesday 08 July 2009, Johannes Sixt wrote:
Johan Herland schrieb:
quoted
+	/* If rev-list --stdin encounters an unknown commit, it
terminates, +	 * which will cause SIGPIPE in the write loop below.
*/
Under the conditions you describe here...
quoted
+	signal(SIGPIPE, SIG_IGN);
... and SIGPIPE being ignored...
quoted
+
+	err = start_command(&revlist);
+	if (err) {
+		error("could not run rev-list");
+		return err;
+	}

-	for (i = 0; argv[i]; i++)
-		free(argv[i]);
-	free(argv);
-	return err;
+	for (ref = ref_map; ref; ref = ref->next) {
+		if (write_in_full(revlist.in, sha1_to_hex(ref->old_sha1), 40) <
0 || +		    write_in_full(revlist.in, "\n", 1) < 0) {
+			error("failed write to rev-list");
+			err = errno;
... don't you get this error message with errno set to EPIPE?
Previously, there was no error message.
Indeed, you are correct. I guess the following should be added to the
patch:

 	if (write_in_full(revlist.in, sha1_to_hex(ref->old_sha1), 40) < 0 ||
 	    write_in_full(revlist.in, "\n", 1) < 0) {
-		error("failed write to rev-list");
-		err = errno;
+		if (errno != EPIPE) {
+			error("failed write to rev-list");
+			err = errno;
+		}
 		break;
 	}

Maybe I need to do something to the close() call as well? What happens on close() after EPIPE?


Thanks,

...Johan

-- 
Johan Herland, [off-list ref]
www.herland.net
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help