Revision: 48493
http://brlcad.svn.sourceforge.net/brlcad/?rev=48493&view=rev
Author: n_reed
Date: 2012-01-12 15:04:16 +0000 (Thu, 12 Jan 2012)
Log Message:
-----------
check getchar return for EOF, and ensure dest string is not overrun, CID 118
Modified Paths:
--------------
brlcad/trunk/src/vdeck/vdeck.c
Modified: brlcad/trunk/src/vdeck/vdeck.c
===================================================================
--- brlcad/trunk/src/vdeck/vdeck.c 2012-01-12 14:52:40 UTC (rev 48492)
+++ brlcad/trunk/src/vdeck/vdeck.c 2012-01-12 15:04:16 UTC (rev 48493)
@@ -1697,7 +1697,7 @@
for ( arg_ct = ct; arg_ct < MAXARG - 1; ++arg_ct )
{
args[arg_ct] = bu_malloc( MAXLN, "getcmd buffer" );
- if ( ! getarg( args[arg_ct] ) )
+ if ( ! getarg( args[arg_ct], MAXLN ) )
break;
}
++arg_ct;
@@ -1716,30 +1716,45 @@
/**
* g e t a r g
*
- * Get a word of input into 'str', Return 0 if newline is encountered.
+ * Get a word of input into 'str'. Copies no more than maxchars characters
+ * into str and ensures str is null-terminated if possible.
+ *
+ * Return 0 if end of input encountered, or if str is filled (word is
truncated).
* Return 1 otherwise.
*/
char
-getarg( char *str )
+getarg(char *str, size_t maxchars)
{
- int prev;
+ int c;
+ size_t i;
- do {
- *str = getchar();
- if ( (int)(*str) == ' ' ) {
- *str = '\0';
+ if (str == NULL || maxchars == 0) {
+ return 0;
+ }
+
+ for (i = 0; i < maxchars; ++i) {
+ c = getchar();
+ switch (c) {
+ case '\n':
+ case EOF:
+ /* end of input */
+ str[i] = '\0';
+ return 0;
+ case ' ':
+ /* end of word/argument */
+ str[i] = '\0';
return 1;
- }
- else
- ++str;
+ default:
+ str[i] = (char)c;
+ }
+ }
- prev = str[-1];
- } while (prev != EOF && (int)(str[-1]) != '\n' );
+ /* ran out of space in dest string before reaching end of word
+ * or end of input
+ */
+ str[i - 1] = '\0';
- if ( (int)(str[-1]) == '\n' )
- --str;
- *str = '\0';
- return 0;
+ return 0;
}
This was sent by the SourceForge.net collaborative development platform, the
world's largest Open Source development site.
------------------------------------------------------------------------------
RSA(R) Conference 2012
Mar 27 - Feb 2
Save $400 by Jan. 27
Register now!
http://p.sf.net/sfu/rsa-sfdev2dev2
_______________________________________________
BRL-CAD Source Commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/brlcad-commits