Annotation of embedaddon/ntp/ElectricFence/eftest.c, revision 1.1

1.1     ! misho       1: #include <stdlib.h>
        !             2: #include <stdio.h>
        !             3: #include <string.h>
        !             4: #include <unistd.h>
        !             5: #include <setjmp.h>
        !             6: #include <signal.h>
        !             7: #include "efence.h"
        !             8: 
        !             9: /*
        !            10:  * Electric Fence confidence tests.
        !            11:  * Make sure all of the various functions of Electric Fence work correctly.
        !            12:  */
        !            13: 
        !            14: #ifndef        PAGE_PROTECTION_VIOLATED_SIGNAL
        !            15: #define        PAGE_PROTECTION_VIOLATED_SIGNAL SIGSEGV
        !            16: #endif
        !            17: 
        !            18: struct diagnostic {
        !            19:        int             (*test)(void);
        !            20:        int             expectedStatus;
        !            21:        const char *    explanation;
        !            22: };
        !            23: 
        !            24: extern int     EF_PROTECT_BELOW;
        !            25: extern int     EF_ALIGNMENT;
        !            26: 
        !            27: static jmp_buf env;
        !            28: 
        !            29: /*
        !            30:  * There is still too little standardization of the arguments and return
        !            31:  * type of signal handler functions.
        !            32:  */
        !            33: static
        !            34: void
        !            35: segmentationFaultHandler(
        !            36: int signalNumber
        !            37: #if ( defined(_AIX) )
        !            38: , ...
        !            39: #endif
        !            40: )
        !            41:  {
        !            42:        signal(PAGE_PROTECTION_VIOLATED_SIGNAL, SIG_DFL);
        !            43:        longjmp(env, 1);
        !            44: }
        !            45: 
        !            46: static int
        !            47: gotSegmentationFault(int (*test)(void))
        !            48: {
        !            49:        if ( setjmp(env) == 0 ) {
        !            50:                int                     status;
        !            51: 
        !            52:                signal(PAGE_PROTECTION_VIOLATED_SIGNAL
        !            53:                ,segmentationFaultHandler);
        !            54:                status = (*test)();
        !            55:                signal(PAGE_PROTECTION_VIOLATED_SIGNAL, SIG_DFL);
        !            56:                return status;
        !            57:        }
        !            58:        else
        !            59:                return 1;
        !            60: }
        !            61: 
        !            62: static char *  allocation;
        !            63: /* c is global so that assignments to it won't be optimized out. */
        !            64: char   c;
        !            65: 
        !            66: static int
        !            67: testSizes(void)
        !            68: {
        !            69:        /*
        !            70:         * If ef_number can't hold all of the bits of a void *, have the user
        !            71:         * add -DUSE_ LONG_LONG to the compiler flags so that ef_number will be
        !            72:         * declared as "unsigned long long" instead of "unsigned long".
        !            73:         */
        !            74:        return ( sizeof(ef_number) < sizeof(void *) );
        !            75: }
        !            76: 
        !            77: static int
        !            78: allocateMemory(void)
        !            79: {
        !            80:        allocation = (char *)malloc(1);
        !            81: 
        !            82:        if ( allocation != 0 )
        !            83:                return 0;
        !            84:        else
        !            85:                return 1;
        !            86: }
        !            87: 
        !            88: static int
        !            89: freeMemory(void)
        !            90: {
        !            91:        free(allocation);
        !            92:        return 0;
        !            93: }
        !            94: 
        !            95: static int
        !            96: protectBelow(void)
        !            97: {
        !            98:        EF_PROTECT_BELOW = 1;
        !            99:        return 0;
        !           100: }
        !           101: 
        !           102: static int
        !           103: read0(void)
        !           104: {
        !           105:        c = *allocation;
        !           106: 
        !           107:        return 0;
        !           108: }
        !           109: 
        !           110: static int
        !           111: write0(void)
        !           112: {
        !           113:        *allocation = 1;
        !           114: 
        !           115:        return 0;
        !           116: }
        !           117: 
        !           118: static int
        !           119: read1(void)
        !           120: {
        !           121:        c = allocation[1];
        !           122: 
        !           123:        return 0;
        !           124: }
        !           125: 
        !           126: static int
        !           127: readMinus1(void)
        !           128: {
        !           129:        c = allocation[-1];
        !           130:        return 0;
        !           131: }
        !           132: 
        !           133: static struct diagnostic diagnostics[] = {
        !           134:        {
        !           135:                testSizes, 0,
        !           136:                "Please add -DLONG_LONG to the compiler flags and recompile."
        !           137:        },
        !           138:        {
        !           139:                allocateMemory, 0,
        !           140:                "Allocation 1: This test allocates a single byte of memory."
        !           141:        },
        !           142:        {
        !           143:                read0, 0,
        !           144:                "Read valid memory 1: This test reads the allocated memory."
        !           145:        },
        !           146:        {
        !           147:                write0, 0,
        !           148:                "Write valid memory 1: This test writes the allocated memory."
        !           149:        },
        !           150:        {
        !           151:                read1, 1,
        !           152:                "Read overrun: This test reads beyond the end of the buffer."
        !           153:        },
        !           154:        {
        !           155:                freeMemory, 0,
        !           156:                "Free memory: This test frees the allocated memory."
        !           157:        },
        !           158:        {
        !           159:                protectBelow, 0,
        !           160:                "Protect below: This sets Electric Fence to protect\n"
        !           161:                "the lower boundary of a malloc buffer, rather than the\n"
        !           162:                "upper boundary."
        !           163:        },
        !           164:        {
        !           165:                allocateMemory, 0,
        !           166:                "Allocation 2: This allocates memory with the lower boundary"
        !           167:                " protected."
        !           168:        },
        !           169:        {
        !           170:                read0, 0,
        !           171:                "Read valid memory 2: This test reads the allocated memory."
        !           172:        },
        !           173:        {
        !           174:                write0, 0,
        !           175:                "Write valid memory 2: This test writes the allocated memory."
        !           176:        },
        !           177:        {
        !           178:                readMinus1, 1,
        !           179:                "Read underrun: This test reads before the beginning of the"
        !           180:                " buffer."
        !           181:        },
        !           182:        {
        !           183:                0, 0, 0
        !           184:        }
        !           185: };
        !           186: 
        !           187: static const char      failedTest[]
        !           188:  = "Electric Fence confidence test failed.\n";
        !           189: 
        !           190: static const char      newline = '\n';
        !           191: 
        !           192: int
        !           193: main(int argc, char * * argv)
        !           194: {
        !           195:        static const struct diagnostic *        diag = diagnostics;
        !           196:        
        !           197: 
        !           198:        EF_PROTECT_BELOW = 0;
        !           199:        EF_ALIGNMENT = 0;
        !           200: 
        !           201:        while ( diag->explanation != 0 ) {
        !           202:                int     status = gotSegmentationFault(diag->test);
        !           203: 
        !           204:                if ( status != diag->expectedStatus ) {
        !           205:                        /*
        !           206:                         * Don't use stdio to print here, because stdio
        !           207:                         * uses malloc() and we've just proven that malloc()
        !           208:                         * is broken. Also, use _exit() instead of exit(),
        !           209:                         * because _exit() doesn't flush stdio.
        !           210:                         */
        !           211:                        write(2, failedTest, sizeof(failedTest) - 1);
        !           212:                        write(2, diag->explanation, strlen(diag->explanation));
        !           213:                        write(2, &newline, 1);
        !           214:                        _exit(-1);
        !           215:                }
        !           216:                diag++;
        !           217:        }
        !           218:        return 0;
        !           219: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>