ksh memory leak when using PATH

Solution Verified - Updated -

Environment

  • Red Hat Enterprise Linux (RHEL) 6, 7
  • ksh-20120801-33.el6
  • ksh-20120801-26.el7

Issue

some script using ksh shows overtime increment of resident and consequently virtual memory.

The problem happen when PATH environment variable is used.

Here's example reproducer script:

#!/bin/ksh93

while true
do
   PATH=.
   for DIR in /usr/bin /usr/sbin /bin /usr/local/bin
   do
      if [ -d ${DIR} ]
      then
         PATH=${PATH}:${DIR}
         true
      fi
   done

   time=$(date +%T)
   prev=${page}
   page=$(cat /proc/$$/stat|awk '{print $24}')

   if (( page > prev ));
   then
      echo "$time $page"
   fi

done

The page statistic in /proc/<pid>/stat continually goes up, indicating ksh leaks memory:

20:57:05 483
20:57:05 484
20:57:05 485
...

After changing the interpreter to bash the symptom does not appear.

Resolution

  • for RHEL 6 update to ksh-20120801-34.el6_9 released with Advisory RHBA-2017:1378 or newer
  • for RHEL 7 update to ksh-20120801-34.el7 released with Advisory RHBA-2017:1936 or newer

Root Cause

In ksh value of PATH is maintained as a linked list. When a subshell is forked, ksh duplicates PATH by increasing refcount in path_alias() function. However, when the subshell exits this refcount was not being decreased in affected ksh versions. Next time when PATH is reset to a new value, ksh calls path_delete() function to delete linked list which stored older path. But path_delete() function does not free elements whose refcount is greater than 1 and leaves a memory leak in the shell.

  • Component
  • ksh

This solution is part of Red Hat’s fast-track publication program, providing a huge library of solutions that Red Hat engineers have created while supporting our customers. To give you the knowledge you need the instant it becomes available, these articles may be presented in a raw and unedited form.

Comments