|
|
1.1 ! root 1: /***** unido:net.games.hack / ab / 7:23 pm Sep 13, 1985*/ ! 2: ! 3: Recently hack (1.0.3) crashed with core dumps during some good games. ! 4: The crashes occured in the onbill-routine. After investigating the core ! 5: dump I found that the shopkeeper's bill was still to be paid. Normaly ! 6: if you leave a shop the bill will be cleared and onbill() would not ! 7: check it. But under certain conditions you can leave a shop without ! 8: clearing the bill. The conditions are: ! 9: ! 10: 1. You have to rob a shop in order to make the shopkeeper ! 11: follow you. ! 12: ! 13: 2. After leaving the shop being followed by the shopkeeper ! 14: you must return to the shop... ! 15: ! 16: 3. ...and then leave the unguarded shop again. ! 17: - The shopkeeper mustn't be present! ! 18: ! 19: If you climb the stairs to the previous level, chances are that your ! 20: bill now contains much more items than allowed. If so the next call to ! 21: onbill() will dump the core. ! 22: ! 23: Following is a context diff to fix the bug. Actually just the last hunk ! 24: does the fix [it deletes two lines which have been inserted in 1.0.3], ! 25: but I think the other fix was intended by the now deleted lines. ! 26: ! 27: Andreas ! 28: ! 29: -- ! 30: Andreas Bormann [email protected] ! 31: University of Dortmund N 51 29' 05" E 07 24' 42" ! 32: West Germany ! 33: ! 34: ------ the diff follows: ! 35: ! 36: *** hack.shk.c.orig Sun Aug 4 12:07:51 1985 ! 37: --- hack.shk.c Fri Sep 13 14:29:52 1985 ! 38: *************** ! 39: *** 133,139 ! 40: /* Did we just leave a shop? */ ! 41: if(u.uinshop && ! 42: (u.uinshop != roomno + 1 || shlevel != dlevel || !shopkeeper)) { ! 43: - u.uinshop = 0; ! 44: if(shopkeeper) { ! 45: if(ESHK(shopkeeper)->billct) { ! 46: pline("Somehow you escaped the shop without paying!"); ! 47: ! 48: --- 133,138 ----- ! 49: /* Did we just leave a shop? */ ! 50: if(u.uinshop && ! 51: (u.uinshop != roomno + 1 || shlevel != dlevel || !shopkeeper)) { ! 52: if(shopkeeper) { ! 53: if(ESHK(shopkeeper)->billct) { ! 54: if(inroom(shopkeeper->mx, shopkeeper->my) ! 55: *************** ! 56: *** 136,142 ! 57: u.uinshop = 0; ! 58: if(shopkeeper) { ! 59: if(ESHK(shopkeeper)->billct) { ! 60: ! pline("Somehow you escaped the shop without paying!"); ! 61: addupbill(); ! 62: pline("You stole for a total worth of %ld zorkmids.", ! 63: total); ! 64: ! 65: --- 135,143 ----- ! 66: (u.uinshop != roomno + 1 || shlevel != dlevel || !shopkeeper)) { ! 67: if(shopkeeper) { ! 68: if(ESHK(shopkeeper)->billct) { ! 69: ! if(inroom(shopkeeper->mx, shopkeeper->my) ! 70: ! == u.uinshop - 1) /* ab@unido */ ! 71: ! pline("Somehow you escaped the shop without paying!"); ! 72: addupbill(); ! 73: pline("You stole for a total worth of %ld zorkmids.", ! 74: total); ! 75: *************** ! 76: *** 149,154 ! 77: shopkeeper = 0; ! 78: shlevel = 0; ! 79: } ! 80: } ! 81: ! 82: /* Did we just enter a zoo of some kind? */ ! 83: ! 84: --- 150,156 ----- ! 85: shopkeeper = 0; ! 86: shlevel = 0; ! 87: } ! 88: + u.uinshop = 0; ! 89: } ! 90: ! 91: /* Did we just enter a zoo of some kind? */ ! 92: *************** ! 93: *** 183,190 ! 94: findshk(roomno); ! 95: if(!shopkeeper) { ! 96: rooms[roomno].rtype = 0; ! 97: - u.uinshop = 0; ! 98: - } else if(inroom(shopkeeper->mx, shopkeeper->my) != roomno) { ! 99: u.uinshop = 0; ! 100: } else if(!u.uinshop){ ! 101: if(!ESHK(shopkeeper)->visitct || ! 102: ! 103: --- 185,190 ----- ! 104: findshk(roomno); ! 105: if(!shopkeeper) { ! 106: rooms[roomno].rtype = 0; ! 107: u.uinshop = 0; ! 108: } else if(!u.uinshop){ ! 109: if(!ESHK(shopkeeper)->visitct || ! 110: /* ---------- */ ! 111: ! 112: ! 113:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.