X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=libatalk%2Fadouble%2Fad_flush.c;h=a02c223c0172451cf366cff390650f74fd62d12b;hb=f62549bc58297ef4081bd5f36273fdbe670999d8;hp=e1fd54ed54f256167bda6d167c331cf98c27a362;hpb=3db065fc676b105a36f668df45a5d17d83aebb9b;p=netatalk.git diff --git a/libatalk/adouble/ad_flush.c b/libatalk/adouble/ad_flush.c index e1fd54ed..a02c223c 100644 --- a/libatalk/adouble/ad_flush.c +++ b/libatalk/adouble/ad_flush.c @@ -188,36 +188,28 @@ int ad_close(struct adouble *ad, int adflags) { int err = 0; - if (ad == NULL) - return 0; - LOG(log_debug, logtype_default, "ad_close(%s)", adflags2logstr(adflags)); - if (ad_data_fileno(ad) != -1) { - if ((ad_data_fileno(ad) == -2) && (ad->ad_data_fork.adf_syml != NULL)) { + if ((adflags & ADFLAGS_DF) + && (ad_data_fileno(ad) >= 0 || ad_data_fileno(ad) == -2) /* -2 means symlink */ + && --ad->ad_data_fork.adf_refcount == 0) { + if (ad->ad_data_fork.adf_syml != NULL) { free(ad->ad_data_fork.adf_syml); - ad->ad_data_fork.adf_syml = NULL; + ad->ad_data_fork.adf_syml = 0; } else { if ( close( ad_data_fileno(ad) ) < 0 ) err = -1; } ad_data_fileno(ad) = -1; adf_lock_free(&ad->ad_data_fork); - ad->ad_adflags &= ~ADFLAGS_DF; } - if (ad_meta_fileno(ad) != -1) { - if ( close( ad_meta_fileno(ad) ) < 0 ) + if ((adflags & ADFLAGS_HF) + && (ad_meta_fileno(ad) != -1 && !(--ad->ad_mdp->adf_refcount))) { + if (close( ad_meta_fileno(ad) ) < 0) err = -1; ad_meta_fileno(ad) = -1; adf_lock_free(ad->ad_mdp); - ad->ad_adflags &= ~ADFLAGS_HF; - } - - if (ad->ad_resforkbuf) { - free(ad->ad_resforkbuf); - ad->ad_resforkbuf = NULL; - ad->ad_adflags &= ~ADFLAGS_RF; } return err;