[PATCH] libgfortran: Fix up putenv uses in libcaf_shmem [PR124330]

Jerry D jvdelisle2@gmail.com
Wed Mar 4 16:10:56 GMT 2026


On 3/4/26 7:44 AM, John David Anglin wrote:
> Hi Jakub,
> 
> I believe this change is obvious.  The Linux manpage for putenv states:
> 
>         In particular, this string
>         becomes part of the environment; changing it later will change the envi‐
>         ronment.  (Thus, it is an error to call putenv() with an automatic vari‐
>         able as the argument, then return from the calling function while string
>         is still part of the environment.)
> 
> Some systems may have used a copy but this causes a memory leak.  On HP-UX, altering
> the string changes the environment, so I believe it doesn't use a copy.  So, we want
> a static string.
> 
> Thanks,
> Dave

Yes, agree, OK for trunk.

Jerry

> 
> On 2026-03-04 10:12 a.m., Jakub Jelinek wrote:
>> Hi!
>>
>> I don't have access to HP/UX, but at least on other OSes and what Linux as
>> well as POSIX documents is that when you call putenv with some argument,
>> what that argument points to becomes part of the environment and when
>> it is changed, the environment changes.  I believe ENOMEM from putenv is
>> about reallocating of the __environ (or similar) pointed array of pointers
>> (e.g. if the particular env var name isn't there already), it still
>> shouldn't allocate any memory for the NAME=VALUE string and just use
>> the user provided.  So, padding address of automatic array will be UB
>> as soon as the scope of that var is left.
>>
>> One can either malloc the buffer, or use static vars, then nothing leaks
>> and in the unlikely case putenv would be called twice for the same env var,
>> it would second time only register the same buffer.
>>
>> Ok for trunk?
>>
>> 2026-03-04  Jakub Jelinek  <jakub@redhat.com>
>>
>> 	PR libfortran/124330
>> 	* caf/shmem/shared_memory.c (shared_memory_set_env): Make buffer
>> 	used by putenv static.
>> 	(shared_memory_init): Likewise.
>>
>> --- libgfortran/caf/shmem/shared_memory.c.jj	2026-03-04 09:15:13.572332552 +0100
>> +++ libgfortran/caf/shmem/shared_memory.c	2026-03-04 14:01:14.511957983 +0100
>> @@ -71,7 +71,7 @@ shared_memory_set_env (pid_t pid)
>>     snprintf (val, 20, "%d", pid);
>>     SetEnvironmentVariable (ENV_PPID, val);
>>   #else
>> -  char buffer[28];
>> +  static char buffer[28];
>>     int res;
>>   
>>     /* HP-UX / Legacy Fallback using putenv */
>> @@ -253,7 +253,7 @@ shared_memory_init (shared_memory_act *m
>>         snprintf (val, 20, "%p", mem->glbl.base);
>>         SetEnvironmentVariable (ENV_BASE, val);
>>   #else
>> -      char buffer[28];
>> +      static char buffer[28];
>>         int res;
>>   
>>         /* HP-UX / Legacy Fallback using putenv */
>>
>> 	Jakub
>>
> 
> 




More information about the Fortran mailing list