[Pcre-svn] [753] code/trunk: Tidies and minor bug fix result…

Inizio della pagina
Delete this message
Autore: Subversion repository
Data:  
To: pcre-svn
Oggetto: [Pcre-svn] [753] code/trunk: Tidies and minor bug fix resulting from Coverity Scan issues.
Revision: 753
          http://www.exim.org/viewvc/pcre2?view=rev&revision=753
Author:   ph10
Date:     2017-04-16 17:49:11 +0100 (Sun, 16 Apr 2017)
Log Message:
-----------
Tidies and minor bug fix resulting from Coverity Scan issues.


Modified Paths:
--------------
    code/trunk/ChangeLog
    code/trunk/src/pcre2_auto_possess.c
    code/trunk/src/pcre2_compile.c
    code/trunk/src/pcre2_dfa_match.c
    code/trunk/src/pcre2_printint.c
    code/trunk/src/pcre2test.c


Modified: code/trunk/ChangeLog
===================================================================
--- code/trunk/ChangeLog    2017-04-16 13:04:57 UTC (rev 752)
+++ code/trunk/ChangeLog    2017-04-16 16:49:11 UTC (rev 753)
@@ -140,7 +140,16 @@
 27. Update pcre2test, remove some unused code in pcre2_match(), and upgrade the 
 tests to improve coverage.


+28. Some fixes/tidies as a result of looking at Coverity Scan output:

+    (a) Typo: ">" should be ">=" in opcode check in pcre2_auto_possess.c.
+    (b) Added some casts to avoid "suspicious implicit sign extension". 
+    (c) Resource leaks in pcre2test in rare error cases. 
+    (d) Avoid warning for never-use case OP_TABLE_LENGTH which is just a fudge
+        for checking at compile time that tables are the right size.  
+    (e) Add missing "fall through" comment.     
+
+
 Version 10.23 14-February-2017
 ------------------------------



Modified: code/trunk/src/pcre2_auto_possess.c
===================================================================
--- code/trunk/src/pcre2_auto_possess.c    2017-04-16 13:04:57 UTC (rev 752)
+++ code/trunk/src/pcre2_auto_possess.c    2017-04-16 16:49:11 UTC (rev 753)
@@ -1075,7 +1075,7 @@
   {
   c = *code;


- if (c > OP_TABLE_LENGTH) return -1; /* Something gone wrong */
+ if (c >= OP_TABLE_LENGTH) return -1; /* Something gone wrong */

   if (c >= OP_STAR && c <= OP_TYPEPOSUPTO)
     {


Modified: code/trunk/src/pcre2_compile.c
===================================================================
--- code/trunk/src/pcre2_compile.c    2017-04-16 13:04:57 UTC (rev 752)
+++ code/trunk/src/pcre2_compile.c    2017-04-16 16:49:11 UTC (rev 753)
@@ -8440,6 +8440,7 @@
     case META_BACKREF_BYNAME:
     if ((cb->external_options & PCRE2_MATCH_UNSET_BACKREF) != 0)
       goto ISNOTFIXED;
+    /* Fall through */   


     case META_RECURSE_BYNAME:
       {
@@ -9274,7 +9275,8 @@
 cb.name_entry_size. */


re_blocksize = sizeof(pcre2_real_code) +
- CU2BYTES(length + cb.names_found * cb.name_entry_size);
+ CU2BYTES(length +
+ (PCRE2_SIZE)cb.names_found * (PCRE2_SIZE)cb.name_entry_size);
re = (pcre2_real_code *)
ccontext->memctl.malloc(re_blocksize, ccontext->memctl.memory_data);
if (re == NULL)

Modified: code/trunk/src/pcre2_dfa_match.c
===================================================================
--- code/trunk/src/pcre2_dfa_match.c    2017-04-16 13:04:57 UTC (rev 752)
+++ code/trunk/src/pcre2_dfa_match.c    2017-04-16 16:49:11 UTC (rev 753)
@@ -697,7 +697,7 @@
       case OP_TABLE_LENGTH +
         ((sizeof(coptable) == OP_TABLE_LENGTH) &&
          (sizeof(poptable) == OP_TABLE_LENGTH)):
-      break;
+      return 0;


 /* ========================================================================== */
       /* Reached a closing bracket. If not at the end of the pattern, carry


Modified: code/trunk/src/pcre2_printint.c
===================================================================
--- code/trunk/src/pcre2_printint.c    2017-04-16 13:04:57 UTC (rev 752)
+++ code/trunk/src/pcre2_printint.c    2017-04-16 16:49:11 UTC (rev 753)
@@ -340,7 +340,7 @@
       case OP_TABLE_LENGTH +
         ((sizeof(OP_names)/sizeof(const char *) == OP_TABLE_LENGTH) &&
         (sizeof(OP_lengths) == OP_TABLE_LENGTH)):
-      break;
+      return;
 /* ========================================================================== */


     case OP_END:


Modified: code/trunk/src/pcre2test.c
===================================================================
--- code/trunk/src/pcre2test.c    2017-04-16 13:04:57 UTC (rev 752)
+++ code/trunk/src/pcre2test.c    2017-04-16 16:49:11 UTC (rev 753)
@@ -4434,7 +4434,7 @@
 FILE *f;
 PCRE2_SIZE serial_size;
 size_t i;
-int rc, cmd, cmdlen;
+int rc, cmd, cmdlen, yield;
 uint16_t first_listed_newline;
 const char *cmdname;
 uint8_t *argptr, *serial;
@@ -4445,6 +4445,7 @@
   return PR_ABEND;
   }


+yield = PR_OK;
cmd = CMD_UNKNOWN;
cmdlen = 0;

@@ -4568,8 +4569,8 @@
     general_context);
   if (rc < 0)
     {
+    fclose(f);
     if (!serial_error(rc, "Serialization")) return PR_ABEND;
-    fclose(f);
     break;
     }


@@ -4615,37 +4616,39 @@
     return PR_ABEND;
     }


-  if (fread(serial, 1, serial_size, f) != serial_size)
-    {
-    fprintf(outfile, "** Wrong return from fread()\n");
-    free(serial);
-    fclose(f);
-    return PR_ABEND;
-    }
+  i = fread(serial, 1, serial_size, f);
   fclose(f);


-  PCRE2_SERIALIZE_GET_NUMBER_OF_CODES(rc, serial);
-  if (rc < 0)
+  if (i != serial_size)
     {
-    if (!serial_error(rc, "Get number of codes")) return PR_ABEND;
+    fprintf(outfile, "** Wrong return from fread()\n");
+    yield = PR_ABEND;
     }
   else
     {
-    if (rc + patstacknext > PATSTACKSIZE)
+    PCRE2_SERIALIZE_GET_NUMBER_OF_CODES(rc, serial);
+    if (rc < 0)
       {
-      fprintf(outfile, "** Not enough space on pattern stack for %d pattern%s\n",
-        rc, (rc == 1)? "" : "s");
-      rc = PATSTACKSIZE - patstacknext;
-      fprintf(outfile, "** Decoding %d pattern%s\n", rc,
-        (rc == 1)? "" : "s");
+      if (!serial_error(rc, "Get number of codes")) yield = PR_ABEND;
       }
-    PCRE2_SERIALIZE_DECODE(rc, patstack + patstacknext, rc, serial,
-      general_context);
-    if (rc < 0)
+    else
       {
-      if (!serial_error(rc, "Deserialization")) return PR_ABEND;
+      if (rc + patstacknext > PATSTACKSIZE)
+        {
+        fprintf(outfile, "** Not enough space on pattern stack for %d pattern%s\n",
+          rc, (rc == 1)? "" : "s");
+        rc = PATSTACKSIZE - patstacknext;
+        fprintf(outfile, "** Decoding %d pattern%s\n", rc,
+          (rc == 1)? "" : "s");
+        }
+      PCRE2_SERIALIZE_DECODE(rc, patstack + patstacknext, rc, serial,
+        general_context);
+      if (rc < 0)
+        {
+        if (!serial_error(rc, "Deserialization")) yield = PR_ABEND;
+        }
+      else patstacknext += rc;
       }
-    else patstacknext += rc;
     }


free(serial);
@@ -4652,7 +4655,7 @@
break;
}

-return PR_OK;
+return yield;
}


@@ -5429,7 +5432,7 @@
   else
     PCRE2_MATCH(capcount, compiled_code, pp, ulen, dat_datctl.offset,
       dat_datctl.options, match_data, PTR(dat_context));
-      
+
   if (capcount == errnumber)
     {
     min = mid;
@@ -7896,7 +7899,7 @@
 if (test_mode == PCRE8_MODE)
   {
   CREATECONTEXTS;
-  CONTEXTTESTS; 
+  CONTEXTTESTS;
   }
 #endif


@@ -7906,7 +7909,7 @@
if (test_mode == PCRE16_MODE)
{
CREATECONTEXTS;
- CONTEXTTESTS;
+ CONTEXTTESTS;
}
#endif

@@ -7916,7 +7919,7 @@
if (test_mode == PCRE32_MODE)
{
CREATECONTEXTS;
- CONTEXTTESTS;
+ CONTEXTTESTS;
}
#endif