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

Reply via email to