From 6f82595a16750a3811526da9b4376a178e90bb49 Mon Sep 17 00:00:00 2001 From: Jeffrey Altman Date: Mon, 14 Nov 2005 06:04:23 +0000 Subject: [PATCH] audit-locking-20051113 Add locks around writes to the audit log. This ensures two writes do not interleave. --- src/audit/audit.c | 37 ++++++++++++++++++++++++++----------- src/audit/audit.h | 2 ++ 2 files changed, 28 insertions(+), 11 deletions(-) diff --git a/src/audit/audit.c b/src/audit/audit.c index 71c4dbbde..aeea18567 100644 --- a/src/audit/audit.c +++ b/src/audit/audit.c @@ -257,6 +257,19 @@ printbuf(FILE *out, int rec, char *audEvent, afs_int32 errCode, va_list vaList) fprintf(out, "\n"); } +static struct Lock audlock; +static afs_int32 lock_init = 0; +void +osi_audit_init(void) +{ +#ifdef AFS_PTHREAD_ENV + if ( !lock_init ) { + Lock_Init(&audlock); + lock_init = 1; + } +#endif /* AFS_PTHREAD_ENV */ +} + /* ************************************************************************** */ /* The routine that acually does the audit call. * ************************************************************************** */ @@ -268,20 +281,18 @@ osi_audit(char *audEvent, /* Event name (15 chars or less) */ #ifdef AFS_AIX32_ENV afs_int32 code; afs_int32 err; + static char BUFFER[32768]; #endif int result; - va_list vaList; -#ifdef AFS_AIX32_ENV - static struct Lock audbuflock = { 0, 0, 0, 0, + #ifdef AFS_PTHREAD_ENV - PTHREAD_MUTEX_INITIALIZER, - PTHREAD_COND_INITIALIZER, - PTHREAD_COND_INITIALIZER + /* This is not thread safe. Lock initialization should + * be done in a server initialization phase + */ + if ( !lock_init ) + osi_audit_init(); #endif /* AFS_PTHREAD_ENV */ - }; - static char BUFFER[32768]; -#endif if ((osi_audit_all < 0) || (osi_echo_trail < 0)) osi_audit_check(); @@ -312,8 +323,10 @@ osi_audit(char *audEvent, /* Event name (15 chars or less) */ break; } +#ifdef AFS_PTHREAD_ENV + ObtainWriteLock(&audlock); +#endif #ifdef AFS_AIX32_ENV - ObtainWriteLock(&audbuflock); bufferPtr = BUFFER; /* Put the error code into the buffer list */ @@ -340,7 +353,6 @@ osi_audit(char *audEvent, /* Event name (15 chars or less) */ printf("Error while writing audit entry: %d.\n", errno); } #endif /* notdef */ - ReleaseWriteLock(&audbuflock); #else if (auditout) { va_start(vaList, errCode); @@ -348,6 +360,9 @@ osi_audit(char *audEvent, /* Event name (15 chars or less) */ fflush(auditout); } #endif +#ifdef AFS_PTHREAD_ENV + ReleaseWriteLock(&audlock); +#endif return 0; } diff --git a/src/audit/audit.h b/src/audit/audit.h index b02e80d6a..ba6f27741 100644 --- a/src/audit/audit.h +++ b/src/audit/audit.h @@ -292,3 +292,5 @@ int osi_audit(char *audEvent, afs_int32 errCode, ...); int osi_auditU(struct rx_call *call, char *audEvent, int errCode, ...); int osi_audit_file(FILE *out); +void osi_audit_init(void); + -- 2.39.5