Sidney Cammeresi <[EMAIL PROTECTED]> writes: > I'm an AFS newbie, setting up a new cell on an AMD64 machine running > Debian 3.1 and the OpenAFS 1.4.0 packages from unstable.
> I was experimenting with backups when I hit a crash in butc after hitting > enter at the `insert a tape' prompt. > Program received signal SIGSEGV, Segmentation fault. > ktimeDate_FromInt32 (timeSecs=1141237580, ktimePtr=0x594a60) > at ./kreltime.c:122 > 122 ktimePtr->sec = timePtr->tm_sec; > (gdb) bt > #0 ktimeDate_FromInt32 (timeSecs=1141237580, ktimePtr=0x594a60) > at ./kreltime.c:122 > #1 0x000000000045fcc4 in Add_RelDate_to_Time (relDatePtr=0x2a95ef3788, > atime=-383805929) at ./kreltime.c:290 > #2 0x0000000000412004 in calcExpirationDate (expType=-1673440488, > expDate=-1, > createTime=1141237580) at dump.c:162 > #3 0x0000000000412729 in getDumpTape (dparamsPtr=0x2a95ef5288, > interactiveFlag=1873051225, append=0) at dump.c:1753 > #4 0x0000000000414bb1 in Dumper (nodePtr=0x5caed0) at dump.c:1229 > #5 0x000000000045af58 in Create_Process_Part2 () at ./lwp.c:778 > #6 0x0000002a957ca1a0 in swapcontext () from /lib/libc.so.6 > Turns out timePtr was null. On a guess, I changed the localtime call > to localtime_r (and made the other changes that required), and butc > stopped crashing. Hm, yes. butc is built threaded on platforms that support it, so using a non-reentrant interface could potentially cause problems. It would require some other thread to be calling localtime at the same time, but I suppose that's possible. The problem is that you can't just use localtime_r without providing a replacement if one is needed. butc already provides its own replacement, but that doesn't help for this code, since it's in util. Should we just move the localtime_r replacement to util for anyone who needs to use it, and then change the references in util that currently use localtime to use localtime_r instead? I'm not sure what all in AFS is threaded and what of the other uses of localtime might be problems: bozo/bnode.c: TimeFields = localtime(&Start.tv_sec); bucoord/commands.c: ltime = localtime(&t); bucoord/expire.c: timePtr = localtime(&timeSecs); budb/server.c: lt = localtime(&t); kauth/rebuild.c: tm_p = localtime((time_t *) & entry->user_expiration); kauth/rebuild.c: localtime((time_t *) & entryp->user_expiration)); ptserver/display.c: tm = localtime(&now); ptserver/display.c: tm = localtime(&clock); util/kreltime.c: timePtr = localtime((time_t *) & timeSecs); util/ktime.c: tsp = localtime(&probe); /* find out what UTC time "probe" is */ util/ktime.c: tsp = localtime(&time_next); util/ktime.c: tsp = localtime(&temp); util/serverLog.c: TimeFields = localtime(&t); vol/vol-info.c: struct tm *tm = localtime(&date); vol/vol-salvage.c: lt = localtime(&clock); vol/vol-salvage.c: lt = localtime(&now); > I don't know enough about all the various systems OpenAFS supports to > say whether this is correct across the board, but it fixes the crash > on my machine, at least, so here it is, FWIW. butc/dump.c says that localtime_r loses on: #if defined(AFS_NT40_ENV) || (defined(AFS_DARWIN_ENV) && !defined(AFS_DARWIN60_ENV)) || defined(AFS_SUN4_ENV) Other than AFS_NT40_ENV, that's a set of platforms that I must admit I have some trouble caring a great deal about.... -- Russ Allbery ([EMAIL PROTECTED]) <http://www.eyrie.org/~eagle/> _______________________________________________ OpenAFS-devel mailing list OpenAFS-devel@openafs.org https://lists.openafs.org/mailman/listinfo/openafs-devel