/* Demonstration of buffer overflow */ #include #include /* $begin bufdemo-c */ /* Implementation of library function gets() */ char *gets(char *dest) { int c = getchar(); char *p = dest; while (c != EOF && c != '\n') { *p++ = c; c = getchar(); } *p = '\0'; return dest; } /* Read input line and write it back */ void echo() { char buf[4]; /* Way too small! */ gets(buf); puts(buf); } /* $end bufdemo-c */ /* $begin bufdemo-ans-c */ /* Read input line and write it back */ /* Code will work for any buffer size. Bigger is more time-efficient */ #define BUFSIZE 64 void good_echo() { char buf[BUFSIZE]; int i; while (1) { if (!fgets(buf, BUFSIZE, stdin)) return; /* End of file or error */ /* Print characters in buffer */ for (i = 0; buf[i] && buf[i] != '\n'; i++) if (putchar(buf[i]) == EOF) return; /* Error */ if (buf[i] == '\n') { /* Reached terminating newline */ putchar('\n'); return; } } } /* $end bufdemo-ans-c */ void call_echo() { echo(); } int main(int argc, char *argv[]) { int use_good = (argc > 1); printf("Type a string:"); if (use_good) { good_echo(); } else call_echo(); return 0; }