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

Issue with insufficient permission for adding an object to repository database .git/objects

From
LGLTPCGO | George <george@ltpcgo.com>
Date
Jul 16, 2020, 14:25 UTC
Message-ID
<d6bbe71e47dcfd7ef31213537eeb3f05@ltpcgo.com>

See discussion here https://groups.google.com/forum/?fromgroups#!topic/git-users/35HBb76oA6c and https://github.com/trapexit/mergerfs/issues/626

On certain file systems, there are issues with staging a commit because a call to open a file stored under .git/objects fails. It has been brought up in this discussion group previously.

I have attached a fix below, but it would be much better to fix in the code. I am curious first, before proposing a fix in the code (although I can't find the specific call in the source at https://github.com/git/git ), what the reasoning is for the current permissions check on the call rather than checking the contents of the opened tmp file.

cc -Wall -O3 -D_GNU_SOURCE -fPIC -c -o githack.o githack.c; gcc -o githack.so -nostartfiles -shared githack.o -ldl;

LD_PRELOAD=./githack.so git commit -a -m "Some new commit"
The code is below:

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/stat.h> #include <sys/types.h> //#define openat ignorethisopen #define open ignorethisopen #define open64 ignorethisopen64 #include <fcntl.h> //#undef openat #undef open #undef open64 #include <dlfcn.h>

/*
        'strace git ...' will show git fail on an openat() command
        this is probably implemented as open64() on your system
        you can confirm this by use of 'ltrace git ...'
        you may also need to adjust the oflag comparison of 194
*/

/*static int (*___openat)(int, char *, int, mode_t);*/ static int (*___open)(const char *, int, mode_t); static int (*___open64)(const char *, int, mode_t);

static void* dlwrap(const char *fn)
{
        const char *e;
        void *p = dlsym(RTLD_NEXT, fn);
        if ((e=dlerror())!=0)  fprintf(stderr, "dlsym(RTLD_NEXT,'%s'): 
%s\r\n", fn, e);
        return p;
}
void _init(void)
{
        ___open = dlwrap("open");
        ___open64 = dlwrap("open64");
}
/*int openat(int dirfd, const char *pathname, int oflag, mode_t mode)*/
int open(const char *pathname, int oflag, mode_t mode)
{
        if (oflag && oflag == 194)
               return ___open(pathname, oflag, S_IRWXU);
        return ___open(pathname, oflag, mode);
}
int open64(const char *pathname, int oflag, mode_t mode)
{
        if (oflag && oflag == 194)
               return ___open64(pathname, oflag, S_IRWXU);
        return ___open64(pathname, oflag, mode);
}

🖳 LTPCGO 🖳 Next-level security Dr. George O’Neill +44 7717 318 220 george@ltpcgo.com https://www.ltpcgo.com/

Next: Chris Torek
Message 1 of 3 in “Issue with insufficient permission for adding an object to repository database .git/objects”
  1. LTPCGO | GeorgeJul 16, 2020
  2. Chris TorekJul 16, 2020
  3. Junio C HamanoJul 17, 2020

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.