You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
The Linux AppImage still exports its bundled lib directory on LD_LIBRARY_PATH and leaks it into spawned git. The bundled git's git-remote-https therefore binds the AppImage's stale bundled libnghttp2.so.14 instead of the system one, and every HTTPS fetch dies with a symbol lookup error, blocking session creation. This is the third occurrence of the same root cause after #644 (CLOSED) and #1394 (CLOSED, "fixed in v1.0.13").
The bundled git-remote-https links the systemlibcurl.so.4, whose NEEDED list includes libnghttp2.so.14. Because the AppImage's lib dir takes precedence on LD_LIBRARY_PATH, the loader binds the stale bundled nghttp2, which is missing a symbol the system libcurl requires — so the helper dies before any network I/O.
Verified facts:
Fact
Value
Bundled libnghttp2.so.14
/home/saurabh/apps/squashfs-root/usr/lib/libnghttp2.so.14, 174816 bytes, dated Aug 13
nghttp2_option_set_no_rfc9113_leading_and_trailing_ws_validation in bundled lib
ABSENT (nm -D --defined-only -> 0 matches)
System libnghttp2.so.14
-> libnghttp2.so.14.26.0 (170352 bytes, Ubuntu)
Same symbol in system lib
PRESENT (nm -D --defined-only -> 1 match)
System libcurl
libcurl.so.4 -> libcurl.so.4.8.0 (plain, not gnutls)
Bundled git
github-copilot-git-2.53.0-4 (git 2.53.0)
Proof it is purely lib shadowing — not git, not network, not auth. The app's own bundled git works perfectly once the variable is dropped:
Run the GitHub Copilot AppImage (app 1.1.10) on Ubuntu 24.04 where system libcurl.so.4 is 4.8.0 and system libnghttp2.so.14 is newer than the bundled copy.
Create a session for any GitHub repo (triggers a workspace git fetch over HTTPS).
Workspace init fails with the symbol lookup error above.
Minimal repro of the mechanism, isolating only the nghttp2 shadowing (bundled lib exposed via a scratch dir, so nothing on the host is modified):
BGIT=~/.cache/github-copilot-git-2.53.0-4/bin/git
HELPER=~/.cache/github-copilot-git-2.53.0-4/libexec/git-core/git-remote-https
TMPD=$(mktemp -d)
ln -s /home/saurabh/apps/squashfs-root/usr/lib/libnghttp2.so.14 "$TMPD/libnghttp2.so.14"# With the bundled nghttp2 on LD_LIBRARY_PATH (what the app does today):
LD_LIBRARY_PATH="$TMPD" ldd "$HELPER"| grep -E 'nghttp2|libcurl'# libcurl.so.4 => /lib/x86_64-linux-gnu/libcurl.so.4# libnghttp2.so.14 => /tmp/tmp.XXXX/libnghttp2.so.14 <-- bundled, stale
LD_LIBRARY_PATH="$TMPD""$BGIT" ls-remote https://github.com/git/git HEAD
# git-remote-https: symbol lookup error: /lib/x86_64-linux-gnu/libcurl.so.4:# undefined symbol: nghttp2_option_set_no_rfc9113_leading_and_trailing_ws_validation# fatal: remote helper 'https' aborted session# Clean env — same bundled git, same URL:
env -u LD_LIBRARY_PATH "$BGIT" ls-remote https://github.com/git/git HEAD
# 745601a9a94110d74769ab605ccd4f61339758d2 HEAD
Both branches above were executed on this machine and produced exactly the quoted output.
Expected behavior
Session creation should succeed regardless of the host's libcurl/nghttp2 versions. Git spawned by the app (bundled or system) should resolve system libraries, not the AppImage's bundled ones.
What is new vs. #1394 (please don't close this as a duplicate of the earlier fix)
The ask — please fix the behavior, not the library
The durable fix is to stop leaking the AppImage's LD_LIBRARY_PATH into spawned child processes. Concretely:
Primary: when the app spawns git (bundled or system), scrub LD_LIBRARY_PATH from the child environment — or reduce it to only what the bundled git genuinely requires. The AppImage's own GUI/runtime libs are irrelevant to git. As proven above, the shipped bundled git is already self-sufficient against system libs, so scrubbing costs nothing.
Defensive secondary: keep bundled transitive deps such as libnghttp2 at or above the versions the linked libcurl requires, or drop them from the bundle entirely. Shipping a bundled dependency that is older than the system library it shadows is what turns the leak into a hard failure.
Regression guard: a smoke test that spawns the bundled git under the AppImage's real spawn environment and does an HTTPS ls-remote would have caught all three occurrences.
Local workaround applied here (renaming the bundled lib so the loader falls through to the newer system one, which has the same .14 soname and a superset of symbols):
After that, ldd on the helper resolves libnghttp2.so.14 => /lib/x86_64-linux-gnu/libnghttp2.so.14 and session creation succeeds with LD_LIBRARY_PATH still set. That confirms the bundled lib is the only thing breaking it — nothing else in the leaked path is load-bearing for git.
The failure also affects any tooling the app spawns: every gh and git invocation from inside an app session has to be prefixed with env -u LD_LIBRARY_PATH to work, including the commands used to research and file this report.
Filed via gh rather than the in-app issue reporter: the app's own "create issue" path refused with "This project's GitHub account is no longer available. Please re-link the project to a GitHub account before creating an issue." because the active project is an Azure DevOps repo with no linked GitHub account. Minor, separate papercut, but it means non-GitHub-backed projects cannot file feedback from inside the app.
Short summary
The Linux AppImage still exports its bundled lib directory on
LD_LIBRARY_PATHand leaks it into spawned git. The bundled git'sgit-remote-httpstherefore binds the AppImage's stale bundledlibnghttp2.so.14instead of the system one, and every HTTPS fetch dies with a symbol lookup error, blocking session creation. This is the third occurrence of the same root cause after #644 (CLOSED) and #1394 (CLOSED, "fixed in v1.0.13").Affected version or release
app version=1.1.10)copilot-desktop-gh-2.96.0github-copilot-git-2.53.0-4(git version 2.53.0) — logs confirmusing bundled gitusr/bin/githubdated Aug 15Installation context
6.6.87.2-microsoft-standard-WSL2(WSL2)/home/saurabh/apps/squashfs-root(GitHub Copilot.desktop,Exec=github %u)/lib/x86_64-linux-gnu/libcurl.so.4->libcurl.so.4.8.0(plain, not the gnutls variant)/lib/x86_64-linux-gnu/libnghttp2.so.14->libnghttp2.so.14.26.0What happened?
Creating any session fails during workspace initialization:
Root cause (verified on this machine). The AppImage runtime exports to every child process:
The bundled
git-remote-httpslinks the systemlibcurl.so.4, whoseNEEDEDlist includeslibnghttp2.so.14. Because the AppImage's lib dir takes precedence onLD_LIBRARY_PATH, the loader binds the stale bundled nghttp2, which is missing a symbol the system libcurl requires — so the helper dies before any network I/O.Verified facts:
libnghttp2.so.14/home/saurabh/apps/squashfs-root/usr/lib/libnghttp2.so.14, 174816 bytes, dated Aug 13nghttp2_option_set_no_rfc9113_leading_and_trailing_ws_validationin bundled libnm -D --defined-only-> 0 matches)libnghttp2.so.14libnghttp2.so.14.26.0(170352 bytes, Ubuntu)nm -D --defined-only-> 1 match)libcurl.so.4->libcurl.so.4.8.0(plain, not gnutls)github-copilot-git-2.53.0-4(git 2.53.0)Proof it is purely lib shadowing — not git, not network, not auth. The app's own bundled git works perfectly once the variable is dropped:
Steps to reproduce
libcurl.so.4is4.8.0and systemlibnghttp2.so.14is newer than the bundled copy.git fetchover HTTPS).symbol lookup errorabove.Minimal repro of the mechanism, isolating only the nghttp2 shadowing (bundled lib exposed via a scratch dir, so nothing on the host is modified):
Both branches above were executed on this machine and produced exactly the quoted output.
Expected behavior
Session creation should succeed regardless of the host's libcurl/nghttp2 versions. Git spawned by the app (bundled or system) should resolve system libraries, not the AppImage's bundled ones.
What is new vs. #1394 (please don't close this as a duplicate of the earlier fix)
libcurl-gnutls.so.4; this occurrence is plainlibcurl.so.4. Any fix that special-cased the gnutls variant does not cover this path.github-copilot-git-2.53.0-3; this is-4. So the bundled-git refresh did not carry the fix forward either.The ask — please fix the behavior, not the library
The durable fix is to stop leaking the AppImage's
LD_LIBRARY_PATHinto spawned child processes. Concretely:LD_LIBRARY_PATHfrom the child environment — or reduce it to only what the bundled git genuinely requires. The AppImage's own GUI/runtime libs are irrelevant to git. As proven above, the shipped bundled git is already self-sufficient against system libs, so scrubbing costs nothing.libnghttp2at or above the versions the linkedlibcurlrequires, or drop them from the bundle entirely. Shipping a bundled dependency that is older than the system library it shadows is what turns the leak into a hard failure.ls-remotewould have caught all three occurrences.Additional context
Prior occurrences: Bug: AppImage injects bundled libs into system git's environment, breaking on modern distros #644 (CLOSED — system git loading bundled
libssl/libpcre2on Arch), Linux: AppImage leaks bundled LD_LIBRARY_PATH to spawned git (bundled git + libnghttp2 variant), blocking session creation — regression of #644 #1394 (CLOSED, "fixed in v1.0.13" — bundled git loading bundledlibnghttp2againstlibcurl-gnutls.so.4on Ubuntu 24.04). Possibly related: [Bugs] Worktree creation fails hard with embedded Git if the expected version of lib... #1197 (OPEN — worktree creation fails with embedded git when the expected libcurl isn't installed, on Arch).Local workaround applied here (renaming the bundled lib so the loader falls through to the newer system one, which has the same
.14soname and a superset of symbols):After that,
lddon the helper resolveslibnghttp2.so.14 => /lib/x86_64-linux-gnu/libnghttp2.so.14and session creation succeeds withLD_LIBRARY_PATHstill set. That confirms the bundled lib is the only thing breaking it — nothing else in the leaked path is load-bearing for git.The failure also affects any tooling the app spawns: every
ghandgitinvocation from inside an app session has to be prefixed withenv -u LD_LIBRARY_PATHto work, including the commands used to research and file this report.Filed via
ghrather than the in-app issue reporter: the app's own "create issue" path refused with "This project's GitHub account is no longer available. Please re-link the project to a GitHub account before creating an issue." because the active project is an Azure DevOps repo with no linked GitHub account. Minor, separate papercut, but it means non-GitHub-backed projects cannot file feedback from inside the app.