]> git.cameronkatri.com Git - mandoc.git/commitdiff
Oops, that segfaulted after deleting an mlink from the list.
authorIngo Schwarze <schwarze@openbsd.org>
Fri, 27 Dec 2013 23:41:55 +0000 (23:41 +0000)
committerIngo Schwarze <schwarze@openbsd.org>
Fri, 27 Dec 2013 23:41:55 +0000 (23:41 +0000)
Fix the loop logic in mlinks_undupe().

mandocdb.c

index 0acd9924dc95d3a58cdfc7bd1a60a0f13e7293c2..ce0a7b4af511bdb718f9d8d138235c75392ddd3e 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: mandocdb.c,v 1.89 2013/12/27 20:35:51 schwarze Exp $ */
+/*     $Id: mandocdb.c,v 1.90 2013/12/27 23:41:55 schwarze Exp $ */
 /*
  * Copyright (c) 2011, 2012 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2011, 2012, 2013 Ingo Schwarze <schwarze@openbsd.org>
@@ -855,16 +855,16 @@ mlinks_undupe(struct mpage *mpage)
        char             *bufp;
 
        mpage->form = FORM_CAT;
-       for(prev = &mpage->mlinks; *prev; prev = &(*prev)->next) {
-               mlink = *prev;
+       prev = &mpage->mlinks;
+       while (NULL != (mlink = *prev)) {
                if (FORM_CAT != mlink->dform) {
                        mpage->form = FORM_NONE;
-                       continue;
+                       goto nextlink;
                }
                if (strlcpy(buf, mlink->file, PATH_MAX) >= PATH_MAX) {
                        if (warnings)
                                say(mlink->file, "Filename too long");
-                       continue;
+                       goto nextlink;
                }
                bufp = strstr(buf, "cat");
                assert(NULL != bufp);
@@ -874,14 +874,16 @@ mlinks_undupe(struct mpage *mpage)
                strlcat(buf, mlink->dsec, PATH_MAX);
                if (NULL == ohash_find(&mlinks,
                                ohash_qlookup(&mlinks, buf)))
-                       continue;
+                       goto nextlink;
                if (warnings)
                        say(mlink->file, "Man source exists: %s", buf);
                if (use_all)
-                       continue;
+                       goto nextlink;
                *prev = mlink->next;
                mlink_free(mlink);
-               mlink = *prev;
+               continue;
+nextlink:
+               prev = &(*prev)->next;
        }
 }