audit.c
上传用户:hepax88
上传日期:2007-01-03
资源大小:1101k
文件大小:3k
源码类别:

TCP/IP协议栈

开发平台:

Visual C++

  1. /* Routines for auditing mbuf consistency. Not used for some time, may
  2.  * not be up to date.
  3.  * Copyright 1991 Phil Karn, KA9Q
  4.  */
  5. #include <stdio.h>
  6. #include "global.h"
  7. #include "proc.h"
  8. #include "mbuf.h"
  9. extern uint8 _Uend;
  10. extern int _STKRED;
  11. union header {
  12. struct {
  13. union header *ptr;
  14. unsigned size;
  15. } s;
  16. long l;
  17. };
  18. void audit(struct mbuf *bp,char *file,int line);
  19. static void audit_mbuf(struct mbuf *bp,char *file,int line);
  20. static void dumpbuf(struct mbuf *bp);
  21. /* Perform sanity checks on mbuf. Print any errors, return 0 if none,
  22.  * nonzero otherwise
  23.  */
  24. void
  25. audit(
  26. struct mbuf *bp,
  27. char *file,
  28. int line
  29. ){
  30. register struct mbuf *bp1;
  31. for(bp1 = bp;bp1 != NULL; bp1 = bp1->next)
  32. audit_mbuf(bp1,file,line);
  33. }
  34. static void
  35. audit_mbuf(
  36. struct mbuf *bp,
  37. char *file,
  38. int line
  39. ){
  40. union header *blk;
  41. uint8 *bufstart,*bufend;
  42. uint16 overhead = sizeof(union header) + sizeof(struct mbuf);
  43. uint16 datasize;
  44. int errors = 0;
  45. uint8 *heapbot,*heaptop;
  46. if(bp == NULL)
  47. return;
  48. heapbot = &_Uend;
  49. heaptop = (uint8 *) -_STKRED;
  50. /* Does buffer appear to be a valid malloc'ed block? */
  51. blk = ((union header *)bp) - 1;
  52. if(blk->s.ptr != blk){
  53. printf("Garbage bp %lxn",(long)bp);
  54. errors++;
  55. }
  56. if((datasize = blk->s.size*sizeof(union header) - overhead) != 0){
  57. /* mbuf has data area associated with it, verify that
  58.  * pointers are within it
  59.  */
  60. bufstart = (uint8 *)(bp + 1);
  61. bufend = bufstart + datasize;
  62. if(bp->data < bufstart){
  63. printf("Data pointer before buffern");
  64. errors++;
  65. }
  66. if(bp->data + bp->cnt > bufend){
  67. printf("Data pointer + count past boundsn");
  68. errors++;
  69. }
  70. } else {
  71. /* Dup'ed mbuf, at least check that pointers are within
  72.  * heap area
  73. */
  74. if(bp->data < heapbot
  75.  || bp->data + bp->cnt > heaptop){
  76. printf("Data outside heapn");
  77. errors++;
  78. }
  79. }
  80. /* Now check link list pointers */
  81. if(bp->next != NULL && ((bp->next < (struct mbuf *)heapbot)
  82.  || bp->next > (struct mbuf *)heaptop)){
  83. printf("next pointer out of limitsn");
  84. errors++;
  85. }
  86. if(bp->anext != NULL && ((bp->anext < (struct mbuf *)heapbot)
  87.  || bp->anext > (struct mbuf *)heaptop)){
  88. printf("anext pointer out of limitsn");
  89. errors++;
  90. }
  91. if(errors != 0){
  92. dumpbuf(bp);
  93. printf("PANIC: buffer audit failure in %s line %dn",file,line);
  94. fflush(stdout);
  95. for(;;)
  96. ;
  97. }
  98. return;
  99. }
  100. static void
  101. dumpbuf(struct mbuf *bp)
  102. {
  103. union header *blk;
  104. if(bp == NULL){
  105. printf("NULL BUFFERn");
  106. return;
  107. }
  108. blk = ((union header *)bp) - 1;
  109. printf("bp %lx tot siz %u data %lx cnt %u next %lx anext %lxn",
  110. (long)bp,blk->s.size * sizeof(union header),
  111. (long)bp->data,bp->cnt,
  112. (long)bp->next,(long)bp->anext);
  113. }