On Thu, Feb 26, 2015 at 09:46:10PM +0100, Jakub Hrozek wrote:
> On Thu, Feb 26, 2015 at 12:22:53PM -0700, Daniel Hjorth wrote:
> > On Thu, Feb 26, 2015 at 01:13:05PM +0100, Jakub Hrozek wrote:
> > > On Wed, Feb 25, 2015 at 01:47:36PM -0700, Daniel Hjorth wrote:
> > > > https://fedorahosted.org/sssd/ticket/2592
> > > > 
> > > > If there is an error after ccname_file_dummy is created but before it is
> > > > renamed then the file isn't removed.  This can cause a lot of files to
> > > > be created and take up inodes in a filesystem.
> > > 
> > > > From f50db04f5d0cf73edb2e8aa27da9450562dae08e Mon Sep 17 00:00:00 2001
> > > > From: Daniel Hjorth <d...@dhjorth.com>
> > > > Date: Wed, 25 Feb 2015 13:07:35 -0700
> > > > Subject: [PATCH] LDAP: unlink ccname_file_dummy if there is an error
> > > > 
> > > > https://fedorahosted.org/sssd/ticket/2592
> > > > 
> > > > If there is an error after ccname_file_dummy is created but before it is
> > > > renamed then the file isn't removed.  This can cause a lot of files to 
> > > > be 
> > > > created and take up inodes in a filesystem.
> > > > ---
> > > >  src/providers/ldap/ldap_child.c | 1 +
> > > >  1 file changed, 1 insertion(+)
> > > > 
> > > > diff --git a/src/providers/ldap/ldap_child.c 
> > > > b/src/providers/ldap/ldap_child.c
> > > > index 
> > > > e9aebf5a6319b5d848aadfb27061099fc153a7f6..676f0c7c5033f1941feb24d070cbff253bdbadbf
> > > >  100644
> > > > --- a/src/providers/ldap/ldap_child.c
> > > > +++ b/src/providers/ldap/ldap_child.c
> > > > @@ -499,6 +499,7 @@ done:
> > > >      if (krberr != 0) KRB5_SYSLOG(krberr);
> > > >      if (keytab) krb5_kt_close(context, keytab);
> > > >      if (context) krb5_free_context(context);
> > > > +    if (ccname_file_dummy) unlink(ccname_file_dummy);
> > > >      return krberr;
> > > >  }
> > > >  
> > > > -- 
> > > > 1.9.3
> > > > 
> > > 
> > > Thank you very much for catching the issue and the patch! I wonder if it
> > > would be better to call talloc_zfree(ccname_file_dummy) in case the
> > > rename(2) succeeds in order to only call the unlink if the dummy file is
> > > still around?
> > 
> > Hi Jakub,
> > 
> > You're welcome, I'm happy to help.  I'm not sure I understand your
> > question though.  Because talloc_free(tmp_ctx) is being called
> > wouldn't that already free the memory for ccname_file_dummy?
> 
> Ah, yes :-) we need to move talloc_free(tmp_ctx) as well.
> 
> > Maybe
> > something like this would prevent the unlink if the rename is
> > successful?
> > 
> > if (ccname_file_dummy && krberr != 0) {
> >     unlink(ccname_file_dummy);
> > }
> > 
> > Daniel
> 
> Could we simply make the end of the function look like this?
> 
> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>     ret = rename(ccname_file_dummy, ccname_file);
>     if (ret == -1) {
>         ret = errno;
>         DEBUG(SSSDBG_CRIT_FAILURE,
>               "rename failed [%d][%s].\n", ret, strerror(ret));
>         goto done;
>     }
>     ccname_file_dummy = NULL; /* optional, just to avoid seeing ENOENT 
> failures when stracing the ldap_child and ccname_file_dummy was already 
> renamed */
> 
> done:
>     if (krberr != 0) KRB5_SYSLOG(krberr);
>     if (keytab) krb5_kt_close(context, keytab);
>     if (context) krb5_free_context(context);
>     if (ccname_file_dummy) unlink(ccname_file_dummy);   /* Added */
>     talloc_free(tmp_ctx);                               /* Moved to avoid 
> freeing ccname_file_dummy which is allocated on top of tmp_ctx */
>     return krberr;
> }
> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> 
> Would that work for you?

Yeah that looks great.  I've attached the modified patch, does it look
correct?

Daniel
>From 992df27bbf238a342d044584a6ebdcb381b60c52 Mon Sep 17 00:00:00 2001
From: Daniel Hjorth <d...@dhjorth.com>
Date: Wed, 25 Feb 2015 13:07:35 -0700
Subject: [PATCH] LDAP: unlink ccname_file_dummy if there is an error

https://fedorahosted.org/sssd/ticket/2592

If there is an error after ccname_file_dummy is created but before it is
renamed then the file isn't removed.  This can cause a lot of files to be 
created and take up inodes in a filesystem.
---
 src/providers/ldap/ldap_child.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/src/providers/ldap/ldap_child.c b/src/providers/ldap/ldap_child.c
index 
e9aebf5a6319b5d848aadfb27061099fc153a7f6..cee1e3faa6d4857e8456f5ef421e2c925bd08b17
 100644
--- a/src/providers/ldap/ldap_child.c
+++ b/src/providers/ldap/ldap_child.c
@@ -489,16 +489,18 @@ static krb5_error_code ldap_child_get_tgt_sync(TALLOC_CTX 
*memctx,
               "rename failed [%d][%s].\n", ret, strerror(ret));
         goto done;
     }
+    ccname_file_dummy = NULL;
 
     krberr = 0;
     *ccname_out = talloc_steal(memctx, ccname);
     *expire_time_out = my_creds.times.endtime - kdc_time_offset;
 
 done:
-    talloc_free(tmp_ctx);
     if (krberr != 0) KRB5_SYSLOG(krberr);
     if (keytab) krb5_kt_close(context, keytab);
     if (context) krb5_free_context(context);
+    if (ccname_file_dummy) unlink(ccname_file_dummy);
+    talloc_free(tmp_ctx);
     return krberr;
 }
 
-- 
1.9.3

_______________________________________________
sssd-devel mailing list
sssd-devel@lists.fedorahosted.org
https://lists.fedorahosted.org/mailman/listinfo/sssd-devel

Reply via email to