Revision: 54439
          http://brlcad.svn.sourceforge.net/brlcad/?rev=54439&view=rev
Author:   brlcad
Date:     2013-02-20 05:15:28 +0000 (Wed, 20 Feb 2013)
Log Message:
-----------
gcc 4.7.2 rightly detected the possibility of a negative array index path if 
endpos ends up still at zero when we begin processing.  looks like that could 
happen if we find a slash, but fail to tokenize on it for whatever reason.  
adding a sanity check does the trick.

Modified Paths:
--------------
    brlcad/trunk/src/libged/copyeval.c

Modified: brlcad/trunk/src/libged/copyeval.c
===================================================================
--- brlcad/trunk/src/libged/copyeval.c  2013-02-20 05:07:30 UTC (rev 54438)
+++ brlcad/trunk/src/libged/copyeval.c  2013-02-20 05:15:28 UTC (rev 54439)
@@ -36,15 +36,16 @@
 int
 ged_copyeval(struct ged *gedp, int argc, const char *argv[])
 {
+    static const char *usage = "path_to_old_prim new_prim";
+    struct _ged_trace_data gtd;
     struct directory *dp;
+    struct rt_db_internal *ip;
     struct rt_db_internal internal, new_int;
-    struct rt_db_internal *ip;
+
+    char *tok;
+    int endpos = 0;
+    int i;
     mat_t start_mat;
-    int i;
-    int endpos;
-    char *tok;
-    struct _ged_trace_data gtd;
-    static const char *usage = "path_to_old_prim new_prim";
 
     GED_CHECK_DATABASE_OPEN(gedp, GED_ERROR);
     GED_CHECK_READ_ONLY(gedp, GED_ERROR);
@@ -76,8 +77,6 @@
 
     /* build directory pointer array for desired path */
     if (strchr(argv[1], '/')) {
-       endpos = 0;
-
        tok = strtok((char *)argv[1], "/");
        while (tok) {
            GED_DB_LOOKUP(gedp, gtd.gtd_obj[endpos], tok, LOOKUP_NOISY, 
GED_ERROR & GED_QUIET);
@@ -85,11 +84,15 @@
            tok = strtok((char *)NULL, "/");
        }
     } else {
-       endpos = 0;
        GED_DB_LOOKUP(gedp, gtd.gtd_obj[endpos], argv[1], LOOKUP_NOISY, 
GED_ERROR & GED_QUIET);
        endpos++;
     }
 
+    if (endpos < 1) {
+       bu_vls_printf(gedp->ged_result_str, "Usage: %s %s", argv[0], usage);
+       return GED_ERROR;
+    }
+
     gtd.gtd_objpos = endpos - 1;
 
     GED_DB_GET_INTERNAL(gedp, &internal, gtd.gtd_obj[endpos - 1], 
bn_mat_identity, &rt_uniresource, GED_ERROR);

This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.


------------------------------------------------------------------------------
Everyone hates slow websites. So do we.
Make your web apps faster with AppDynamics
Download AppDynamics Lite for free today:
http://p.sf.net/sfu/appdyn_d2d_feb
_______________________________________________
BRL-CAD Source Commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/brlcad-commits

Reply via email to