git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH] Seek back to current filepos when mmap()ing with NO_MMAP

From
Alex Riesen <raa.lkml@gmail.com>
Date
Nov 15, 2006, 19:06 UTC
Message-ID
<81b0412b0611151106k45ee03ekd8a3a04173f618c3@mail.gmail.com>
In-Reply-To
<Pine.LNX.4.63.0611151727000.13772@wbgn013.biozentrum.uni-wuerzburg.de>
On 11/15/06, Johannes Schindelin <Johannes.Schindelin@gmx.de> wrote:
Show 5 quoted lines
>
> "git-index-pack --fix-thin" relies on mmap() not changing the current
> file position (otherwise the pack will be corrupted when writing the
> final SHA1). Meet that expectation.
>

Thanks! I was wondering for some considerable time why the hell t5500-fetch-pack fails.

BTW, I extended error handling in that mmap.  Dunno why.
Signed-off-by: Alex Riesen <raa.lkml@gmail.com>
commit 40ed0644ca8d250f716f49a5c3e027aa2c1d3167
Author: Alex Riesen <raa.lkml@gmail.com>
Date:   Wed Nov 15 19:55:06 2006 +0100
    Seek back to current filepos when mmap()ing with NO_MMAP, eh improved
    
    "git-index-pack --fix-thin" relies on mmap() not changing the current
    file position (otherwise the pack will be corrupted when writing the
    final SHA1). Meet that expectation.
    
    Signed-off-by: Johannes Schindelin <Johannes.Schindelin@gmx.de>
    Signed-off-by: Alex Riesen <raa.lkml@gmail.com>
diff --git a/compat/mmap.c b/compat/mmap.c
index 55cb120..c6d5cfe 100644
--- a/compat/mmap.c
+++ b/compat/mmap.c
@@ -6,7 +6,8 @@
 
 void *gitfakemmap(void *start, size_t length, int prot , int flags, int fd, off_t offset)
 {
-	int n = 0;
+	int n = 0, err = 0;
+	off_t current_offset = lseek(fd, 0, SEEK_CUR);
 
 	if (start != NULL || !(flags & MAP_PRIVATE))
 		die("Invalid usage of gitfakemmap.");
@@ -18,8 +19,8 @@ void *gitfakemmap(void *start, size_t le
 
 	start = xmalloc(length);
 	if (start == NULL) {
-		errno = ENOMEM;
-		return MAP_FAILED;
+		err = ENOMEM;
+		goto unseek;
 	}
 
 	while (n < length) {
@@ -31,14 +32,22 @@ void *gitfakemmap(void *start, size_t le
 		}
 
 		if (count < 0) {
-			free(start);
-			errno = EACCES;
-			return MAP_FAILED;
+			err = EACCES;
+			goto unseek;
 		}
 
 		n += count;
 	}
 
+unseek:
+	if (current_offset != lseek(fd, current_offset, SEEK_SET))
+		err = EINVAL;
+
+	if (err) {
+		free(start);
+		start = MAP_FAILED;
+		errno = err;
+	}
 	return start;
 }
 
Previous: Johannes Schindelin
Message 4 of 4 in “Seek back to current filepos when mmap()ing with NO_MMAP”
  1. Seek back to current filepos when mmap()ing with NO_MMAPJohannes Schindelin, Nov 15, 2006
  2. Morten WelinderNov 15, 2006
  3. Johannes SchindelinNov 15, 2006
  4. Alex RiesenNov 15, 2006

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.