/* TEMPLATE GENERATED TESTCASE FILE Filename: CWE122_Heap_Based_Buffer_Overflow__CWE131_loop_03.c Label Definition File: CWE122_Heap_Based_Buffer_Overflow__CWE131.label.xml Template File: sources-sink-03.tmpl.c */ /* * @description * CWE: 122 Heap Based Buffer Overflow * BadSource: Allocate memory without using sizeof(int) * GoodSource: Allocate memory using sizeof(int) * Sink: loop * BadSink : Copy array to data using a loop * Flow Variant: 03 Control flow: if(5==5) and if(5!=5) * * */ #include "std_testcase.h" #ifndef OMITBAD void CWE122_Heap_Based_Buffer_Overflow__CWE131_loop_03_bad() { int * data; data = NULL; if(5==5) { /* FLAW: Allocate memory without using sizeof(int) */ data = (int *)malloc(10); if (data == NULL) {exit(-1);} } { int source[10] = {0}; size_t i; /* POTENTIAL FLAW: Possible buffer overflow if data was not allocated correctly in the source */ for (i = 0; i < 10; i++) { data[i] = source[i]; } printIntLine(data[0]); free(data); } } #endif /* OMITBAD */ #ifndef OMITGOOD /* goodG2B1() - use goodsource and badsink by changing the 5==5 to 5!=5 */ static void goodG2B1() { int * data; data = NULL; if(5!=5) { /* INCIDENTAL: CWE 561 Dead Code, the code below will never run */ printLine("Benign, fixed string"); } else { /* FIX: Allocate memory using sizeof(int) */ data = (int *)malloc(10*sizeof(int)); if (data == NULL) {exit(-1);} } { int source[10] = {0}; size_t i; /* POTENTIAL FLAW: Possible buffer overflow if data was not allocated correctly in the source */ for (i = 0; i < 10; i++) { data[i] = source[i]; } printIntLine(data[0]); free(data); } } /* goodG2B2() - use goodsource and badsink by reversing the blocks in the if statement */ static void goodG2B2() { int * data; data = NULL; if(5==5) { /* FIX: Allocate memory using sizeof(int) */ data = (int *)malloc(10*sizeof(int)); if (data == NULL) {exit(-1);} } { int source[10] = {0}; size_t i; /* POTENTIAL FLAW: Possible buffer overflow if data was not allocated correctly in the source */ for (i = 0; i < 10; i++) { data[i] = source[i]; } printIntLine(data[0]); free(data); } } void CWE122_Heap_Based_Buffer_Overflow__CWE131_loop_03_good() { goodG2B1(); goodG2B2(); } #endif /* OMITGOOD */ /* Below is the main(). It is only used when building this testcase on * its own for testing or for building a binary to use in testing binary * analysis tools. It is not used when compiling all the testcases as one * application, which is how source code analysis tools are tested. */ #ifdef INCLUDEMAIN int main(int argc, char * argv[]) { /* seed randomness */ srand( (unsigned)time(NULL) ); #ifndef OMITGOOD printLine("Calling good()..."); CWE122_Heap_Based_Buffer_Overflow__CWE131_loop_03_good(); printLine("Finished good()"); #endif /* OMITGOOD */ #ifndef OMITBAD printLine("Calling bad()..."); CWE122_Heap_Based_Buffer_Overflow__CWE131_loop_03_bad(); printLine("Finished bad()"); #endif /* OMITBAD */ return 0; } #endif