From 246338ef17620111ad50383b7fb5a65b8c369f67 Mon Sep 17 00:00:00 2001 From: Michael Meffie Date: Tue, 17 Feb 2015 20:58:27 -0500 Subject: [PATCH] prdb_check: check for continuation entries in owner chains Continuation entries may not be in owner chains. Fix the comments in WalkOwnerChain (which were probably copied from WalkNextChain) and add a check and error message for continuation entries found on owner chains. Reviewed-on: http://gerrit.openafs.org/11751 Reviewed-by: Daria Phoebe Brashear Reviewed-by: Benjamin Kaduk Tested-by: BuildBot (cherry picked from commit 3e9e244d1004972f202490faa0375768959f7690) Change-Id: I8da044e32e6ade0d8d3050ccebf46d1e735e333a Reviewed-on: http://gerrit.openafs.org/12103 Tested-by: BuildBot Reviewed-by: Michael Meffie Reviewed-by: Stephan Wiesand --- src/ptserver/db_verify.c | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/src/ptserver/db_verify.c b/src/ptserver/db_verify.c index a07d04ea4..65b5be789 100644 --- a/src/ptserver/db_verify.c +++ b/src/ptserver/db_verify.c @@ -705,7 +705,7 @@ WalkOwnedChain(char map[], /* one byte per db entry */ { afs_int32 head; afs_int32 code; - struct prentry c; /* continuation entry */ + struct prentry te; /* next entry in owner chain */ afs_int32 na; /* next thread */ int ni; afs_int32 eid = 0; @@ -718,7 +718,7 @@ WalkOwnedChain(char map[], /* one byte per db entry */ head = ntohl(cheader.orphan); length = 0; - for (na = head; na; na = ntohl(c.nextOwned)) { + for (na = head; na; na = ntohl(te.nextOwned)) { code = ConvertDiskAddress(na, &ni); if (code) { fprintf(stderr, "Bad owned list ptr %d", na); @@ -728,23 +728,33 @@ WalkOwnedChain(char map[], /* one byte per db entry */ return PRDBBAD; if (na != head) { fprintf(stderr, "last block: \n"); - if (PrintEntryError(misc, na, &c, 4)) + if (PrintEntryError(misc, na, &te, 4)) return PRDBBAD; } return 0; } - code = pr_Read(na, (char *)&c, sizeof(c)); + code = pr_Read(na, (char *)&te, sizeof(te)); if (code) return code; length++; + if ((ntohl(te.flags) & PRTYPE) == PRCONT) { + fprintf(stderr, "Continuation entry found on owner chain\n"); + if (e == 0) + fprintf(stderr, "walking orphan list"); + else if (PrintEntryError(misc, ea, e, 2)) + return PRDBBAD; + if (PrintEntryError(misc, na, &te, 4)) + return PRDBBAD; + break; + } if (map[ni] & MAP_OWNED) { fprintf(stderr, "Entry on multiple owner chains\n"); if (e == 0) fprintf(stderr, "walking orphan list"); else if (PrintEntryError(misc, ea, e, 2)) return PRDBBAD; - if (PrintEntryError(misc, na, &c, 4)) + if (PrintEntryError(misc, na, &te, 4)) return PRDBBAD; break; } @@ -756,16 +766,16 @@ WalkOwnedChain(char map[], /* one byte per db entry */ fprintf(stderr, "walking orphan list"); else if (PrintEntryError(misc, ea, e, 2)) return PRDBBAD; - if (PrintEntryError(misc, na, &c, 4)) + if (PrintEntryError(misc, na, &te, 4)) return PRDBBAD; continue; } if (e) { - if (ntohl(c.owner) != eid) { + if (ntohl(te.owner) != eid) { fprintf(stderr, "Owner id mismatch\n"); goto abort; } - } else /* orphan */ if (c.owner) { + } else /* orphan */ if (te.owner) { fprintf(stderr, "Orphan group owner not zero\n"); goto abort; } -- 2.39.5