Add a patch to sfeed to avoid possible undefined behaviour in ctype(3) - pkgsrc-localpatches - leot's pkgsrc LOCALPATCHES
 (HTM) hg clone https://bitbucket.org/iamleot/pkgsrc-localpatches
 (DIR) Log
 (DIR) Files
 (DIR) Refs
       ---
 (DIR) changeset a9d57304642953cb9f9584ac0c8ee270f7f0b981
 (DIR) parent 77f33f1ed0ef57356b3bd488b75ad4a62a982be2
 (HTM) Author: Leonardo Taccari <iamleot@gmail.com>
       Date:   Fri,  7 Sep 2018 12:00:38 
       
       Add a patch to sfeed to avoid possible undefined behaviour in ctype(3)
       
       Diffstat:
        wip/sfeed/patch-sfeed.c |  155 ++++++++++++++++++++++++++++++++++++++++++++++++
        1 files changed, 155 insertions(+), 0 deletions(-)
       ---
       diff -r 77f33f1ed0ef -r a9d573046429 wip/sfeed/patch-sfeed.c
       --- /dev/null   Thu Jan 01 00:00:00 1970 +0000
       +++ b/wip/sfeed/patch-sfeed.c   Fri Sep 07 12:00:38 2018 +0200
       @@ -0,0 +1,155 @@
       +$NetBSD$
       +
       +Cast all ctype(3) function arguments to (unsigned char) to avoid possible
       +undefined behaviour.
       +
       +--- sfeed.c.orig       2018-09-07 09:58:13.675813628 +0000
       ++++ sfeed.c
       +@@ -247,10 +247,10 @@ string_print_encoded(String *s)
       +               return;
       + 
       +       /* skip leading whitespace */
       +-      for (p = s->data; *p && isspace((int)*p); p++)
       ++      for (p = s->data; *p && isspace((unsigned char)*p); p++)
       +               ;
       +       /* seek location of trailing whitespace */
       +-      for (e = s->data + s->len; e > p && isspace((int)*(e - 1)); e--)
       ++      for (e = s->data + s->len; e > p && isspace((unsigned char)*(e - 1)); e--)
       +               ;
       + 
       +       for (; *p && p != e; p++) {
       +@@ -260,7 +260,7 @@ string_print_encoded(String *s)
       +               case '\t': fputs("\\t",  stdout); break;
       +               default:
       +                       /* ignore control chars */
       +-                      if (!iscntrl((int)*p))
       ++                      if (!iscntrl((unsigned char)*p))
       +                               putchar(*p);
       +                       break;
       +               }
       +@@ -278,16 +278,16 @@ string_print_trimmed(String *s)
       +               return;
       + 
       +       /* skip leading whitespace */
       +-      for (p = s->data; *p && isspace((int)*p); p++)
       ++      for (p = s->data; *p && isspace((unsigned char)*p); p++)
       +               ;
       +       /* seek location of trailing whitespace */
       +-      for (e = s->data + s->len; e > p && isspace((int)*(e - 1)); e--)
       ++      for (e = s->data + s->len; e > p && isspace((unsigned char)*(e - 1)); e--)
       +               ;
       + 
       +       for (; *p && p != e; p++) {
       +-              if (isspace((int)*p))
       ++              if (isspace((unsigned char)*p))
       +                       putchar(' '); /* any whitespace to space */
       +-              else if (!iscntrl((int)*p))
       ++              else if (!iscntrl((unsigned char)*p))
       +                       /* ignore other control chars */
       +                       putchar((int)*p);
       +       }
       +@@ -376,20 +376,20 @@ gettzoffset(const char *s)
       +       int tzhour = 0, tzmin = 0;
       +       size_t i, namelen;
       + 
       +-      for (; *s && isspace((int)*s); s++)
       ++      for (; *s && isspace((unsigned char)*s); s++)
       +               ;
       +       switch (s[0]) {
       +       case '-': /* offset */
       +       case '+':
       +-              for (i = 0, p = s + 1; i < 2 && *p && isdigit(*p); i++, p++)
       ++              for (i = 0, p = s + 1; i < 2 && *p && isdigit((unsigned char)*p); i++, p++)
       +                       tzhour = (tzhour * 10) + (*p - '0');
       +-              if (*p && !isdigit(*p))
       ++              if (*p && !isdigit((unsigned char)*p))
       +                       p++;
       +-              for (i = 0; i < 2 && *p && isdigit(*p); i++, p++)
       ++              for (i = 0; i < 2 && *p && isdigit((unsigned char)*p); i++, p++)
       +                       tzmin = (tzmin * 10) + (*p - '0');
       +               return ((tzhour * 3600) + (tzmin * 60)) * (s[0] == '-' ? -1 : 1);
       +       default: /* timezone name */
       +-              for (i = 0; *s && isalpha((int)s[i]); i++)
       ++              for (i = 0; *s && isalpha((unsigned char)s[i]); i++)
       +                       ;
       +               namelen = i; /* end of name */
       +               /* optimization: these are always non-matching */
       +@@ -429,49 +429,49 @@ parsetime(const char *s, time_t *tp)
       +       int va[6] = { 0 }, i, j, v, vi;
       +       size_t m;
       + 
       +-      for (; *s && isspace((int)*s); s++)
       ++      for (; *s && isspace((unsigned char)*s); s++)
       +               ;
       +-      if (!isdigit((int)*s) && !isalpha((int)*s))
       ++      if (!isdigit((unsigned char)*s) && !isalpha((unsigned char)*s))
       +               return -1;
       + 
       +-      if (isdigit((int)*s)) {
       ++      if (isdigit((unsigned char)*s)) {
       +               /* format "%Y-%m-%d %H:%M:%S" or "%Y-%m-%dT%H:%M:%S" */
       +               vi = 0;
       + time:
       +               for (; *s && vi < 6; vi++) {
       +-                      for (i = 0, v = 0; *s && i < 4 && isdigit((int)*s); s++, i++)
       ++                      for (i = 0, v = 0; *s && i < 4 && isdigit((unsigned char)*s); s++, i++)
       +                               v = (v * 10) + (*s - '0');
       +                       va[vi] = v;
       +                       if ((vi < 2 && *s == '-') ||
       +-                          (vi == 2 && (*s == 'T' || isspace((int)*s))) ||
       ++                          (vi == 2 && (*s == 'T' || isspace((unsigned char)*s))) ||
       +                           (vi > 2 && *s == ':'))
       +                               s++;
       +               }
       +               /* TODO: only if seconds are parsed (vi == 5)? */
       +               /* skip milliseconds for: %Y-%m-%dT%H:%M:%S.000Z */
       +               if (*s == '.') {
       +-                      for (s++; *s && isdigit((int)*s); s++)
       ++                      for (s++; *s && isdigit((unsigned char)*s); s++)
       +                               ;
       +               }
       +               end = s;
       +-      } else if (isalpha((int)*s)) {
       ++      } else if (isalpha((unsigned char)*s)) {
       +               /* format: "%a, %d %b %Y %H:%M:%S" */
       +               /* parse "%a, %d %b %Y " part, then use time parsing as above */
       +-              for (; *s && isalpha((int)*s); s++)
       ++              for (; *s && isalpha((unsigned char)*s); s++)
       +                       ;
       +-              for (; *s && isspace((int)*s); s++)
       ++              for (; *s && isspace((unsigned char)*s); s++)
       +                       ;
       +               if (*s != ',')
       +                       return -1;
       +-              for (s++; *s && isspace((int)*s); s++)
       ++              for (s++; *s && isspace((unsigned char)*s); s++)
       +                       ;
       +-              for (v = 0, i = 0; *s && i < 4 && isdigit((int)*s); s++, i++)
       ++              for (v = 0, i = 0; *s && i < 4 && isdigit((unsigned char)*s); s++, i++)
       +                       v = (v * 10) + (*s - '0');
       +               va[2] = v; /* day */
       +-              for (; *s && isspace((int)*s); s++)
       ++              for (; *s && isspace((unsigned char)*s); s++)
       +                       ;
       +               /* end of word month */
       +-              for (j = 0; *s && isalpha((int)s[j]); j++)
       ++              for (j = 0; *s && isalpha((unsigned char)s[j]); j++)
       +                       ;
       +               /* check month name */
       +               if (j < 3 || j > 9)
       +@@ -487,12 +487,12 @@ time:
       +               }
       +               if (m >= 12)
       +                       return -1; /* no month found */
       +-              for (; *s && isspace((int)*s); s++)
       ++              for (; *s && isspace((unsigned char)*s); s++)
       +                       ;
       +-              for (v = 0, i = 0; *s && i < 4 && isdigit((int)*s); s++, i++)
       ++              for (v = 0, i = 0; *s && i < 4 && isdigit((unsigned char)*s); s++, i++)
       +                       v = (v * 10) + (*s - '0');
       +               va[0] = v; /* year */
       +-              for (; *s && isspace((int)*s); s++)
       ++              for (; *s && isspace((unsigned char)*s); s++)
       +                       ;
       +               /* parse regular time, see above */
       +               vi = 3;