]> git.ipfire.org Git - thirdparty/gettext.git/commitdiff
xgettext: Fix the last change to literalstring
authorDaiki Ueno <ueno@gnu.org>
Thu, 25 Jun 2015 12:02:47 +0000 (21:02 +0900)
committerDaiki Ueno <ueno@gnu.org>
Thu, 25 Jun 2015 12:02:47 +0000 (21:02 +0900)
* gettext-tools/src/x-c.c (literalstring_parse): Bail out if C == NUL.
Also adjust the loop invariant in Unicode literal handling.
Reported by Hanno Boeck in:
<http://savannah.gnu.org/bugs/?45391>.

gettext-tools/src/ChangeLog
gettext-tools/src/x-c.c

index 5b03bac5a7362c764d55c80c678890f1496b8f3e..ad56f27e0ffdf02bdd66a73bab5a34a1c0ee46a4 100644 (file)
@@ -1,3 +1,10 @@
+2015-06-25  Daiki Ueno  <ueno@gnu.org>
+
+       * x-c.c (literalstring_parse): Bail out if C == NUL.  Also adjust
+       the loop invariant in Unicode literal handling.
+       Reported by Hanno Boeck in:
+       <http://savannah.gnu.org/bugs/?45391>.
+
 2015-06-25  Daiki Ueno  <ueno@gnu.org>
 
        * x-c.c (literalstring_parse): Add more NUL checks.  Change the
index 722f4b6e020eca226e1ba12053f4c71168b01ac2..68e9f5d50c1c4a0bccec2031f0d6fcd6ed908a9a 100644 (file)
@@ -1129,23 +1129,24 @@ literalstring_parse (const char *string, lex_pos_ty *pos,
           case 'U': case 'u':
             {
               unsigned char buf[8];
-              int length = c == 'u' ? 4 : 8;
+              int prefix = c;
+              int length = prefix == 'u' ? 4 : 8;
               int n, j;
 
               for (n = 0, j = 0; j < length; j++)
                 {
-                  int c1 = *p++;
-
-                  if (c1 >= '0' && c1 <= '9')
-                    n = (n << 4) + (c1 - '0');
-                  else if (c1 >= 'A' && c1 <= 'F')
-                    n = (n << 4) + (c1 - 'A' + 10);
-                  else if (c1 >= 'a' && c1 <= 'f')
-                    n = (n << 4) + (c1 - 'a' + 10);
+                  c = *p++;
+
+                  if (c >= '0' && c <= '9')
+                    n = (n << 4) + (c - '0');
+                  else if (c >= 'A' && c <= 'F')
+                    n = (n << 4) + (c - 'A' + 10);
+                  else if (c >= 'a' && c <= 'f')
+                    n = (n << 4) + (c - 'a' + 10);
                   else
                     break;
 
-                  buf[j] = c1;
+                  buf[j] = c;
                 }
 
               if (j == length)
@@ -1167,7 +1168,7 @@ warning: invalid Unicode character"));
                   int i;
 
                   mixed_string_buffer_append_char (bp, '\\');
-                  mixed_string_buffer_append_char (bp, c);
+                  mixed_string_buffer_append_char (bp, prefix);
 
                   for (i = 0; i < j; i++)
                     mixed_string_buffer_append_char (bp, buf[i]);
@@ -1178,6 +1179,9 @@ warning: invalid Unicode character"));
             continue;
           }
 
+      if (c == '\0')
+        break;
+
       mixed_string_buffer_append_char (bp, c);
     }