From e75e217fb774221d190f9af2ce152e1fa97fc02d Mon Sep 17 00:00:00 2001 From: Jim Rees Date: Fri, 1 Jun 2007 02:03:24 +0000 Subject: [PATCH] fix-post-segfault-20070531 skip null entries in rewrite_log() --- src/disconnected/post.c | 52 +++++++++++++++++------------------------ 1 file changed, 21 insertions(+), 31 deletions(-) diff --git a/src/disconnected/post.c b/src/disconnected/post.c index 78c831649a..7730755d32 100755 --- a/src/disconnected/post.c +++ b/src/disconnected/post.c @@ -283,29 +283,30 @@ rewrite_log() log_ent_t *first_log; struct sort_ent *cur_entry; struct op_no_ent *cur_nump; - int i = 0; + int i; int joined, pass; - while (i < cur_ent) { + for (i = 0; i < cur_ent; i++) { joined = 0; cur_entry = &ent[i]; - cur_nump = cur_entry->se_nump; - new_log = log_ents[cur_nump->num]; - - + cur_nump = cur_entry->se_nump; + new_log = log_ents[cur_nump->num]; + if (new_log == NULL) { + fprintf(stderr, "rewrite_log: i=%d cur_ent=%d cur_nump->num=%d\n", + i, cur_ent, cur_nump->num); + continue; + } cur_nump = cur_nump->next; while (cur_nump != NULL) { pass = 0; joined = 1; - first_log = new_log; second_log = log_ents[cur_nump->num]; - + new_log = join_ops(first_log, second_log); -if (new_log == 0) abort(); new_log->log_flags |= LOG_GENERATED; - + /* * after the first pass we want to free the * first log because it was generated @@ -315,10 +316,8 @@ if (new_log == 0) abort(); cur_nump = cur_nump->next; pass++; - + } - -if (new_log == 0) abort(); /* XXX lhuston change to fwrite */ cc = write(newfd, new_log, new_log->log_len); @@ -326,25 +325,22 @@ if (new_log == 0) abort(); perror("failed writing new log"); exit(-1); } + free(new_log); - /* + /* * if the new log entry was a joined one, then * we write the old log entries with the optimzied * bit set on them. These need to come after the optimized - * entry, because if it doesnt' get replayed, then its + * entry, because if it doesn't get replayed, then its * changes will be lost. */ - - if (joined) { - /* free the new log entry */ - free(new_log); - + if (joined) { cur_nump = cur_entry->se_nump; while (cur_nump != NULL) { new_log = log_ents[cur_nump->num]; new_log->log_flags |= LOG_OPTIMIZED; - /* XXX lhuston change to fwrite */ + /* XXX lhuston change to fwrite */ cc = write(newfd, new_log, new_log->log_len); if (cc != new_log->log_len) { perror("failed writing new log"); @@ -358,34 +354,28 @@ if (new_log == 0) abort(); cur_nump = cur_nump->next; } } else { - /* free the entry and it's spot */ - free(new_log); log_ents[cur_entry->se_nump->num] = NULL; } - - i++; } - /* + /* * we need go write all log entries that haven't been written - * out yet. These are leftovers for the remove, rename joing + * out yet. These are leftovers for the remove, rename joining * conditions. We just scan through the log_ents list, * writing all that we find while setting the LOG_OPTIMIZED flag. */ - for (i=0; i < MAX_LOG_ENTS; i++) { if (log_ents[i] != NULL) { - new_log = log_ents[i]; + new_log = log_ents[i]; new_log->log_flags |= LOG_OPTIMIZED; - /* XXX lhuston change to fwrite */ + /* XXX lhuston change to fwrite */ cc = write(newfd, new_log, new_log->log_len); if (cc != new_log->log_len) { perror("failed writing new log"); exit(-1); } } - } }