Memory leaks in smbd ?

Martin Zielinski mz at seh.de
Wed Nov 12 10:44:52 GMT 2008


Hello!

With samba 3.2.4 (and even 3.0.x) we see growing smbd's in some situations.
Using smbcontrol to find the reason gave the (snipped) result attached 
to this mail.

I'm not familliar with the talloc methods.
But the first scans for samu_new brought:

winbindd_passdb.c / lookup_usergroups
[...]
	if ( (user = samu_new(mem_ctx)) == NULL ) {
		return NT_STATUS_NO_MEMORY;
	}

	if ( !pdb_getsampwsid( user, user_sid ) ) {
		return NT_STATUS_NO_SUCH_USER;
[...]

looks, like there is a "TALLOC_FREE( user );" missing??

or in auth_util.c / create_token_from_username:

if (sid_check_is_in_our_domain(&user_sid)) {
	bool ret;
	/* This is a passdb user, so ask passdb */
	struct samu *sam_acct = NULL;
	if ( !(sam_acct = samu_new( tmp_ctx )) ) {
		result = NT_STATUS_NO_MEMORY;
		goto done;
	}

	become_root();
	ret = pdb_getsampwsid(sam_acct, &user_sid);
	unbecome_root();

	if (!ret) {
		DEBUG(1, ("pdb_getsampwsid(%s) for user %s failed\n",
			  sid_string_dbg(&user_sid), username));
		DEBUGADD(1, ("Fall back to unix user %s\n", username));
		goto unix_user;
[...]

The unix_user mark is outside of the sam_acct declaration and sam_acct 
will not be destroyed.

As said before, I'm not familiar with the tallocs, so I dunno, wether

result = pdb_enum_group_memberships(tmp_ctx, sam_acct,
					    &group_sids, &gids,
					    &num_group_sids);

will later take care of the memory of sam_acct. Otherwise sam_acct would 
not be destroyed anytime.

Comments, hints, corrections?

Bye,
Martin


-- 
Martin Zielinski 			mz at seh.de		
Softwareentwicklung			T +49 (0)521 94226 76	

SEH Computertechnik GmbH 		www.seh.de

-------------- next part --------------
================== smbcontrol =====================
full talloc report on 'null_context' (total 489514 bytes in 22160 blocks)
    msg_pool_usage                 contains    527 bytes in   3 blocks (ref 0)
        char                           contains    512 bytes in   1 blocks (ref 0)
        .name                          contains     15 bytes in   1 blocks (ref 0)
    struct messaging_array         contains     84 bytes in   3 blocks (ref 0)
        librpc/gen_ndr/ndr_messaging.c:77 contains     28 bytes in   1 blocks (ref 0)
        struct ndr_pull                contains     48 bytes in   1 blocks (ref 0)
    struct samu                    contains    543 bytes in  26 blocks (ref 0)
        struct passwd                  contains     71 bytes in   6 blocks (ref 0)
            /bin/sh                        contains      8 bytes in   1 blocks (ref 0)
            /tmp/                          contains      6 bytes in   1 blocks (ref 0)
                                           contains      1 bytes in   1 blocks (ref 0)
            gwh1Slk4/wa86                  contains     14 bytes in   1 blocks (ref 0)
            administrator                  contains     14 bytes in   1 blocks (ref 0)
        lib/data_blob.c:74             contains     16 bytes in   1 blocks (ref 0)
                                       contains      1 bytes in   1 blocks (ref 0)
                                       contains      1 bytes in   1 blocks (ref 0)
                                       contains      1 bytes in   1 blocks (ref 0)
        \\isd0ac778\administrator\profile contains     34 bytes in   1 blocks (ref 0)
        \\isd0ac778\administrator\profile contains     34 bytes in   1 blocks (ref 0)
                                       contains      1 bytes in   1 blocks (ref 0)
                                       contains      1 bytes in   1 blocks (ref 0)
                                       contains      1 bytes in   1 blocks (ref 0)
        \\isd0ac778\administrator      contains     26 bytes in   1 blocks (ref 0)
        \\isd0ac778\administrator      contains     26 bytes in   1 blocks (ref 0)
                                       contains      1 bytes in   1 blocks (ref 0)
                                       contains      1 bytes in   1 blocks (ref 0)
        ISD0AC778                      contains     10 bytes in   1 blocks (ref 0)
        administrator                  contains     14 bytes in   1 blocks (ref 0)
        uint32                         contains      8 bytes in   1 blocks (ref 0)
        struct bitmap                  contains      8 bytes in   1 blocks (ref 0)
        uint32                         contains      8 bytes in   1 blocks (ref 0)
        struct bitmap                  contains      8 bytes in   1 blocks (ref 0)
    Printer Entry [-40000784]      contains     26 bytes in   2 blocks (ref 0)
        .name                          contains     26 bytes in   1 blocks (ref 0)
    struct samu                    contains    543 bytes in  26 blocks (ref 0)
        struct passwd                  contains     71 bytes in   6 blocks (ref 0)
            /bin/sh                        contains      8 bytes in   1 blocks (ref 0)
            /tmp/                          contains      6 bytes in   1 blocks (ref 0)
                                           contains      1 bytes in   1 blocks (ref 0)
            gwh1Slk4/wa86                  contains     14 bytes in   1 blocks (ref 0)
            administrator                  contains     14 bytes in   1 blocks (ref 0)
        lib/data_blob.c:74             contains     16 bytes in   1 blocks (ref 0)
                                       contains      1 bytes in   1 blocks (ref 0)
                                       contains      1 bytes in   1 blocks (ref 0)
                                       contains      1 bytes in   1 blocks (ref 0)
        \\isd0ac778\administrator\profile contains     34 bytes in   1 blocks (ref 0)
        \\isd0ac778\administrator\profile contains     34 bytes in   1 blocks (ref 0)
                                       contains      1 bytes in   1 blocks (ref 0)
                                       contains      1 bytes in   1 blocks (ref 0)
                                       contains      1 bytes in   1 blocks (ref 0)
        \\isd0ac778\administrator      contains     26 bytes in   1 blocks (ref 0)
        \\isd0ac778\administrator      contains     26 bytes in   1 blocks (ref 0)
                                       contains      1 bytes in   1 blocks (ref 0)
                                       contains      1 bytes in   1 blocks (ref 0)
        ISD0AC778                      contains     10 bytes in   1 blocks (ref 0)
        administrator                  contains     14 bytes in   1 blocks (ref 0)
        uint32                         contains      8 bytes in   1 blocks (ref 0)
        struct bitmap                  contains      8 bytes in   1 blocks (ref 0)
        uint32                         contains      8 bytes in   1 blocks (ref 0)
        struct bitmap                  contains      8 bytes in   1 blocks (ref 0)
    Printer Entry [-40000784]      contains     26 bytes in   2 blocks (ref 0)
        .name                          contains     26 bytes in   1 blocks (ref 0)
    struct samu                    contains    543 bytes in  26 blocks (ref 0)
        struct passwd                  contains     71 bytes in   6 blocks (ref 0)
            /bin/sh                        contains      8 bytes in   1 blocks (ref 0)
            /tmp/                          contains      6 bytes in   1 blocks (ref 0)
                                           contains      1 bytes in   1 blocks (ref 0)
            gwh1Slk4/wa86                  contains     14 bytes in   1 blocks (ref 0)
            administrator                  contains     14 bytes in   1 blocks (ref 0)
        lib/data_blob.c:74             contains     16 bytes in   1 blocks (ref 0)
                                       contains      1 bytes in   1 blocks (ref 0)
                                       contains      1 bytes in   1 blocks (ref 0)
                                       contains      1 bytes in   1 blocks (ref 0)
        \\isd0ac778\administrator\profile contains     34 bytes in   1 blocks (ref 0)
        \\isd0ac778\administrator\profile contains     34 bytes in   1 blocks (ref 0)
                                       contains      1 bytes in   1 blocks (ref 0)
                                       contains      1 bytes in   1 blocks (ref 0)
                                       contains      1 bytes in   1 blocks (ref 0)
        \\isd0ac778\administrator      contains     26 bytes in   1 blocks (ref 0)
        \\isd0ac778\administrator      contains     26 bytes in   1 blocks (ref 0)
                                       contains      1 bytes in   1 blocks (ref 0)
                                       contains      1 bytes in   1 blocks (ref 0)
        ISD0AC778                      contains     10 bytes in   1 blocks (ref 0)
        administrator                  contains     14 bytes in   1 blocks (ref 0)
        uint32                         contains      8 bytes in   1 blocks (ref 0)
        struct bitmap                  contains      8 bytes in   1 blocks (ref 0)
        uint32                         contains      8 bytes in   1 blocks (ref 0)
        struct bitmap                  contains      8 bytes in   1 blocks (ref 0)
    Printer Entry [-40000784]      contains     26 bytes in   2 blocks (ref 0)
        .name                          contains     26 bytes in   1 blocks (ref 0)
    struct samu                    contains    543 bytes in  26 blocks (ref 0)
        struct passwd                  contains     71 bytes in   6 blocks (ref 0)
            /bin/sh                        contains      8 bytes in   1 blocks (ref 0)
            /tmp/                          contains      6 bytes in   1 blocks (ref 0)
                                           contains      1 bytes in   1 blocks (ref 0)
            gwh1Slk4/wa86                  contains     14 bytes in   1 blocks (ref 0)
            administrator                  contains     14 bytes in   1 blocks (ref 0)
        lib/data_blob.c:74             contains     16 bytes in   1 blocks (ref 0)
                                       contains      1 bytes in   1 blocks (ref 0)
                                       contains      1 bytes in   1 blocks (ref 0)
                                       contains      1 bytes in   1 blocks (ref 0)
        \\isd0ac778\administrator\profile contains     34 bytes in   1 blocks (ref 0)
        \\isd0ac778\administrator\profile contains     34 bytes in   1 blocks (ref 0)
                                       contains      1 bytes in   1 blocks (ref 0)
                                       contains      1 bytes in   1 blocks (ref 0)
                                       contains      1 bytes in   1 blocks (ref 0)
        \\isd0ac778\administrator      contains     26 bytes in   1 blocks (ref 0)
        \\isd0ac778\administrator      contains     26 bytes in   1 blocks (ref 0)
                                       contains      1 bytes in   1 blocks (ref 0)
                                       contains      1 bytes in   1 blocks (ref 0)
        ISD0AC778                      contains     10 bytes in   1 blocks (ref 0)
        administrator                  contains     14 bytes in   1 blocks (ref 0)
        uint32                         contains      8 bytes in   1 blocks (ref 0)
        struct bitmap                  contains      8 bytes in   1 blocks (ref 0)
        uint32                         contains      8 bytes in   1 blocks (ref 0)
        struct bitmap                  contains      8 bytes in   1 blocks (ref 0)
    NT_USER_TOKEN                  contains    364 bytes in   2 blocks (ref 0)
        lib/util_nttoken.c:50          contains    340 bytes in   1 blocks (ref 0)
    NT_USER_TOKEN                  contains    364 bytes in   2 blocks (ref 0)
        lib/util_nttoken.c:50          contains    340 bytes in   1 blocks (ref 0)
    pipe_state spoolss 79e410      contains     26 bytes in   2 blocks (ref 0)
        .name                          contains     26 bytes in   1 blocks (ref 0)
    ÕQ†ÄºÓœAL                    contains      0 bytes in   1 blocks (ref 0)
    smb_np_struct                  contains     64 bytes in   2 blocks (ref 0)
        spoolss                        contains      8 bytes in   1 blocks (ref 0)
    struct samu                    contains    543 bytes in  26 blocks (ref 0)
        struct passwd                  contains     71 bytes in   6 blocks (ref 0)
            /bin/sh                        contains      8 bytes in   1 blocks (ref 0)
            /tmp/                          contains      6 bytes in   1 blocks (ref 0)
                                           contains      1 bytes in   1 blocks (ref 0)
            gwh1Slk4/wa86                  contains     14 bytes in   1 blocks (ref 0)
            administrator                  contains     14 bytes in   1 blocks (ref 0)
        lib/data_blob.c:74             contains     16 bytes in   1 blocks (ref 0)
                                       contains      1 bytes in   1 blocks (ref 0)
                                       contains      1 bytes in   1 blocks (ref 0)
                                       contains      1 bytes in   1 blocks (ref 0)
        \\isd0ac778\administrator\profile contains     34 bytes in   1 blocks (ref 0)
        \\isd0ac778\administrator\profile contains     34 bytes in   1 blocks (ref 0)
                                       contains      1 bytes in   1 blocks (ref 0)
                                       contains      1 bytes in   1 blocks (ref 0)
                                       contains      1 bytes in   1 blocks (ref 0)
        \\isd0ac778\administrator      contains     26 bytes in   1 blocks (ref 0)
        \\isd0ac778\administrator      contains     26 bytes in   1 blocks (ref 0)
                                       contains      1 bytes in   1 blocks (ref 0)
                                       contains      1 bytes in   1 blocks (ref 0)
        ISD0AC778                      contains     10 bytes in   1 blocks (ref 0)
        administrator                  contains     14 bytes in   1 blocks (ref 0)
        uint32                         contains      8 bytes in   1 blocks (ref 0)
        struct bitmap                  contains      8 bytes in   1 blocks (ref 0)
        uint32                         contains      8 bytes in   1 blocks (ref 0)
        struct bitmap                  contains      8 bytes in   1 blocks (ref 0)
    struct samu                    contains    543 bytes in  26 blocks (ref 0)
        struct passwd                  contains     71 bytes in   6 blocks (ref 0)
            /bin/sh                        contains      8 bytes in   1 blocks (ref 0)
            /tmp/                          contains      6 bytes in   1 blocks (ref 0)
                                           contains      1 bytes in   1 blocks (ref 0)
            gwh1Slk4/wa86                  contains     14 bytes in   1 blocks (ref 0)
            administrator                  contains     14 bytes in   1 blocks (ref 0)
        lib/data_blob.c:74             contains     16 bytes in   1 blocks (ref 0)
                                       contains      1 bytes in   1 blocks (ref 0)
                                       contains      1 bytes in   1 blocks (ref 0)
                                       contains      1 bytes in   1 blocks (ref 0)
        \\isd0ac778\administrator\profile contains     34 bytes in   1 blocks (ref 0)
        \\isd0ac778\administrator\profile contains     34 bytes in   1 blocks (ref 0)
                                       contains      1 bytes in   1 blocks (ref 0)
                                       contains      1 bytes in   1 blocks (ref 0)
                                       contains      1 bytes in   1 blocks (ref 0)
        \\isd0ac778\administrator      contains     26 bytes in   1 blocks (ref 0)
        \\isd0ac778\administrator      contains     26 bytes in   1 blocks (ref 0)
                                       contains      1 bytes in   1 blocks (ref 0)
                                       contains      1 bytes in   1 blocks (ref 0)
        ISD0AC778                      contains     10 bytes in   1 blocks (ref 0)
        administrator                  contains     14 bytes in   1 blocks (ref 0)
        uint32                         contains      8 bytes in   1 blocks (ref 0)
        struct bitmap                  contains      8 bytes in   1 blocks (ref 0)
        uint32                         contains      8 bytes in   1 blocks (ref 0)
        struct bitmap                  contains      8 bytes in   1 blocks (ref 0)
    struct samu                    contains    543 bytes in  26 blocks (ref 0)
        struct passwd                  contains     71 bytes in   6 blocks (ref 0)
            /bin/sh                        contains      8 bytes in   1 blocks (ref 0)
            /tmp/                          contains      6 bytes in   1 blocks (ref 0)
                                           contains      1 bytes in   1 blocks (ref 0)
            gwh1Slk4/wa86                  contains     14 bytes in   1 blocks (ref 0)
            administrator                  contains     14 bytes in   1 blocks (ref 0)
        lib/data_blob.c:74             contains     16 bytes in   1 blocks (ref 0)
                                       contains      1 bytes in   1 blocks (ref 0)
                                       contains      1 bytes in   1 blocks (ref 0)
                                       contains      1 bytes in   1 blocks (ref 0)
        \\isd0ac778\administrator\profile contains     34 bytes in   1 blocks (ref 0)
        \\isd0ac778\administrator\profile contains     34 bytes in   1 blocks (ref 0)
                                       contains      1 bytes in   1 blocks (ref 0)
                                       contains      1 bytes in   1 blocks (ref 0)
                                       contains      1 bytes in   1 blocks (ref 0)
        \\isd0ac778\administrator      contains     26 bytes in   1 blocks (ref 0)
        \\isd0ac778\administrator      contains     26 bytes in   1 blocks (ref 0)
                                       contains      1 bytes in   1 blocks (ref 0)
                                       contains      1 bytes in   1 blocks (ref 0)
        ISD0AC778                      contains     10 bytes in   1 blocks (ref 0)
        administrator                  contains     14 bytes in   1 blocks (ref 0)
        uint32                         contains      8 bytes in   1 blocks (ref 0)
        struct bitmap                  contains      8 bytes in   1 blocks (ref 0)
        uint32                         contains      8 bytes in   1 blocks (ref 0)
        struct bitmap                  contains      8 bytes in   1 blocks (ref 0)

[ ... and so on and so forth ... ]


More information about the samba-technical mailing list