00001 #ifndef _BOUNDS_H
00002 #define _BOUNDS_H
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifdef HAVE_CONFIG_H
00025 #include "config.h"
00026 #endif
00027
00028 #ifdef OSF1
00029 #include <sys/bitypes.h>
00030 #endif
00031
00032 #include <string.h>
00033 #include <stdio.h>
00034 #include <stdlib.h>
00035 #include <sys/types.h>
00036 #include <assert.h>
00037 #include <unistd.h>
00038
00039
00040
00041 #ifndef DEBUG
00042 #ifndef INLINE
00043 #define INLINE inline
00044 #endif
00045 #define ERRORRET return 0;
00046 #else
00047 #ifdef INLINE
00048 #undef INLINE
00049 #endif
00050 #define INLINE
00051 #define ERRORRET assert(0==1)
00052 #endif
00053
00054
00055
00056
00057
00058
00059
00060 static INLINE int inBounds(u_int8_t *start, u_int8_t *end, u_int8_t *p)
00061 {
00062 if(p >= start && p < end)
00063 {
00064 return 1;
00065 }
00066
00067 return 0;
00068 }
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081 static INLINE int SafeMemcpy(void *dst, void *src, size_t n, void *start, void *end)
00082 {
00083 if(n < 1)
00084 {
00085 ERRORRET;
00086 }
00087
00088 if(!inBounds(start,end, dst) || !inBounds(start,end,((u_int8_t*)dst)+n))
00089 {
00090 ERRORRET;
00091 }
00092
00093 memcpy(dst, src, n);
00094 return 1;
00095 }
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107 static INLINE int SafeWrite(u_int8_t *start, u_int8_t *end, u_int8_t *dst, u_int8_t *src)
00108 {
00109 if(!inBounds(start, end, dst))
00110 {
00111 ERRORRET;
00112 }
00113
00114 *dst = *src;
00115 return 1;
00116 }
00117
00118 static inline int SafeRead(u_int8_t *start, u_int8_t *end, u_int8_t *src, u_int8_t *read)
00119 {
00120 if(!inBounds(start,end, src))
00121 {
00122 ERRORRET;
00123 }
00124
00125 *read = *start;
00126 return 1;
00127 }
00128
00129 #endif