Fix potential heap corruption in "gpg -v --version"
[gnupg.git] / util / strsep.c
1 #include <config.h>
2 #include <string.h>
3
4 /* code taken from glibc-2.2.1/sysdeps/generic/strsep.c */
5 char *
6 strsep (char **stringp, const char *delim)
7 {
8   char *begin, *end;
9
10   begin = *stringp;
11   if (begin == NULL)
12     return NULL;
13
14   /* A frequent case is when the delimiter string contains only one
15      character.  Here we don't need to call the expensive `strpbrk'
16      function and instead work using `strchr'.  */
17   if (delim[0] == '\0' || delim[1] == '\0')
18     {
19       char ch = delim[0];
20
21       if (ch == '\0')
22         end = NULL;
23       else
24         {
25           if (*begin == ch)
26             end = begin;
27           else if (*begin == '\0')
28             end = NULL;
29           else
30             end = strchr (begin + 1, ch);
31         }
32     }
33   else
34     /* Find the end of the token.  */
35     end = strpbrk (begin, delim);
36
37   if (end)
38     {
39       /* Terminate the token and set *STRINGP past NUL character.  */
40       *end++ = '\0';
41       *stringp = end;
42     }
43   else
44     /* No more delimiters; this is the last token.  */
45     *stringp = NULL;
46
47   return begin;
48 }