This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

memory leak in threaded getpwuid_r() usage


Hi,

Trying to use getpwuid_r() in a threaded application. (Code is attached
at the end of the message.) But in the "ps -p <PID> -o rss,size" output
of the program, RSS increases by time while SIZE remains stable.

After exploring the web, I've found some other people
(http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=273051) facing with
the same bug. AFAICS, there's a problem with some versions of the
libnss package. I'd be so appreciated if you can help me to figure out
the source of the problem and how can I solve it.

Tests were made using libc6 2.3.2.ds1-22 and libnss-db 2.2-6.3 on
debian stable (sarge).

Here's the (ps -p <PID> -o rss,size) output of the program:

[BEGIN:output]
$ ./a.out
user_id = 1000, proc_id = 28583
  1  700 46336
  2  704 46336
...
 47  716 46332
 48  716 46332
 49  716 46336
 50  716 46336
[END:output]

And valgrind --leak-check=full output:

[BEGIN:valgrind]
156 (36 direct, 120 indirect) bytes in 1 blocks are definitely lost in
loss record 4 of 9
   at 0x1B90459D: malloc (vg_replace_malloc.c:130)
   by 0x1BA0BEE6: (within /lib/tls/libc-2.3.2.so)
   by 0x1BA0B788: __nss_database_lookup (in /lib/tls/libc-2.3.2.so)
   by 0x1DB70AFB: ???
   by 0x1B9CCD4B: getpwuid_r (in /lib/tls/libc-2.3.2.so)
   by 0x804879A: sub_func (getpwuid.c:43)
   by 0x1B918B62: start_thread (in /lib/tls/libpthread-0.60.so)
   by 0x1B9FC189: clone (in /lib/tls/libc-2.3.2.so)

340 bytes in 5 blocks are possibly lost in loss record 8 of 9
   at 0x1B904F75: calloc (vg_replace_malloc.c:175)
   by 0x1B8F2678: (within /lib/ld-2.3.2.so)
   by 0x1B8F294B: _dl_allocate_tls (in /lib/ld-2.3.2.so)
   by 0x1B91924A: allocate_stack (in /lib/tls/libpthread-0.60.so)
   by 0x1B918C54: pthread_create@@GLIBC_2.1 (in
/lib/tls/libpthread-0.60.so)
   by 0x80488AB: main (getpwuid.c:68)
[END:valgrind]


Regards.

P.S. Please excuse me if this list is the wrong place to ask the
question. But, Debian Bug Tracking System seems like not responsive
about the related report.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <pwd.h>

#include "pthread.h"

uid_t	user_id;
pid_t	proc_id;
char	cmd[128];
int		iter;

void
print_mem_usage(void)
{
	FILE		*fp = popen(cmd, "r");
	static char	 buf[64];
	
	if (!fp)
	{
		fprintf(stderr, "popen() failed!\n");
		return;
	}

	(void) fgets(buf, sizeof(buf), fp);
	fgets(buf, sizeof(buf), fp);
	printf("%3d %s", iter++, buf);
	
	fclose(fp);
}

void *
sub_func(void *tmp)
{
	int		ret;
	size_t	sz = 128;
	char	buf[sz];
	
	struct passwd	 old_pw;
	struct passwd	*new_pw;

	ret = getpwuid_r(user_id, &old_pw, buf, sz, &new_pw);
	if (ret)
		fprintf(stderr, "getpwuid_r() failed! ret = %d\n", ret);
	
	pthread_exit(NULL);
}

int
main(void)
{
	int			loop_count = 50;
	int 		thread_count = 100;
	pthread_t	threads[thread_count];
	int			i, ret;

	user_id = getuid();
	proc_id = getpid();
	sprintf(cmd, "ps -p %d -o rss,size", proc_id);
	iter = 1;
	printf("user_id = %d, proc_id = %d\n", user_id, proc_id);

	while (loop_count--)
	{
		for (i = 0; i < thread_count; i++)
		{
			ret = pthread_create(&threads[i], NULL, sub_func, NULL);
			if (ret)
				fprintf(stderr, "pthread_create() failed! i = %d, ret = %d\n", i, ret);
		}

		for (i = 0; i < thread_count; i++)
		{
			ret = pthread_join(threads[i], NULL);
			if (ret)
				fprintf(stderr, "pthread_join() failed! i = %d, ret = %d\n", i, ret);
		}

		print_mem_usage();
	}

	return 0;
}



Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]