Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Bug] Crash when enableLocalProfileCache: true and textures payload empty #325

Open
3 tasks done
evan-goode opened this issue Jan 20, 2025 · 0 comments
Open
3 tasks done
Labels

Comments

@evan-goode
Copy link
Contributor

evan-goode commented Jan 20, 2025

Describe the bug

When enableLocalProfileCache is true, and the skin server provides an empty textures map for the player, the client crashes when joining a world (singleplayer or multiplayer).

According to the authlib-injector Yggdrasil server spec, skin servers can omit the skin or cape field of the textures object inside the base64-encoded textures profile property if the player does not have a skin or cape assigned. I don't know whether the MojangAPI implementation here cares about the authlib-injector spec, but it would be nice to be compatible :)

EDIT: According to https://minecraft.wiki/w/Mojang_API#Query_player's_skin_and_cape, the skin texture field "does not exist if the player does not have a custom skin". This might have been true at one point, but does not seem to be true now...

The crash happens at Common/src/main/java/customskinloader/profile/ProfileCache.java:

localProfiles.put(username.toLowerCase(), null);

where a NullPointerException is thrown. localProfiles is a ConcurrentHashMap, which unlike a HashMap cannot have null keys or values. Given that this is the underlying problem, there's probably a simpler way to trigger this bug that doesn't involve an empty textures map.

Perhaps localProfiles could be changed to a Map<String, Optional<UserProfile>>?

Here is a minimal reproducing configuration file:

Minimal config file
{
  "version": "14.22",
  "buildNumber": 31,
  "loadlist": [
    {
      "name": "Drasl",
      "type": "MojangAPI",
      "apiRoot": "https://drasl.REDACTED.com/",
      "sessionRoot": "https://drasl.REDACTED.com/"
    }
  ],
  "enableDynamicSkull": true,
  "enableTransparentSkin": true,
  "forceLoadAllTextures": true,
  "enableCape": true,
  "threadPoolSize": 8,
  "enableLogStdOut": false,
  "cacheExpiry": 30,
  "forceUpdateSkull": false,
  "enableLocalProfileCache": true,
  "enableCacheAutoClean": false,
  "forceDisableCache": false
}

Steps to reproduce

1. Use Minecraft 1.20.6 (version probably doesn't matter) with CustomSkinLoader 14.22.
2. Use a skin server that sends an empty `textures` object inside the base64-encoded textures profile property. Drasl will do this when a user doesn't have a skin.
3. Use the above CustomSkinLoader.json.
4. Join a world. The game will crash.

Link to crash-report if applicable

https://mclo.gs/lUUFkLp

Link to CustomSkinLoader.log if applicable

https://mclo.gs/sNRbIp9

Link to latest.log if applicable

No response

[Only Forge User] Link to Forge Log if applicable

No response

Mod Version

14.22

Minecraft Version

1.20.6

Minecraft Launcher Name and Version

Fjord Launcher 9.2.1

Mod Loader

Fabric

Operating System

Linux

Before submitting a bug report

  • This bug wasn't already reported (I have searched bug reports on GitHub).

  • This is a valid bug (I am able to reproduce this on the latest dev build).

  • This problem is triggered in the latest version of the mod (if not the latest please upgrade the mod first)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant