Fixed the discovery of a prior finished hard-link when the entry
authorWayne Davison <wayned@samba.org>
Wed, 26 Mar 2008 23:12:39 +0000 (16:12 -0700)
committerWayne Davison <wayned@samba.org>
Wed, 26 Mar 2008 23:12:39 +0000 (16:12 -0700)
is old enough that it is no longer in the flist data.

hlink.c

diff --git a/hlink.c b/hlink.c
index 536b571..812c55f 100644 (file)
--- a/hlink.c
+++ b/hlink.c
@@ -249,17 +249,13 @@ static char *check_prior(struct file_struct *file, int gnum,
                         int *prev_ndx_p, struct file_list **flist_p)
 {
        struct file_struct *fp;
-       struct file_list *flist;
        struct ht_int32_node *node;
        int prev_ndx = F_HL_PREV(file);
 
        while (1) {
-               if (prev_ndx < 0) {
-                       *prev_ndx_p = prev_ndx;
-                       *flist_p = NULL;
-                       return NULL;
-               }
-               if ((flist = flist_for_ndx(prev_ndx)) == NULL)
+               struct file_list *flist;
+               if (prev_ndx < 0
+                || (flist = flist_for_ndx(prev_ndx)) == NULL)
                        break;
                fp = flist->files[prev_ndx - flist->ndx_start];
                if (!(fp->flags & FLAG_SKIP_HLINK)) {
@@ -270,20 +266,20 @@ static char *check_prior(struct file_struct *file, int gnum,
                F_HL_PREV(file) = prev_ndx = F_HL_PREV(fp);
        }
 
-       node = hashtable_find(prior_hlinks, gnum, 0);
-       assert(node != NULL && node->data);
-
-       if (CVAL(node->data, 0) == 0) {
+       if ((node = hashtable_find(prior_hlinks, gnum, 0)) != NULL) {
+               assert(node->data != NULL);
+               if (CVAL(node->data, 0) != 0) {
+                       *prev_ndx_p = -1;
+                       *flist_p = NULL;
+                       return node->data;
+               }
                /* The prior file must have been skipped. */
-               F_HL_PREV(file) = prev_ndx = -1;
-               *prev_ndx_p = prev_ndx;
-               *flist_p = NULL;
-               return NULL;
+               F_HL_PREV(file) = -1;
        }
 
-       *prev_ndx_p = prev_ndx;
-       *flist_p = flist;
-       return node->data;
+       *prev_ndx_p = -1;
+       *flist_p = NULL;
+       return NULL;
 }
 
 /* Only called if FLAG_HLINKED is set and FLAG_HLINK_FIRST is not.  Returns: