The problem seems related to dirty memory being allocated for strings in the code. Once I explicitly added code to null out the full value of the strings after allocation, the problem went away, for new and old users.
Bool nxagentMakeIcon(Display *display, Pixmap *nxIcon, Pixmap *nxMask)
{
char *env_path = getenv("PATH");
int lenght_env_path = 0;
char icon_filename [256];
char default_path [256];
char *icon_path = malloc( strlen(env_path) + sizeof(icon_filename) );
FILE *icon_fp;
if (env_path == NULL)
lenght_env_path = 0;
else
lenght_env_path = strlen(env_path) + 1;
strncpy(icon_filename, "", 255);
strncpy(default_path, "", 255);
strncpy(icon_path, "", strlen(env_path) + sizeof(icon_filename) );
strcat(icon_filename, NXAGENT_ICON_NAME);
strcat(default_path,"/usr/NX/share/images/");
strcat(default_path,icon_filename);
if ((icon_fp = fopen(default_path, "r")) == NULL)
{
char *s;
char *temp_path = malloc(lenght_env_path + strlen(icon_filename) );
char *temp_path1 = malloc(lenght_env_path + strlen(icon_filename) );
strncpy(temp_path, env_path, strlen(env_path));
strncpy(temp_path1, "", lenght_env_path + strlen(icon_filename) );
...
free(temp_path);
free(temp_path1);
...
I added some output to the code and re-compiled. When memory is dirty, the variable temp_path (which is not nulled in the original code), has some ugly contents, which then messes up the strncpy from env_path. It is my assumption that it is the garbage that messes up the free(temp_path) later in the code.
nxagentMakeIcon: env_path=/usr/bin:/home/hook/bin:/usr/local/bin:/usr/bin:/bi
n:/usr/bin/X11:/usr/X11R6/bin:/usr/games:/usr/lib/jvm/jre/bin
displayMemory:
BFDF4B5B | 2F 75 73 72 2F 62 69 6E 3A 2F 68 6F 6D 65 2F 68 | /usr/bin:/home/h
BFDF4B6B | 6F 6F 6B 2F 62 69 6E 3A 2F 75 73 72 2F 6C 6F 63 | ook/bin:/usr/loc
BFDF4B7B | 61 6C 2F 62 69 6E 3A 2F 75 73 72 2F 62 69 6E 3A | al/bin:/usr/bin:
BFDF4B8B | 2F 62 69 6E 3A 2F 75 73 72 2F 62 69 6E 2F 58 31 | /bin:/usr/bin/X1
BFDF4B9B | 31 3A 2F 75 73 72 2F 58 31 31 52 36 2F 62 69 6E | 1:/usr/X11R6/bin
BFDF4BAB | 3A 2F 75 73 72 2F 67 61 6D 65 73 3A 2F 75 73 72 | :/usr/games:/usr
BFDF4BBB | 2F 6C 69 62 2F 6A 76 6D 2F 6A 72 65 2F 62 69 6E | /lib/jvm/jre/bin
nxagentMakeIcon: initial temp_path=ºººººººººººººººººººººººººººººººººººººººººº
ººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººº
ººººº^KEEEEEE^G<89>
displayMemory:
08561E48 | BA BA BA BA BA BA BA BA BA BA BA BA BA BA BA BA | ºººººººººººººººº
08561E58 | BA BA BA BA BA BA BA BA BA BA BA BA BA BA BA BA | ºººººººººººººººº
08561E68 | BA BA BA BA BA BA BA BA BA BA BA BA BA BA BA BA | ºººººººººººººººº
08561E78 | BA BA BA BA BA BA BA BA BA BA BA BA BA BA BA BA | ºººººººººººººººº
08561E88 | BA BA BA BA BA BA BA BA BA BA BA BA BA BA BA BA | ºººººººººººººººº
08561E98 | BA BA BA BA BA BA BA BA BA BA BA BA BA BA BA BA | ºººººººººººººººº
08561EA8 | BA BA BA BA BA BA BA BA BA BA BA BA BA BA BA BA | ºººººººººººººººº
08561EB8 | BA BA BA BA BA BA BA BA BA BA BA BA 0B 45 45 45 | ºººººººººººº.EEE
08561EC8 | 45 45 45 07 89 __ __ __ __ __ __ __ __ __ __ __ | EEE.<89>
nxagentMakeIcon: initial temp_path1=ººººººººººººººººººººººººººººººººººººººººº
ººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººº
ºººººº^ZEEEEEE^G9^L
displayMemory:
08561ED0 | BA BA BA BA BA BA BA BA BA BA BA BA BA BA BA BA | ºººººººººººººººº
08561EE0 | BA BA BA BA BA BA BA BA BA BA BA BA BA BA BA BA | ºººººººººººººººº
08561EF0 | BA BA BA BA BA BA BA BA BA BA BA BA BA BA BA BA | ºººººººººººººººº
08561F00 | BA BA BA BA BA BA BA BA BA BA BA BA BA BA BA BA | ºººººººººººººººº
08561F10 | BA BA BA BA BA BA BA BA BA BA BA BA BA BA BA BA | ºººººººººººººººº
08561F20 | BA BA BA BA BA BA BA BA BA BA BA BA BA BA BA BA | ºººººººººººººººº
08561F30 | BA BA BA BA BA BA BA BA BA BA BA BA BA BA BA BA | ºººººººººººººººº
08561F40 | BA BA BA BA BA BA BA BA BA BA BA BA 1A 45 45 45 | ºººººººººººº.EEE
08561F50 | 45 45 45 07 39 0C __ __ __ __ __ __ __ __ __ __ | EEE.9.
nxagentMakeIcon: initial env_path temp_path=/usr/bin:/home/hook/bin:/usr/loca
l/bin:/usr/bin:/bin:/usr/bin/X11:/usr/X11R6/bin:/usr/games:/usr/lib/jvm/jre/b
inºººººººººººº^KEEEEEE^G<89>
displayMemory:
08561E48 | 2F 75 73 72 2F 62 69 6E 3A 2F 68 6F 6D 65 2F 68 | /usr/bin:/home/h
08561E58 | 6F 6F 6B 2F 62 69 6E 3A 2F 75 73 72 2F 6C 6F 63 | ook/bin:/usr/loc
08561E68 | 61 6C 2F 62 69 6E 3A 2F 75 73 72 2F 62 69 6E 3A | al/bin:/usr/bin:
08561E78 | 2F 62 69 6E 3A 2F 75 73 72 2F 62 69 6E 2F 58 31 | /bin:/usr/bin/X1
08561E88 | 31 3A 2F 75 73 72 2F 58 31 31 52 36 2F 62 69 6E | 1:/usr/X11R6/bin
08561E98 | 3A 2F 75 73 72 2F 67 61 6D 65 73 3A 2F 75 73 72 | :/usr/games:/usr
08561EA8 | 2F 6C 69 62 2F 6A 76 6D 2F 6A 72 65 2F 62 69 6E | /lib/jvm/jre/bin
08561EB8 | BA BA BA BA BA BA BA BA BA BA BA BA 0B 45 45 45 | ºººººººººººº.EEE
08561EC8 | 45 45 45 07 89 __ __ __ __ __ __ __ __ __ __ __ | EEE.<89>
nxagentMakeIcon: initial nulled temp_path1=
displayMemory:
08561ED0 |
The code above also shows temp_path1, which is nulled in the original code.
When I attach a debugger (valgrind), it changes the memory allocation (you can see the address change below) and the memory is clean and the NX session succeeds even for the old users.
nxagentMakeIcon: env_path=/usr/bin:/home/hook/bin:/usr/local/bin:/usr/bin:/bi
n:/usr/bin/X11:/usr/X11R6/bin:/usr/games:/usr/lib/jvm/jre/bin
displayMemory:
BEEACADB | 2F 75 73 72 2F 62 69 6E 3A 2F 68 6F 6D 65 2F 68 | /usr/bin:/home/h
BEEACAEB | 6F 6F 6B 2F 62 69 6E 3A 2F 75 73 72 2F 6C 6F 63 | ook/bin:/usr/loc
BEEACAFB | 61 6C 2F 62 69 6E 3A 2F 75 73 72 2F 62 69 6E 3A | al/bin:/usr/bin:
BEEACB0B | 2F 62 69 6E 3A 2F 75 73 72 2F 62 69 6E 2F 58 31 | /bin:/usr/bin/X1
BEEACB1B | 31 3A 2F 75 73 72 2F 58 31 31 52 36 2F 62 69 6E | 1:/usr/X11R6/bin
BEEACB2B | 3A 2F 75 73 72 2F 67 61 6D 65 73 3A 2F 75 73 72 | :/usr/games:/usr
BEEACB3B | 2F 6C 69 62 2F 6A 76 6D 2F 6A 72 65 2F 62 69 6E | /lib/jvm/jre/bin
nxagentMakeIcon: initial temp_path=
displayMemory:
04A63188 |
nxagentMakeIcon: initial temp_path1=
displayMemory:
04A63238 |
nxagentMakeIcon: initial env_path temp_path=/usr/bin:/home/hook/bin:/usr/loca
l/bin:/usr/bin:/bin:/usr/bin/X11:/usr/X11R6/bin:/usr/games:/usr/lib/jvm/jre/b
in
displayMemory:
04A63188 | 2F 75 73 72 2F 62 69 6E 3A 2F 68 6F 6D 65 2F 68 | /usr/bin:/home/h
04A63198 | 6F 6F 6B 2F 62 69 6E 3A 2F 75 73 72 2F 6C 6F 63 | ook/bin:/usr/loc
04A631A8 | 61 6C 2F 62 69 6E 3A 2F 75 73 72 2F 62 69 6E 3A | al/bin:/usr/bin:
04A631B8 | 2F 62 69 6E 3A 2F 75 73 72 2F 62 69 6E 2F 58 31 | /bin:/usr/bin/X1
04A631C8 | 31 3A 2F 75 73 72 2F 58 31 31 52 36 2F 62 69 6E | 1:/usr/X11R6/bin
04A631D8 | 3A 2F 75 73 72 2F 67 61 6D 65 73 3A 2F 75 73 72 | :/usr/games:/usr
04A631E8 | 2F 6C 69 62 2F 6A 76 6D 2F 6A 72 65 2F 62 69 6E | /lib/jvm/jre/bin
nxagentMakeIcon: initial nulled temp_path1=
displayMemory:
04A63238 |
Once I add a statement to null the value of temp_path (similar to the one for temp_path1) immediately after allocation (before the strncpy from env_path), the problem goes away and NX sessions for new and old users succeed.
strncpy(temp_path, "", lenght_env_path + strlen(icon_filename) );
strncpy(temp_path, env_path, strlen(env_path));
strncpy(temp_path1, "", lenght_env_path + strlen(icon_filename) );