PERFORCE change 76333 for review
Robert Watson
rwatson at FreeBSD.org
Sun May 1 20:27:41 GMT 2005
http://perforce.freebsd.org/chv.cgi?CH=76333
Change 76333 by rwatson at rwatson_paprika on 2005/05/01 20:26:59
Teach au_read_rec() to recognize file tokens and treat them as a
"complete record" from the perspective of the caller. All other
audit tokens occur only in the context of a record, so matching
the record header is the right approach for them, just not the
file token.
Affected files ...
.. //depot/projects/trustedbsd/openbsm/libbsm/bsm_io.c#9 edit
Differences ...
==== //depot/projects/trustedbsd/openbsm/libbsm/bsm_io.c#9 (text+ko) ====
@@ -2243,6 +2243,13 @@
* Rread a record from the file pointer, store data in buf
* memory for buf is also allocated in this function
* and has to be free'd outside this call
+ *
+ * au_read_rec() handles two possibilities: a stand-alone file token, or a
+ * complete audit record.
+ *
+ * XXXRW: Note that if we hit an error, we leave the stream in an unusable
+ * state, because it will be partly offset into a record. We should rewind
+ * or do something more intelligent.
*/
int au_read_rec(FILE *fp, u_char **buf)
{
@@ -2251,44 +2258,97 @@
u_int32_t bytestoread;
u_char type;
+ u_int32_t sec, msec;
+ u_int16_t filenamelen;
+
type = fgetc(fp);
- /* record must begin with a header token */
- if(type != AU_HEADER_32_TOKEN) {
- errno = EINVAL;
- return -1;
- }
+
+ switch (type) {
+ case AU_HEADER_32_TOKEN:
+ case AU_HEADER_EX_32_TOKEN:
+ case AU_HEADER_64_TOKEN:
+ case AU_HEADER_EX_64_TOKEN:
+ /* read the record size from the token */
+ if (fread(&recsize, 1, sizeof(u_int32_t), fp) <
+ sizeof(u_int32_t)) {
+ errno = EINVAL;
+ return -1;
+ }
+ recsize = be32toh(recsize);
+
+ /* Check for recsize sanity */
+ if (recsize < (sizeof(u_int32_t) + sizeof(u_char))) {
+ errno = EINVAL;
+ return -1;
+ }
+
+ *buf = (u_char *)malloc(recsize * sizeof(u_char));
+ if (*buf == NULL)
+ return -1;
+ bptr = *buf;
+ memset(bptr, 0, recsize);
+
+ /* store the token contents already read, back to the buffer*/
+ *bptr = type;
+ bptr++;
+ be32enc(bptr, recsize);
+ bptr += sizeof(u_int32_t);
- /* read the record size from the token */
- if(fread(&recsize, 1, sizeof(u_int32_t), fp) < sizeof(u_int32_t)) {
- errno = EINVAL;
- return -1;
- }
- recsize = be32toh(recsize);
+ /* now read remaining record bytes */
+ bytestoread = recsize - sizeof(u_int32_t) - sizeof(u_char);
- /* Check for recsize sanity */
- if(recsize < (sizeof(u_int32_t) + sizeof(u_char))) {
- errno = EINVAL;
- return -1;
- }
+ if (fread(bptr, 1, bytestoread, fp) < bytestoread) {
+ free(*buf);
+ errno = EINVAL;
+ return -1;
+ }
+ break;
- *buf = (u_char *)malloc(recsize * sizeof(u_char));
- if(*buf == NULL) {
- return -1;
- }
- bptr = *buf;
- memset(bptr, 0, recsize);
+ case AU_FILE_TOKEN:
+ /*
+ * The file token is variable-length, as it includes a
+ * pathname. As a result, we have to read incrementally
+ * until we know the total length, then allocate space and
+ * read the rest.
+ */
+ if (fread(&sec, 1, sizeof(sec), fp) < sizeof(sec)) {
+ errno = EINVAL;
+ return -1;
+ }
+ if (fread(&msec, 1, sizeof(msec), fp) < sizeof(msec)) {
+ errno = EINVAL;
+ return -1;
+ }
+ if (fread(&filenamelen, 1, sizeof(filenamelen), fp) <
+ sizeof(filenamelen)) {
+ errno = EINVAL;
+ return -1;
+ }
+ recsize = sizeof(type) + sizeof(sec) + sizeof(msec) +
+ sizeof(filenamelen) + ntohs(filenamelen);
+ *buf = malloc(recsize);
+ if (*buf == NULL)
+ return -1;
+ bptr = *buf;
- /* store the token contents already read, back to the buffer*/
- *bptr = type;
- bptr++;
- be32enc(bptr, recsize);
- bptr += sizeof(u_int32_t);
+ bcopy(&type, bptr, sizeof(type));
+ bptr += sizeof(type);
+ bcopy(&sec, bptr, sizeof(sec));
+ bptr += sizeof(sec);
+ bcopy(&msec, bptr, sizeof(msec));
+ bptr += sizeof(msec);
+ bcopy(&filenamelen, bptr, sizeof(filenamelen));
+ bptr += sizeof(filenamelen);
- /* now read remaining record bytes */
- bytestoread = recsize - sizeof(u_int32_t) - sizeof(u_char);
+ if (fread(bptr, 1, ntohs(filenamelen), fp) <
+ ntohs(filenamelen)) {
+ free(buf);
+ errno = EINVAL;
+ return -1;
+ }
- if(fread(bptr, 1, bytestoread, fp) < bytestoread) {
- free(*buf);
+ break;
+ default:
errno = EINVAL;
return -1;
}
To Unsubscribe: send mail to majordomo at trustedbsd.org
with "unsubscribe trustedbsd-cvs" in the body of the message
More information about the trustedbsd-cvs
mailing list