[geany/geany] 10893c: R: fix invalid memory access in the tag parser

Colomban Wendling git-noreply at xxxxx
Wed Nov 20 17:40:22 UTC 2013


Branch:      refs/heads/master
Author:      Colomban Wendling <ban at herbesfolles.org>
Committer:   Colomban Wendling <ban at herbesfolles.org>
Date:        Wed, 20 Nov 2013 17:40:22 UTC
Commit:      10893c4ada3be907a97dd4e472de029442e687bc
             https://github.com/geany/geany/commit/10893c4ada3be907a97dd4e472de029442e687bc

Log Message:
-----------
R: fix invalid memory access in the tag parser


Modified Paths:
--------------
    tagmanager/ctags/r.c

Modified: tagmanager/ctags/r.c
24 files changed, 17 insertions(+), 7 deletions(-)
===================================================================
@@ -27,9 +27,17 @@
   ch++
 
 #ifndef R_REGEX
-static kindOption RKinds [] = {
+typedef enum {
+  K_FUNCTION,
+  K_LIBRARY,
+  K_SOURCE,
+  KIND_COUNT
+} rKind;
+
+static kindOption RKinds [KIND_COUNT] = {
   { TRUE, 'f', "function",  "functions" },
-  { TRUE, 's', "other",  "libraries" }
+  { TRUE, 's', "other",  "libraries" },
+  { TRUE, 's', "other",  "sources" },
 };
 #endif
 
@@ -48,18 +56,20 @@ static void installRRegex (const langType language)
     "^[ \t]*(library|source|load|data)[\\(]([a-zA-Z0-9_]+)[\\)]", "\\2", "s,other", NULL);
 }
 #else
-static void makeRTag(const vString* const name, int kind)
+static void makeRTag(const vString* const name, rKind kind)
 {
   tagEntryInfo e;
   initTagEntry(&e, vStringValue(name));
 
+  Assert(kind >= 0 && kind < KIND_COUNT);
+
   e.kindName = RKinds[kind].name;
   e.kind     = RKinds[kind].letter;
 
   makeTagEntry(&e);
 }
 
-extern void createRTags(void)
+static void createRTags(void)
 {
   vString *vLine = vStringNew();
   vString *name = vStringNew();
@@ -82,7 +92,7 @@ extern void createRTags(void)
             cp += 7;
             SKIPSPACE(cp);
             if (*cp == '(')
-              ikind = 1;
+              ikind = K_LIBRARY;
             else
               cp -= 7;
           } else if (strncasecmp((const char*)cp, "source", (size_t)6) == 0) {
@@ -90,7 +100,7 @@ extern void createRTags(void)
             cp += 6;
             SKIPSPACE(cp);
             if (*cp == '(')
-              ikind = 2;
+              ikind = K_SOURCE;
             else
               cp -= 6;
           }
@@ -145,7 +155,7 @@ extern void createRTags(void)
               vStringTerminate(name);
               /* if the string really exists, make a tag of it */
               if (vStringLength(name) > 0)
-                makeRTag(name, 0);
+                makeRTag(name, K_FUNCTION);
 
               /* prepare for the next iteration */
               vStringClear(name);



--------------
This E-Mail was brought to you by github_commit_mail.py (Source: https://github.com/geany/infrastructure).


More information about the Commits mailing list