git@vger.kernel.org mailing list mirror (one of many)
 help / color / mirror / code / Atom feed
* [PATCH] git-apply: Do not free the wrong buffer when we convert the data for writeout
  2007-03-22 16:48           ` Linus Torvalds
@ 2007-03-22 20:31             ` Junio C Hamano
  2007-03-22 20:55               ` Linus Torvalds
  0 siblings, 1 reply; 4+ messages in thread
From: Junio C Hamano @ 2007-03-22 20:31 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: Alexander Litvinov, Git Mailing List

When we write out the result of patch application, we sometimes
need to munge the data (e.g. under core.autocrlf).  After doing
so, what we should free is the temporary buffer that holds the
converted data returned from convert_to_working_tree(), not the
original one.

This patch also moves the call to open() up in the function, as
the caller expects us to fail cheaply if leading directories
need to be created (and then the caller creates them and calls
us again).  For that calling pattern, attempting conversion
before opening the file adds unnecessary overhead.

Signed-off-by: Junio C Hamano <junkio@cox.net>
---

  Linus Torvalds <torvalds@linux-foundation.org> writes:

  > In "try_create_file()", we do:
  >
  > 	...
  >         if (convert_to_working_tree(path, &nbuf, &nsize)) {
  >                 free((char *) buf);
  >                 buf = nbuf;
  >                 size = nsize;
  >         }
  > 	...
  >
  > but the thing is, the *caller* still uses the old "buf/nsize", so when you 
  > free it, the caller will now use the free'd data structure, and if it gets 
  > re-used by - for example - the zlib deflate() buffers, you'll get a 
  > corrupt object (if it gets re-used *before*, you'll get the *wrong* 
  > object!). Exactly Alexander's patterns.
  >
  > Alexander - sorry for all the trouble, this was definitely our bad.

  I concur.  Sorry for this, Alexander.

  git-apply in general is quite leaky (e.g. it never frees a
  finished patch, and freeing a patch is quite difficult as some
  strings like filenames are shared without refcounting), but
  this part deals with a large amount of data and I would rather
  not add a new one.

 builtin-apply.c |   17 ++++++++++-------
 1 files changed, 10 insertions(+), 7 deletions(-)

diff --git a/builtin-apply.c b/builtin-apply.c
index dfa1716..27a182b 100644
--- a/builtin-apply.c
+++ b/builtin-apply.c
@@ -2355,7 +2355,7 @@ static void add_index_file(const char *path, unsigned mode, void *buf, unsigned
 
 static int try_create_file(const char *path, unsigned int mode, const char *buf, unsigned long size)
 {
-	int fd;
+	int fd, converted;
 	char *nbuf;
 	unsigned long nsize;
 
@@ -2364,17 +2364,18 @@ static int try_create_file(const char *path, unsigned int mode, const char *buf,
 		 * terminated.
 		 */
 		return symlink(buf, path);
+
+	fd = open(path, O_CREAT | O_EXCL | O_WRONLY, (mode & 0100) ? 0777 : 0666);
+	if (fd < 0)
+		return -1;
+
 	nsize = size;
 	nbuf = (char *) buf;
-	if (convert_to_working_tree(path, &nbuf, &nsize)) {
-		free((char *) buf);
+	converted = convert_to_working_tree(path, &nbuf, &nsize);
+	if (converted) {
 		buf = nbuf;
 		size = nsize;
 	}
-
-	fd = open(path, O_CREAT | O_EXCL | O_WRONLY, (mode & 0100) ? 0777 : 0666);
-	if (fd < 0)
-		return -1;
 	while (size) {
 		int written = xwrite(fd, buf, size);
 		if (written < 0)
@@ -2386,6 +2387,8 @@ static int try_create_file(const char *path, unsigned int mode, const char *buf,
 	}
 	if (close(fd) < 0)
 		die("closing file %s: %s", path, strerror(errno));
+	if (converted)
+		free(nbuf);
 	return 0;
 }
 

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH] git-apply: Do not free the wrong buffer when we convert the data for writeout
  2007-03-22 20:31             ` [PATCH] git-apply: Do not free the wrong buffer when we convert the data for writeout Junio C Hamano
@ 2007-03-22 20:55               ` Linus Torvalds
  2007-03-23  3:55                 ` Alexander Litvinov
  0 siblings, 1 reply; 4+ messages in thread
From: Linus Torvalds @ 2007-03-22 20:55 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: Alexander Litvinov, Git Mailing List



On Thu, 22 Mar 2007, Junio C Hamano wrote:
> 
> This patch also moves the call to open() up in the function, as
> the caller expects us to fail cheaply if leading directories
> need to be created (and then the caller creates them and calls
> us again).  For that calling pattern, attempting conversion
> before opening the file adds unnecessary overhead.
> 
> Signed-off-by: Junio C Hamano <junkio@cox.net>

Ack, looks good.

		Linus

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH] git-apply: Do not free the wrong buffer when we convert the data for writeout
  2007-03-22 20:55               ` Linus Torvalds
@ 2007-03-23  3:55                 ` Alexander Litvinov
  0 siblings, 0 replies; 4+ messages in thread
From: Alexander Litvinov @ 2007-03-23  3:55 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: Junio C Hamano, Git Mailing List

В сообщении от Friday 23 March 2007 02:55 Linus Torvalds написал(a):
> On Thu, 22 Mar 2007, Junio C Hamano wrote:
> > This patch also moves the call to open() up in the function, as
> > the caller expects us to fail cheaply if leading directories
> > need to be created (and then the caller creates them and calls
> > us again).  For that calling pattern, attempting conversion
> > before opening the file adds unnecessary overhead.

I have applied this patch ontop of next (d06644b) and it also fix by repo 
breakage. 

Thanks for help !
Alexander Litvinov.

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH] git-apply: Do not free the wrong buffer when we convert the data for writeout
@ 2021-01-29  6:29 皐月
  0 siblings, 0 replies; 4+ messages in thread
From: 皐月 @ 2021-01-29  6:29 UTC (permalink / raw)
  To: junkio; +Cc: git, litvinov2004, torvalds



iPhoneから送信

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2021-01-29  6:42 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-01-29  6:29 [PATCH] git-apply: Do not free the wrong buffer when we convert the data for writeout 皐月
  -- strict thread matches above, loose matches on Subject: below --
2007-02-28  4:36 My git repo is broken, how to fix it ? Alexander Litvinov
     [not found] ` <Pine.LNX.4.64.0703200836490.6730@woody.linux-foundation.org>
     [not found]   ` <200703210956.50018.litvinov2004@gmail.com>
     [not found]     ` <200703211024.04740.litvinov2004@gmail.com>
2007-03-22 16:17       ` Linus Torvalds
2007-03-22 16:29         ` Linus Torvalds
2007-03-22 16:48           ` Linus Torvalds
2007-03-22 20:31             ` [PATCH] git-apply: Do not free the wrong buffer when we convert the data for writeout Junio C Hamano
2007-03-22 20:55               ` Linus Torvalds
2007-03-23  3:55                 ` Alexander Litvinov

Code repositories for project(s) associated with this public inbox

	https://80x24.org/mirrors/git.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).