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

Re: [PATCH/RFC/GSoC 1/3] path.c: implement xdg_runtime_dir()

From
惠轶群 <huiyiqun@gmail.com>
Date
Mar 17, 2016, 10:20 UTC
Message-ID
<CAKqreuxBtu3hXVxY27_u-9ZxSP_AfSqeoB=d_UJdUsSTphgf=g@mail.gmail.com>
In-Reply-To
<20160316170623.GB4039@sigill.intra.peff.net>
2016-03-17 1:06 GMT+08:00 Jeff King <peff@peff.net>:
Show 9 quoted lines
> On Wed, Mar 16, 2016 at 06:07:43PM +0800, Hui Yiqun wrote:
>
>> +     if (runtime_dir && *runtime_dir)
>> +             git_runtime_dir = mkpathdup("%s/git/", runtime_dir);
>> +     else
>> +             git_runtime_dir = mkpathdup("/tmp/git-%d", uid);
>
> Here we allocate the string, but later we may return NULL on error,
> leaking the allocated memory.
Yes, do you think goto is a good solution for clearup?
Show 36 quoted lines
>
>> +     if (!lstat(git_runtime_dir, &st)) {
>> +             /*
>> +              * As described in XDG base dir spec[1], the subdirectory
>> +              * under $XDG_RUNTIME_DIR or its fallback MUST be owned by
>> +              * the user, and its unix access mode MUST be 0700.
>> +              *
>> +              * Calling chmod or chown silently may cause security
>> +              * problem if somebody chdir to it, sleep, and then, try
>> +              * to open our protected runtime cache or socket.
>> +              * So we just put warning and left it to user to solve.
>> +              *
>> +              * [1]https://specifications.freedesktop.org/basedir-spec/
>> +              * basedir-spec-latest.html
>> +              */
>
> OK. I think these checks should be sufficient to deal with the /tmp race
> I mentioned elsewhere in the thread (assuming that an attacker cannot
> flip the uid back and forth in the same way, but that should be true on
> Unix systems).
>
>> +             if ((st.st_mode & 0777) != S_IRWXU) {
>> +                     fprintf(stderr,
>> +                                     "permission of runtime directory '%s' "
>> +                                     "MUST be 0700 instead of 0%o\n",
>> +                                     git_runtime_dir, (st.st_mode & 0777));
>> +                     return NULL;
>> +             } else if (st.st_uid != uid) {
>> +                     fprintf(stderr,
>> +                                     "owner of runtime directory '%s' "
>> +                                     "MUST be %d instead of %d\n",
>> +                                     git_runtime_dir, uid, st.st_uid);
>> +                     return NULL;
>> +             }
>
> Should these be using warning(), rather than a raw fprintf?
Well, I will replace it.

During the greping. I found that I should also wrap my warning strings with _() for i18n.

Show 24 quoted lines
>
>> +     } else {
>> +             if (safe_create_leading_directories_const(git_runtime_dir) < 0) {
>> +                     fprintf(stderr,
>> +                                     "unable to create directories for '%s'\n",
>> +                                     git_runtime_dir);
>> +                     return NULL;
>> +             }
>> +             if (mkdir(git_runtime_dir, 0700) < 0) {
>> +                     fprintf(stderr,
>> +                                     "unable to mkdir '%s'\n", git_runtime_dir);
>> +                     return NULL;
>> +             }
>> +     }
>
> And this retains the un-racy mkdir(). Good.
>
>> +     free(git_runtime_dir);
>> +     return mkpathdup("%s/%s", git_runtime_dir, filename);
>
> This mkpathdup accesses the string we just freed?
>
> It might be easier to just use a strbuf here, and then you can append to
> it at the end.
I think so. Thanks.
>
> -Peff
Previous: Jeff KingNext: Ivan Tham
Message 23 of 30 in “[GSOC] Microproject "Move ~/.git-credential-cache to ~/.config/git"”
  1. 惠轶群Mar 14, 2016
  2. Junio C HamanoMar 14, 2016
  3. 惠轶群Mar 14, 2016
  4. Junio C HamanoMar 14, 2016
  5. 惠轶群Mar 15, 2016
  6. Your friendMar 15, 2016
  7. Jeff KingMar 15, 2016
  8. 1/3 path.c: implement xdg_runtime_dir()Hui Yiqun, Mar 16, 2016
  9. 2/3 git-credential-cache: put socket to xdg-compatible pathHui Yiqun, Mar 16, 2016
  10. 惠轶群Mar 17, 2016
  11. 3/3 t0301: test credential-cache support of XDG_RUNTIME_DIRHui Yiqun, Mar 16, 2016
  12. Junio C HamanoMar 16, 2016
  13. 惠轶群Mar 16, 2016
  14. Jeff KingMar 16, 2016
  15. Junio C HamanoMar 16, 2016
  16. 谭俊浩Mar 17, 2016
  17. Junio C HamanoMar 17, 2016
  18. 惠轶群Mar 17, 2016
  19. 惠轶群Mar 17, 2016
  20. Jeff KingMar 16, 2016
  21. 惠轶群Mar 18, 2016
  22. Jeff KingMar 16, 2016
  23. 惠轶群Mar 17, 2016
  24. Ivan ThamMar 15, 2016
  25. Jeff KingMar 15, 2016
  26. 惠轶群Mar 16, 2016
  27. Jeff KingMar 18, 2016
  28. 惠轶群Mar 18, 2016
  29. 惠轶群Mar 18, 2016
  30. credential-cache--daemon: clarify "exit" action semanticsJeff King, Mar 18, 2016

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.