mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-04-22 12:35:14 +00:00
LibCore+LibC: Add putenv() wrapper
This is made safe with a special serenity_putenv() function in LibC.
This commit is contained in:
parent
f4236e61bf
commit
eea4dc5bfe
Notes:
sideshowbarker
2024-07-17 16:42:19 +09:00
Author: https://github.com/MacDue Commit: https://github.com/SerenityOS/serenity/commit/eea4dc5bfe Pull-request: https://github.com/SerenityOS/serenity/pull/17309 Reviewed-by: https://github.com/timschumi Reviewed-by: https://github.com/trflynn89
4 changed files with 24 additions and 0 deletions
|
@ -486,6 +486,14 @@ int serenity_setenv(char const* name, ssize_t name_length, char const* value, ss
|
|||
return putenv(var);
|
||||
}
|
||||
|
||||
// A non-evil version of putenv that will strdup the env (and free it later)
|
||||
int serenity_putenv(char const* new_var, size_t length)
|
||||
{
|
||||
auto* var = strndup(new_var, length);
|
||||
s_malloced_environment_variables.set((FlatPtr)var);
|
||||
return putenv(var);
|
||||
}
|
||||
|
||||
// https://pubs.opengroup.org/onlinepubs/9699919799/functions/putenv.html
|
||||
int putenv(char* new_var)
|
||||
{
|
||||
|
|
|
@ -28,6 +28,7 @@ __attribute__((alloc_size(2))) void* realloc(void* ptr, size_t);
|
|||
char* getenv(char const* name);
|
||||
char* secure_getenv(char const* name);
|
||||
int putenv(char*);
|
||||
int serenity_putenv(char const* new_var, size_t length);
|
||||
int unsetenv(char const*);
|
||||
int clearenv(void);
|
||||
int setenv(char const* name, char const* value, int overwrite);
|
||||
|
|
|
@ -1442,6 +1442,20 @@ ErrorOr<void> setenv(StringView name, StringView value, bool overwrite)
|
|||
return {};
|
||||
}
|
||||
|
||||
ErrorOr<void> putenv(StringView env)
|
||||
{
|
||||
#ifdef AK_OS_SERENITY
|
||||
auto rc = serenity_putenv(env.characters_without_null_termination(), env.length());
|
||||
#else
|
||||
// Leak somewhat unavoidable here due to the putenv API.
|
||||
auto leaked_new_env = strndup(env.characters_without_null_termination(), env.length());
|
||||
auto rc = ::putenv(leaked_new_env);
|
||||
#endif
|
||||
if (rc < 0)
|
||||
return Error::from_errno(errno);
|
||||
return {};
|
||||
}
|
||||
|
||||
ErrorOr<int> posix_openpt(int flags)
|
||||
{
|
||||
int const rc = ::posix_openpt(flags);
|
||||
|
|
|
@ -207,6 +207,7 @@ ErrorOr<void> setgroups(Span<gid_t const>);
|
|||
ErrorOr<void> mknod(StringView pathname, mode_t mode, dev_t dev);
|
||||
ErrorOr<void> mkfifo(StringView pathname, mode_t mode);
|
||||
ErrorOr<void> setenv(StringView, StringView, bool);
|
||||
ErrorOr<void> putenv(StringView);
|
||||
ErrorOr<int> posix_openpt(int flags);
|
||||
ErrorOr<void> grantpt(int fildes);
|
||||
ErrorOr<void> unlockpt(int fildes);
|
||||
|
|
Loading…
Add table
Reference in a new issue