Flawfinder version 2.0.10, (C) 2001-2019 David A. Wheeler. Number of rules (primarily dangerous function names) in C/C++ ruleset: 223 Examining data/deal-3.1.9/ansidecl.h Examining data/deal-3.1.9/dealtypes.c Examining data/deal-3.1.9/tcl_dds.c Examining data/deal-3.1.9/dist.c Examining data/deal-3.1.9/ddsInline.h Examining data/deal-3.1.9/getopt.h Examining data/deal-3.1.9/vector.h Examining data/deal-3.1.9/holdings.h Examining data/deal-3.1.9/deal.c Examining data/deal-3.1.9/maindeal.c Examining data/deal-3.1.9/formats.h Examining data/deal-3.1.9/ddsLookup.h Examining data/deal-3.1.9/Holding.h Examining data/deal-3.1.9/random.c Examining data/deal-3.1.9/hand.c Examining data/deal-3.1.9/additive.c Examining data/deal-3.1.9/additive.h Examining data/deal-3.1.9/stat.h Examining data/deal-3.1.9/stringbox.c Examining data/deal-3.1.9/ddsLookup.cpp Examining data/deal-3.1.9/ddsInterface.h Examining data/deal-3.1.9/dds.h Examining data/deal-3.1.9/tcl_dist.h Examining data/deal-3.1.9/makecounttable.c Examining data/deal-3.1.9/deal.h Examining data/deal-3.1.9/vector.c Examining data/deal-3.1.9/stat.c Examining data/deal-3.1.9/holdings.c Examining data/deal-3.1.9/keywords.c Examining data/deal-3.1.9/stringbox.h Examining data/deal-3.1.9/keywords.h Examining data/deal-3.1.9/formats.c Examining data/deal-3.1.9/dealtypes.h Examining data/deal-3.1.9/dds.cpp Examining data/deal-3.1.9/tcl_incl.h Examining data/deal-3.1.9/dist.h Examining data/deal-3.1.9/deck.h Examining data/deal-3.1.9/tcl_deal.c FINAL RESULTS: data/deal-3.1.9/deal.c:333:3: [4] (buffer) sprintf: Does not check for buffer overflows (CWE-120). Use sprintf_s, snprintf, or vsnprintf. sprintf(result,"%s|%s|%s|%s\n",1+s[0],1+s[1],1+s[2],1+s[3]); data/deal-3.1.9/deal.c:367:5: [4] (buffer) sprintf: Does not check for buffer overflows (CWE-120). Use sprintf_s, snprintf, or vsnprintf. sprintf(rp," %c : %s\n",suit_chars[suit],a[NORTH][suit]); data/deal-3.1.9/deal.c:372:5: [4] (buffer) sprintf: Does not check for buffer overflows (CWE-120). Use sprintf_s, snprintf, or vsnprintf. sprintf(rp," %c : %-13s %c : %-13s\n",suit_chars[suit],a[WEST][suit], data/deal-3.1.9/deal.c:378:5: [4] (buffer) sprintf: Does not check for buffer overflows (CWE-120). Use sprintf_s, snprintf, or vsnprintf. sprintf(rp," %c : %s\n",suit_chars[suit],a[SOUTH][suit]); data/deal-3.1.9/deal.c:551:3: [4] (buffer) sscanf: The scanf() family's %s operation, without a limit specification, permits buffer overflows (CWE-120, CWE-20). Specify a limit to %s, or use a different input function. sscanf(hstring,"%s %s %s %s",s[SPADES],s[HEARTS],s[DIAMONDS],s[CLUBS]); data/deal-3.1.9/dealtypes.c:234:3: [4] (buffer) strcpy: Does not check for buffer overflows when copying to destination [MS-banned] (CWE-120). Consider using snprintf, strcpy_s, or strlcpy (warning: strncpy easily misused). strcpy(result,source); data/deal-3.1.9/dist.c:222:7: [4] (buffer) sprintf: Does not check for buffer overflows (CWE-120). Use sprintf_s, snprintf, or vsnprintf. sprintf(result,"shapeclass.binary %s {\n",command); data/deal-3.1.9/dist.c:229:2: [4] (buffer) sprintf: Does not check for buffer overflows (CWE-120). Use sprintf_s, snprintf, or vsnprintf. sprintf(rptr,"%s",Tcl_GetStringFromObj(DFVal(set,i-1),&len)); data/deal-3.1.9/dist.c:388:7: [4] (buffer) sprintf: Does not check for buffer overflows (CWE-120). Use sprintf_s, snprintf, or vsnprintf. sprintf(result,"shapeclass.binary %s {\n",name); data/deal-3.1.9/holdings.c:394:3: [4] (buffer) sprintf: Does not check for buffer overflows (CWE-120). Use sprintf_s, snprintf, or vsnprintf. sprintf(slowName,"%s::%s",tclNamespace,name); data/deal-3.1.9/keywords.c:80:3: [4] (buffer) strcpy: Does not check for buffer overflows when copying to destination [MS-banned] (CWE-120). Consider using snprintf, strcpy_s, or strlcpy (warning: strncpy easily misused). strcpy(dupKey,keyword); data/deal-3.1.9/keywords.c:169:5: [4] (buffer) strcpy: Does not check for buffer overflows when copying to destination [MS-banned] (CWE-120). Consider using snprintf, strcpy_s, or strlcpy (warning: strncpy easily misused). strcpy(obj->bytes,key); data/deal-3.1.9/tcl_deal.c:569:7: [4] (buffer) sprintf: Does not check for buffer overflows (CWE-120). Use sprintf_s, snprintf, or vsnprintf. sprintf(tcl_command_string,"source %s",optarg); data/deal-3.1.9/tcl_deal.c:576:7: [4] (buffer) sprintf: Does not check for buffer overflows (CWE-120). Use sprintf_s, snprintf, or vsnprintf. sprintf(tcl_command_string,"source %s",optarg); data/deal-3.1.9/tcl_deal.c:603:5: [4] (buffer) sprintf: Does not check for buffer overflows (CWE-120). Use sprintf_s, snprintf, or vsnprintf. sprintf(tcl_command_string,"deal_loop %s",writecmd); data/deal-3.1.9/tcl_deal.c:606:5: [4] (buffer) sprintf: Does not check for buffer overflows (CWE-120). Use sprintf_s, snprintf, or vsnprintf. sprintf(tcl_command_string,"deal_deck ; %s",writecmd); data/deal-3.1.9/deal.c:191:24: [3] (random) drand48: This function is not sufficiently random for security-related functions such as key and nonce creation (CWE-327). Use a more secure technique for acquiring random values. return dealt+(int) (drand48() *(double)(52-dealt)); data/deal-3.1.9/deal.c:193:43: [3] (random) random: This function is not sufficiently random for security-related functions such as key and nonce creation (CWE-327). Use a more secure technique for acquiring random values. return dealt+(int) (fast_mod((unsigned) random() , (52-dealt))); data/deal-3.1.9/deal.h:134:9: [3] (random) srandom: This function is not sufficiently random for security-related functions such as key and nonce creation (CWE-327). Use a more secure technique for acquiring random values. #define srandom __srandom data/deal-3.1.9/deal.h:135:9: [3] (random) random: This function is not sufficiently random for security-related functions such as key and nonce creation (CWE-327). Use a more secure technique for acquiring random values. #define random __random data/deal-3.1.9/deck.h:68:9: [3] (random) random: This function is not sufficiently random for security-related functions such as key and nonce creation (CWE-327). Use a more secure technique for acquiring random values. #define random rand data/deal-3.1.9/deck.h:69:9: [3] (random) srandom: This function is not sufficiently random for security-related functions such as key and nonce creation (CWE-327). Use a more secure technique for acquiring random values. #define srandom srand data/deal-3.1.9/deck.h:69:17: [3] (random) srand: This function is not sufficiently random for security-related functions such as key and nonce creation (CWE-327). Use a more secure technique for acquiring random values. #define srandom srand data/deal-3.1.9/deck.h:73:8: [3] (random) drand48: This function is not sufficiently random for security-related functions such as key and nonce creation (CWE-327). Use a more secure technique for acquiring random values. double drand48(); data/deal-3.1.9/getopt.h:145:12: [3] (buffer) getopt: Some older implementations do not protect against internal buffer overflows (CWE-120, CWE-20). Check implementation on installation, or limit the size of all string inputs. extern int getopt (int __argc, char *const *__argv, const char *__shortopts); data/deal-3.1.9/getopt.h:147:12: [3] (buffer) getopt: Some older implementations do not protect against internal buffer overflows (CWE-120, CWE-20). Check implementation on installation, or limit the size of all string inputs. extern int getopt (); data/deal-3.1.9/getopt.h:151:12: [3] (buffer) getopt_long: Some older implementations do not protect against internal buffer overflows (CWE-120, CWE-20). Check implementation on installation, or limit the size of all string inputs. extern int getopt_long (int __argc, char *const *__argv, const char *__shortopts, data/deal-3.1.9/getopt.h:164:12: [3] (buffer) getopt: Some older implementations do not protect against internal buffer overflows (CWE-120, CWE-20). Check implementation on installation, or limit the size of all string inputs. extern int getopt (); data/deal-3.1.9/getopt.h:166:12: [3] (buffer) getopt_long: Some older implementations do not protect against internal buffer overflows (CWE-120, CWE-20). Check implementation on installation, or limit the size of all string inputs. extern int getopt_long (); data/deal-3.1.9/tcl_deal.c:243:7: [3] (random) random: This function is not sufficiently random for security-related functions such as key and nonce creation (CWE-327). Use a more secure technique for acquiring random values. res=random(); data/deal-3.1.9/tcl_deal.c:281:5: [3] (random) srandom: This function is not sufficiently random for security-related functions such as key and nonce creation (CWE-327). Use a more secure technique for acquiring random values. srandom(value); data/deal-3.1.9/tcl_deal.c:509:3: [3] (random) srandom: This function is not sufficiently random for security-related functions such as key and nonce creation (CWE-327). Use a more secure technique for acquiring random values. srandom(for_seeding ^ getpid()); data/deal-3.1.9/tcl_deal.c:516:19: [3] (buffer) getopt: Some older implementations do not protect against internal buffer overflows (CWE-120, CWE-20). Check implementation on installation, or limit the size of all string inputs. while (-1!=(opt=getopt(argc,argv,"lve:S:N:E:W:i:ts:fo:VI:x:"))) { data/deal-3.1.9/tcl_deal.c:564:7: [3] (random) srandom: This function is not sufficiently random for security-related functions such as key and nonce creation (CWE-327). Use a more secure technique for acquiring random values. srandom(for_seeding); data/deal-3.1.9/dds.cpp:73:10: [2] (buffer) char: Statically-sized arrays can be improperly restricted, leading to potential overflows or other issues (CWE-119!/CWE-120). Perform bounds checking, use functions that limit length, or ensure that the size is larger than the maximum possible length. unsigned char cardRank[15], cardSuit[5], cardSeat[4]; data/deal-3.1.9/dds.cpp:916:9: [2] (misc) fopen: Check when opening files - can an attacker redirect it (via symlinks), force the opening of special file type (e.g., device files), move things around to create a race condition, control its ancestors, or change its contents? (CWE-362). fp2=fopen("stat.txt","w"); data/deal-3.1.9/dds.cpp:921:9: [2] (misc) fopen: Check when opening files - can an attacker redirect it (via symlinks), force the opening of special file type (e.g., device files), move things around to create a race condition, control its ancestors, or change its contents? (CWE-362). fp7=fopen("storett.txt","w"); data/deal-3.1.9/dds.cpp:922:10: [2] (misc) fopen: Check when opening files - can an attacker redirect it (via symlinks), force the opening of special file type (e.g., device files), move things around to create a race condition, control its ancestors, or change its contents? (CWE-362). fp11=fopen("rectt.txt", "w"); data/deal-3.1.9/dds.cpp:4320:6: [2] (misc) fopen: Check when opening files - can an attacker redirect it (via symlinks), force the opening of special file type (e.g., device files), move things around to create a race condition, control its ancestors, or change its contents? (CWE-362). fp=fopen("dump.txt", "w"); data/deal-3.1.9/dds.cpp:4493:8: [2] (misc) fopen: Check when opening files - can an attacker redirect it (via symlinks), force the opening of special file type (e.g., device files), move things around to create a race condition, control its ancestors, or change its contents? (CWE-362). fp11=fopen("rectt.txt", "a"); data/deal-3.1.9/dds.h:189:3: [2] (buffer) char: Statically-sized arrays can be improperly restricted, leading to potential overflows or other issues (CWE-119!/CWE-120). Perform bounds checking, use functions that limit length, or ensure that the size is larger than the maximum possible length. char leastWin[4]; data/deal-3.1.9/dds.h:209:12: [2] (buffer) char: Statically-sized arrays can be improperly restricted, leading to potential overflows or other issues (CWE-119!/CWE-120). Perform bounds checking, use functions that limit length, or ensure that the size is larger than the maximum possible length. unsigned char length[4][4]; data/deal-3.1.9/dds.h:473:17: [2] (buffer) char: Statically-sized arrays can be improperly restricted, leading to potential overflows or other issues (CWE-119!/CWE-120). Perform bounds checking, use functions that limit length, or ensure that the size is larger than the maximum possible length. extern unsigned char suitChar[4]; data/deal-3.1.9/dds.h:474:17: [2] (buffer) char: Statically-sized arrays can be improperly restricted, leading to potential overflows or other issues (CWE-119!/CWE-120). Perform bounds checking, use functions that limit length, or ensure that the size is larger than the maximum possible length. extern unsigned char rankChar[15]; data/deal-3.1.9/dds.h:475:17: [2] (buffer) char: Statically-sized arrays can be improperly restricted, leading to potential overflows or other issues (CWE-119!/CWE-120). Perform bounds checking, use functions that limit length, or ensure that the size is larger than the maximum possible length. extern unsigned char seatChar[4]; data/deal-3.1.9/dds.h:479:17: [2] (buffer) char: Statically-sized arrays can be improperly restricted, leading to potential overflows or other issues (CWE-119!/CWE-120). Perform bounds checking, use functions that limit length, or ensure that the size is larger than the maximum possible length. extern unsigned char cardRank[15], cardSuit[5], cardSeat[4]; data/deal-3.1.9/deal.c:122:3: [2] (buffer) memcpy: Does not check for buffer overflows when copying to destination (CWE-120). Make sure destination can always hold the source data. memcpy(dealp,&initializeOnce,sizeof(struct deck)); data/deal-3.1.9/deal.c:312:3: [2] (buffer) char: Statically-sized arrays can be improperly restricted, leading to potential overflows or other issues (CWE-119!/CWE-120). Perform bounds checking, use functions that limit length, or ensure that the size is larger than the maximum possible length. char s[4][26]; data/deal-3.1.9/deal.c:314:3: [2] (buffer) char: Statically-sized arrays can be improperly restricted, leading to potential overflows or other issues (CWE-119!/CWE-120). Perform bounds checking, use functions that limit length, or ensure that the size is larger than the maximum possible length. char *s1[4]; data/deal-3.1.9/deal.c:341:3: [2] (buffer) char: Statically-sized arrays can be improperly restricted, leading to potential overflows or other issues (CWE-119!/CWE-120). Perform bounds checking, use functions that limit length, or ensure that the size is larger than the maximum possible length. char a[4][4][14]; data/deal-3.1.9/deal.c:342:3: [2] (buffer) char: Statically-sized arrays can be improperly restricted, leading to potential overflows or other issues (CWE-119!/CWE-120). Perform bounds checking, use functions that limit length, or ensure that the size is larger than the maximum possible length. char *p[4][4]; data/deal-3.1.9/deal.c:359:2: [2] (buffer) strcpy: Does not check for buffer overflows when copying to destination [MS-banned] (CWE-120). Consider using snprintf, strcpy_s, or strlcpy (warning: strncpy easily misused). Risk is low because the source is a constant string. strcpy(p[hand][suit],"---"); data/deal-3.1.9/deal.c:382:3: [2] (buffer) sprintf: Does not check for buffer overflows (CWE-120). Use sprintf_s, snprintf, or vsnprintf. Risk is low because the source has a constant maximum length. sprintf(rp,"---------------------------\n"); data/deal-3.1.9/deal.c:550:3: [2] (buffer) char: Statically-sized arrays can be improperly restricted, leading to potential overflows or other issues (CWE-119!/CWE-120). Perform bounds checking, use functions that limit length, or ensure that the size is larger than the maximum possible length. char s[4][13],*sptr; data/deal-3.1.9/dealtypes.c:208:8: [2] (buffer) char: Statically-sized arrays can be improperly restricted, leading to potential overflows or other issues (CWE-119!/CWE-120). Perform bounds checking, use functions that limit length, or ensure that the size is larger than the maximum possible length. static char *holdingStrings[8192]; data/deal-3.1.9/dist.c:237:7: [2] (buffer) strcpy: Does not check for buffer overflows when copying to destination [MS-banned] (CWE-120). Consider using snprintf, strcpy_s, or strlcpy (warning: strncpy easily misused). Risk is low because the source is a constant string. strcpy(rptr,"\n}\n"); data/deal-3.1.9/dist.c:415:7: [2] (buffer) strcpy: Does not check for buffer overflows when copying to destination [MS-banned] (CWE-120). Consider using snprintf, strcpy_s, or strlcpy (warning: strncpy easily misused). Risk is low because the source is a constant string. strcpy(rptr,"\n}\n"); data/deal-3.1.9/dist.h:21:18: [2] (buffer) char: Statically-sized arrays can be improperly restricted, leading to potential overflows or other issues (CWE-119!/CWE-120). Perform bounds checking, use functions that limit length, or ensure that the size is larger than the maximum possible length. typedef unsigned char HandDist[4]; data/deal-3.1.9/holdings.c:124:12: [2] (integer) atoi: Unless checked, the resulting number can exceed the expected range (CWE-190). If source untrusted, check both minimum and maximum, even if the input had no minus sign (large numbers can roll over into negative number; consider saving to an unsigned value if that is intended). extern int atoi(const char*); data/deal-3.1.9/holdings.c:575:10: [2] (integer) atoi: Unless checked, the resulting number can exceed the expected range (CWE-190). If source untrusted, check both minimum and maximum, even if the input had no minus sign (large numbers can roll over into negative number; consider saving to an unsigned value if that is intended). rank=atoi(string+1); data/deal-3.1.9/stringbox.c:62:7: [2] (buffer) char: Statically-sized arrays can be improperly restricted, leading to potential overflows or other issues (CWE-119!/CWE-120). Perform bounds checking, use functions that limit length, or ensure that the size is larger than the maximum possible length. char s[20]; data/deal-3.1.9/stringbox.c:63:7: [2] (buffer) sprintf: Does not check for buffer overflows (CWE-120). Use sprintf_s, snprintf, or vsnprintf. Risk is low because the source has a constant maximum length. sprintf(s,"%d %d",row,column); data/deal-3.1.9/tcl_deal.c:211:15: [2] (integer) atoi: Unless checked, the resulting number can exceed the expected range (CWE-190). If source untrusted, check both minimum and maximum, even if the input had no minus sign (large numbers can roll over into negative number; consider saving to an unsigned value if that is intended). rotate_deal(atoi(argv[1])); data/deal-3.1.9/tcl_deal.c:493:3: [2] (buffer) char: Statically-sized arrays can be improperly restricted, leading to potential overflows or other issues (CWE-119!/CWE-120). Perform bounds checking, use functions that limit length, or ensure that the size is larger than the maximum possible length. char tcl_command_string[512]; data/deal-3.1.9/tcl_deal.c:560:19: [2] (integer) atoi: Unless checked, the resulting number can exceed the expected range (CWE-190). If source untrusted, check both minimum and maximum, even if the input had no minus sign (large numbers can roll over into negative number; consider saving to an unsigned value if that is intended). for_seeding=atoi(optarg); data/deal-3.1.9/tcl_deal.c:597:11: [2] (integer) atoi: Unless checked, the resulting number can exceed the expected range (CWE-190). If source untrusted, check both minimum and maximum, even if the input had no minus sign (large numbers can roll over into negative number; consider saving to an unsigned value if that is intended). count=atoi(argv[1]); data/deal-3.1.9/vector.c:96:21: [2] (integer) atoi: Unless checked, the resulting number can exceed the expected range (CWE-190). If source untrusted, check both minimum and maximum, even if the input had no minus sign (large numbers can roll over into negative number; consider saving to an unsigned value if that is intended). vec->value[i-1]=atoi(argv[i]); data/deal-3.1.9/deal.c:280:13: [1] (buffer) getchar: Check buffer boundaries if used in a loop including recursive loops (CWE-120, CWE-20). while ((c=getchar()) != EOF) { data/deal-3.1.9/deal.c:368:11: [1] (buffer) strlen: Does not handle strings that are not \0-terminated; if given one it may perform an over-read (it could cause a crash if unprotected) (CWE-126). rp=rp+strlen(rp); data/deal-3.1.9/deal.c:374:11: [1] (buffer) strlen: Does not handle strings that are not \0-terminated; if given one it may perform an over-read (it could cause a crash if unprotected) (CWE-126). rp=rp+strlen(rp); data/deal-3.1.9/deal.c:379:11: [1] (buffer) strlen: Does not handle strings that are not \0-terminated; if given one it may perform an over-read (it could cause a crash if unprotected) (CWE-126). rp=rp+strlen(rp); data/deal-3.1.9/dealtypes.c:231:11: [1] (buffer) strlen: Does not handle strings that are not \0-terminated; if given one it may perform an over-read (it could cause a crash if unprotected) (CWE-126). hlength=strlen(source); data/deal-3.1.9/dist.c:221:45: [1] (buffer) strlen: Does not handle strings that are not \0-terminated; if given one it may perform an over-read (it could cause a crash if unprotected) (CWE-126). result=(char *)Tcl_Alloc(8*DIST_COUNT+strlen(command)+50); data/deal-3.1.9/dist.c:223:19: [1] (buffer) strlen: Does not handle strings that are not \0-terminated; if given one it may perform an over-read (it could cause a crash if unprotected) (CWE-126). rptr=result+strlen(result); data/deal-3.1.9/dist.c:387:45: [1] (buffer) strlen: Does not handle strings that are not \0-terminated; if given one it may perform an over-read (it could cause a crash if unprotected) (CWE-126). result=(char *)Tcl_Alloc(1+DIST_COUNT+strlen(name)+1024); data/deal-3.1.9/dist.c:389:19: [1] (buffer) strlen: Does not handle strings that are not \0-terminated; if given one it may perform an over-read (it could cause a crash if unprotected) (CWE-126). rptr=result+strlen(result); data/deal-3.1.9/holdings.c:391:39: [1] (buffer) strlen: Does not handle strings that are not \0-terminated; if given one it may perform an over-read (it could cause a crash if unprotected) (CWE-126). slowName=(char *)Tcl_Alloc(4+length+strlen(tclNamespace)); data/deal-3.1.9/holdings.c:397:37: [1] (buffer) strlen: Does not handle strings that are not \0-terminated; if given one it may perform an over-read (it could cause a crash if unprotected) (CWE-126). objv[1]=Tcl_NewStringObj(slowName,strlen(slowName)); data/deal-3.1.9/keywords.c:79:20: [1] (buffer) strlen: Does not handle strings that are not \0-terminated; if given one it may perform an over-read (it could cause a crash if unprotected) (CWE-126). dupKey=Tcl_Alloc(strlen(keyword)+1); data/deal-3.1.9/keywords.c:167:17: [1] (buffer) strlen: Does not handle strings that are not \0-terminated; if given one it may perform an over-read (it could cause a crash if unprotected) (CWE-126). obj->length=strlen(key); data/deal-3.1.9/tcl_deal.c:479:67: [1] (buffer) strlen: Does not handle strings that are not \0-terminated; if given one it may perform an over-read (it could cause a crash if unprotected) (CWE-126). Tcl_ListObjAppendElement(interp,list,Tcl_NewStringObj(argv[i],strlen(argv[i]))); data/deal-3.1.9/tcl_deal.c:609:52: [1] (buffer) strlen: Does not handle strings that are not \0-terminated; if given one it may perform an over-read (it could cause a crash if unprotected) (CWE-126). command=Tcl_NewStringObj(tcl_command_string,(int)strlen(tcl_command_string)); ANALYSIS SUMMARY: Hits = 82 Lines analyzed = 12779 in approximately 0.64 seconds (20062 lines/second) Physical Source Lines of Code (SLOC) = 9411 Hits@level = [0] 128 [1] 15 [2] 33 [3] 18 [4] 16 [5] 0 Hits@level+ = [0+] 210 [1+] 82 [2+] 67 [3+] 34 [4+] 16 [5+] 0 Hits/KSLOC@level+ = [0+] 22.3143 [1+] 8.71321 [2+] 7.11933 [3+] 3.61279 [4+] 1.70014 [5+] 0 Dot directories skipped = 1 (--followdotdir overrides) Minimum risk level = 1 Not every hit is necessarily a security vulnerability. There may be other security vulnerabilities; review your code! See 'Secure Programming HOWTO' (https://dwheeler.com/secure-programs) for more information.