]> git.ipfire.org Git - thirdparty/cups.git/blobdiff - cups/ipp.c
Move debug printfs to internal usage only.
[thirdparty/cups.git] / cups / ipp.c
index d974bbab8278bba8ff771b260f6507d8ab0603f4..d96f7740483d07bbea1f3a8e99324a128a8ca4c4 100644 (file)
@@ -1,16 +1,11 @@
 /*
  * Internet Printing Protocol functions for CUPS.
  *
- * Copyright 2007-2017 by Apple Inc.
- * Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ * Copyright © 2007-2018 by Apple Inc.
+ * Copyright © 1997-2007 by Easy Software Products, all rights reserved.
  *
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file.  If this file is
- * missing or damaged, see the license at "http://www.cups.org/".
- *
- * This file is subject to the Apple OS-Developed Software exception.
+ * Licensed under Apache License v2.0.  See the file "LICENSE" for more
+ * information.
  */
 
 /*
  */
 
 #include "cups-private.h"
+#include "debug-internal.h"
 #include <regex.h>
-#ifdef WIN32
+#ifdef _WIN32
 #  include <io.h>
-#endif /* WIN32 */
+#endif /* _WIN32 */
 
 
 /*
@@ -33,12 +29,8 @@ static ipp_attribute_t       *ipp_add_attr(ipp_t *ipp, const char *name,
                                      int num_values);
 static void            ipp_free_values(ipp_attribute_t *attr, int element,
                                        int count);
-static char            *ipp_get_code(const char *locale, char *buffer,
-                                     size_t bufsize)
-                                     __attribute__((nonnull(1,2)));
-static char            *ipp_lang_code(const char *locale, char *buffer,
-                                      size_t bufsize)
-                                      __attribute__((nonnull(1,2)));
+static char            *ipp_get_code(const char *locale, char *buffer, size_t bufsize) _CUPS_NONNULL(1,2);
+static char            *ipp_lang_code(const char *locale, char *buffer, size_t bufsize) _CUPS_NONNULL(1,2);
 static size_t          ipp_length(ipp_t *ipp, int collection);
 static ssize_t         ipp_read_http(http_t *http, ipp_uchar_t *buffer,
                                      size_t length);
@@ -1483,6 +1475,7 @@ ippCopyAttribute(
     int             quickcopy)         /* I - 1 for a referenced copy, 0 for normal */
 {
   int                  i;              /* Looping var */
+  ipp_tag_t            srctag;         /* Source value tag */
   ipp_attribute_t      *dstattr;       /* Destination attribute */
   _ipp_value_t         *srcval,        /* Source value */
                        *dstval;        /* Destination value */
@@ -1501,9 +1494,10 @@ ippCopyAttribute(
   * Copy it...
   */
 
-  quickcopy = quickcopy ? IPP_TAG_CUPS_CONST : 0;
+  quickcopy = (quickcopy && (srcattr->value_tag & IPP_TAG_CUPS_CONST)) ? IPP_TAG_CUPS_CONST : 0;
+  srctag    = srcattr->value_tag & IPP_TAG_CUPS_MASK;
 
-  switch (srcattr->value_tag & ~IPP_TAG_CUPS_CONST)
+  switch (srctag)
   {
     case IPP_TAG_ZERO :
         dstattr = ippAddSeparator(dst);
@@ -1516,139 +1510,70 @@ ippCopyAttribute(
     case IPP_TAG_NOTSETTABLE :
     case IPP_TAG_DELETEATTR :
     case IPP_TAG_ADMINDEFINE :
-        dstattr = ippAddOutOfBand(dst, srcattr->group_tag, srcattr->value_tag & ~IPP_TAG_CUPS_CONST, srcattr->name);
+        dstattr = ippAddOutOfBand(dst, srcattr->group_tag, srctag, srcattr->name);
         break;
 
     case IPP_TAG_INTEGER :
     case IPP_TAG_ENUM :
-        dstattr = ippAddIntegers(dst, srcattr->group_tag, srcattr->value_tag,
-                                srcattr->name, srcattr->num_values, NULL);
-        if (!dstattr)
-          break;
-
-        for (i = srcattr->num_values, srcval = srcattr->values, dstval = dstattr->values;
-             i > 0;
-             i --, srcval ++, dstval ++)
-         dstval->integer = srcval->integer;
-        break;
-
     case IPP_TAG_BOOLEAN :
-        dstattr = ippAddBooleans(dst, srcattr->group_tag, srcattr->name,
-                               srcattr->num_values, NULL);
-        if (!dstattr)
-          break;
-
-        for (i = srcattr->num_values, srcval = srcattr->values, dstval = dstattr->values;
-             i > 0;
-             i --, srcval ++, dstval ++)
-         dstval->boolean = srcval->boolean;
+    case IPP_TAG_DATE :
+    case IPP_TAG_RESOLUTION :
+    case IPP_TAG_RANGE :
+        if ((dstattr = ipp_add_attr(dst, srcattr->name, srcattr->group_tag, srctag, srcattr->num_values)) != NULL)
+         memcpy(dstattr->values, srcattr->values, (size_t)srcattr->num_values * sizeof(_ipp_value_t));
         break;
 
     case IPP_TAG_TEXT :
     case IPP_TAG_NAME :
+    case IPP_TAG_RESERVED_STRING :
     case IPP_TAG_KEYWORD :
     case IPP_TAG_URI :
     case IPP_TAG_URISCHEME :
     case IPP_TAG_CHARSET :
     case IPP_TAG_LANGUAGE :
     case IPP_TAG_MIMETYPE :
-        dstattr = ippAddStrings(dst, srcattr->group_tag,
-                               (ipp_tag_t)(srcattr->value_tag | quickcopy),
-                               srcattr->name, srcattr->num_values, NULL, NULL);
-        if (!dstattr)
+        if ((dstattr = ippAddStrings(dst, srcattr->group_tag, (ipp_tag_t)(srctag | quickcopy), srcattr->name, srcattr->num_values, NULL, NULL)) == NULL)
           break;
 
         if (quickcopy)
        {
-         for (i = srcattr->num_values, srcval = srcattr->values,
-                  dstval = dstattr->values;
-              i > 0;
-              i --, srcval ++, dstval ++)
-           dstval->string.text = srcval->string.text;
+        /*
+         * Can safely quick-copy these string values...
+         */
+
+         memcpy(dstattr->values, srcattr->values, (size_t)srcattr->num_values * sizeof(_ipp_value_t));
         }
-       else if (srcattr->value_tag & IPP_TAG_CUPS_CONST)
-       {
-         for (i = srcattr->num_values, srcval = srcattr->values,
-                  dstval = dstattr->values;
-              i > 0;
-              i --, srcval ++, dstval ++)
-           dstval->string.text = _cupsStrAlloc(srcval->string.text);
-       }
        else
        {
-         for (i = srcattr->num_values, srcval = srcattr->values,
-                  dstval = dstattr->values;
-              i > 0;
-              i --, srcval ++, dstval ++)
-           dstval->string.text = _cupsStrRetain(srcval->string.text);
-       }
-        break;
-
-    case IPP_TAG_DATE :
-        if (srcattr->num_values != 1)
-          return (NULL);
-
-        dstattr = ippAddDate(dst, srcattr->group_tag, srcattr->name,
-                            srcattr->values[0].date);
-        break;
-
-    case IPP_TAG_RESOLUTION :
-        dstattr = ippAddResolutions(dst, srcattr->group_tag, srcattr->name,
-                                   srcattr->num_values, IPP_RES_PER_INCH,
-                                   NULL, NULL);
-        if (!dstattr)
-          break;
-
-        for (i = srcattr->num_values, srcval = srcattr->values, dstval = dstattr->values;
-             i > 0;
-             i --, srcval ++, dstval ++)
-       {
-         dstval->resolution.xres  = srcval->resolution.xres;
-         dstval->resolution.yres  = srcval->resolution.yres;
-         dstval->resolution.units = srcval->resolution.units;
-       }
-        break;
-
-    case IPP_TAG_RANGE :
-        dstattr = ippAddRanges(dst, srcattr->group_tag, srcattr->name,
-                              srcattr->num_values, NULL, NULL);
-        if (!dstattr)
-          break;
+        /*
+         * Otherwise do a normal reference counted copy...
+         */
 
-        for (i = srcattr->num_values, srcval = srcattr->values, dstval = dstattr->values;
-             i > 0;
-             i --, srcval ++, dstval ++)
-       {
-         dstval->range.lower = srcval->range.lower;
-         dstval->range.upper = srcval->range.upper;
+         for (i = srcattr->num_values, srcval = srcattr->values, dstval = dstattr->values; i > 0; i --, srcval ++, dstval ++)
+           dstval->string.text = _cupsStrAlloc(srcval->string.text);
        }
         break;
 
     case IPP_TAG_TEXTLANG :
     case IPP_TAG_NAMELANG :
-        dstattr = ippAddStrings(dst, srcattr->group_tag,
-                               (ipp_tag_t)(srcattr->value_tag | quickcopy),
-                               srcattr->name, srcattr->num_values, NULL, NULL);
-        if (!dstattr)
+        if ((dstattr = ippAddStrings(dst, srcattr->group_tag, (ipp_tag_t)(srctag | quickcopy), srcattr->name, srcattr->num_values, NULL, NULL)) == NULL)
           break;
 
         if (quickcopy)
        {
-         for (i = srcattr->num_values, srcval = srcattr->values,
-                  dstval = dstattr->values;
-              i > 0;
-              i --, srcval ++, dstval ++)
-         {
-            dstval->string.language = srcval->string.language;
-           dstval->string.text     = srcval->string.text;
-          }
+        /*
+         * Can safely quick-copy these string values...
+         */
+
+         memcpy(dstattr->values, srcattr->values, (size_t)srcattr->num_values * sizeof(_ipp_value_t));
         }
        else if (srcattr->value_tag & IPP_TAG_CUPS_CONST)
        {
-         for (i = srcattr->num_values, srcval = srcattr->values,
-                  dstval = dstattr->values;
-              i > 0;
-              i --, srcval ++, dstval ++)
+        /*
+         * Otherwise do a normal reference counted copy...
+         */
+
+         for (i = srcattr->num_values, srcval = srcattr->values, dstval = dstattr->values; i > 0; i --, srcval ++, dstval ++)
          {
            if (srcval == srcattr->values)
               dstval->string.language = _cupsStrAlloc(srcval->string.language);
@@ -1658,32 +1583,13 @@ ippCopyAttribute(
            dstval->string.text = _cupsStrAlloc(srcval->string.text);
           }
         }
-       else
-       {
-         for (i = srcattr->num_values, srcval = srcattr->values,
-                  dstval = dstattr->values;
-              i > 0;
-              i --, srcval ++, dstval ++)
-         {
-           if (srcval == srcattr->values)
-              dstval->string.language = _cupsStrRetain(srcval->string.language);
-           else
-              dstval->string.language = dstattr->values[0].string.language;
-
-           dstval->string.text = _cupsStrRetain(srcval->string.text);
-          }
-        }
         break;
 
     case IPP_TAG_BEGIN_COLLECTION :
-        dstattr = ippAddCollections(dst, srcattr->group_tag, srcattr->name,
-                                   srcattr->num_values, NULL);
-        if (!dstattr)
+        if ((dstattr = ippAddCollections(dst, srcattr->group_tag, srcattr->name, srcattr->num_values, NULL)) == NULL)
           break;
 
-        for (i = srcattr->num_values, srcval = srcattr->values, dstval = dstattr->values;
-             i > 0;
-             i --, srcval ++, dstval ++)
+        for (i = srcattr->num_values, srcval = srcattr->values, dstval = dstattr->values; i > 0; i --, srcval ++, dstval ++)
        {
          dstval->collection = srcval->collection;
          srcval->collection->use ++;
@@ -1692,15 +1598,10 @@ ippCopyAttribute(
 
     case IPP_TAG_STRING :
     default :
-        /* TODO: Implement quick copy for unknown/octetString values */
-        dstattr = ippAddIntegers(dst, srcattr->group_tag, srcattr->value_tag,
-                                srcattr->name, srcattr->num_values, NULL);
-        if (!dstattr)
+        if ((dstattr = ipp_add_attr(dst, srcattr->name, srcattr->group_tag, srctag, srcattr->num_values)) == NULL)
           break;
 
-        for (i = srcattr->num_values, srcval = srcattr->values, dstval = dstattr->values;
-             i > 0;
-             i --, srcval ++, dstval ++)
+        for (i = srcattr->num_values, srcval = srcattr->values, dstval = dstattr->values; i > 0; i --, srcval ++, dstval ++)
        {
          dstval->unknown.length = srcval->unknown.length;
 
@@ -3089,6 +2990,13 @@ ippReadIO(void       *src,               /* I - Data source */
            ipp->state = IPP_STATE_DATA;
            break;
          }
+         else if (tag == IPP_TAG_ZERO || (tag == IPP_TAG_OPERATION && ipp->curtag != IPP_TAG_ZERO))
+         {
+           _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Invalid group tag."), 1);
+           DEBUG_printf(("1ippReadIO: bad tag 0x%02x.", tag));
+           _cupsBufferRelease((char *)buffer);
+           return (IPP_STATE_ERROR);
+         }
           else if (tag < IPP_TAG_UNSUPPORTED_VALUE)
          {
           /*
@@ -3386,7 +3294,10 @@ ippReadIO(void       *src,               /* I - Data source */
                 value->boolean = (char)buffer[0];
                break;
 
-            case IPP_TAG_NOVALUE :
+           case IPP_TAG_UNSUPPORTED_VALUE :
+           case IPP_TAG_DEFAULT :
+           case IPP_TAG_UNKNOWN :
+           case IPP_TAG_NOVALUE :
            case IPP_TAG_NOTSETTABLE :
            case IPP_TAG_DELETEATTR :
            case IPP_TAG_ADMINDEFINE :
@@ -3406,6 +3317,7 @@ ippReadIO(void       *src,                /* I - Data source */
 
            case IPP_TAG_TEXT :
            case IPP_TAG_NAME :
+           case IPP_TAG_RESERVED_STRING :
            case IPP_TAG_KEYWORD :
            case IPP_TAG_URI :
            case IPP_TAG_URISCHEME :
@@ -3660,6 +3572,7 @@ ippReadIO(void       *src,                /* I - Data source */
                DEBUG_printf(("2ippReadIO: member name=\"%s\"", attr->name));
                break;
 
+            case IPP_TAG_STRING :
             default : /* Other unsupported values */
                 if (tag == IPP_TAG_STRING && n > IPP_MAX_LENGTH)
                {
@@ -4306,17 +4219,21 @@ ippSetString(ipp_t           *ipp,      /* I  - IPP message */
 {
   char         *temp;                  /* Temporary string */
   _ipp_value_t *value;                 /* Current value */
+  ipp_tag_t    value_tag;              /* Value tag */
 
 
  /*
   * Range check input...
   */
 
+  if (attr && *attr)
+    value_tag = (*attr)->value_tag & IPP_TAG_CUPS_MASK;
+  else
+    value_tag = IPP_TAG_ZERO;
+
   if (!ipp || !attr || !*attr ||
-      ((*attr)->value_tag != IPP_TAG_TEXTLANG &&
-      (*attr)->value_tag != IPP_TAG_NAMELANG &&
-       ((*attr)->value_tag < IPP_TAG_TEXT ||
-        (*attr)->value_tag > IPP_TAG_MIMETYPE)) ||
+      (value_tag < IPP_TAG_TEXT && value_tag != IPP_TAG_TEXTLANG &&
+       value_tag != IPP_TAG_NAMELANG) || value_tag > IPP_TAG_MIMETYPE ||
       element < 0 || element > (*attr)->num_values || !strvalue)
     return (0);
 
@@ -4808,21 +4725,6 @@ ippValidateAttribute(
   ipp_attribute_t *colattr;            /* Collection attribute */
   regex_t      re;                     /* Regular expression */
   ipp_uchar_t  *date;                  /* Current date value */
-  static const char * const uri_status_strings[] =
-  {                                    /* URI status strings */
-    "URI too large",
-    "Bad arguments to function",
-    "Bad resource in URI",
-    "Bad port number in URI",
-    "Bad hostname/address in URI",
-    "Bad username in URI",
-    "Bad scheme in URI",
-    "Bad/empty URI",
-    "OK",
-    "Missing scheme in URI",
-    "Unknown scheme in URI",
-    "Missing resource in URI"
-  };
 
 
  /*
@@ -4842,18 +4744,13 @@ ippValidateAttribute(
 
   if (*ptr || ptr == attr->name)
   {
-    ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
-                  _("\"%s\": Bad attribute name - invalid character "
-                   "(RFC 8011 section 5.1.4)."), attr->name);
+    ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad attribute name - invalid character (RFC 8011 section 5.1.4)."), attr->name);
     return (0);
   }
 
   if ((ptr - attr->name) > 255)
   {
-    ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
-                  _("\"%s\": Bad attribute name - bad length %d "
-                   "(RFC 8011 section 5.1.4)."), attr->name,
-                 (int)(ptr - attr->name));
+    ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad attribute name - bad length %d (RFC 8011 section 5.1.4)."), attr->name, (int)(ptr - attr->name));
     return (0);
   }
 
@@ -4868,10 +4765,7 @@ ippValidateAttribute(
          if (attr->values[i].boolean != 0 &&
              attr->values[i].boolean != 1)
          {
-           ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
-                          _("\"%s\": Bad boolen value %d "
-                           "(RFC 8011 section 5.1.21)."), attr->name,
-                         attr->values[i].boolean);
+           ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad boolean value %d (RFC 8011 section 5.1.21)."), attr->name, attr->values[i].boolean);
            return (0);
          }
        }
@@ -4882,10 +4776,7 @@ ippValidateAttribute(
        {
          if (attr->values[i].integer < 1)
          {
-           ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
-                         _("\"%s\": Bad enum value %d - out of range "
-                           "(RFC 8011 section 5.1.5)."), attr->name,
-                           attr->values[i].integer);
+           ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad enum value %d - out of range (RFC 8011 section 5.1.5)."), attr->name, attr->values[i].integer);
             return (0);
          }
        }
@@ -4896,10 +4787,7 @@ ippValidateAttribute(
        {
          if (attr->values[i].unknown.length > IPP_MAX_OCTETSTRING)
          {
-           ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
-                         _("\"%s\": Bad octetString value - bad length %d "
-                           "(RFC 8011 section 5.1.20)."), attr->name,
-                           attr->values[i].unknown.length);
+           ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad octetString value - bad length %d (RFC 8011 section 5.1.20)."), attr->name, attr->values[i].unknown.length);
            return (0);
          }
        }
@@ -4912,73 +4800,55 @@ ippValidateAttribute(
 
           if (date[2] < 1 || date[2] > 12)
          {
-           ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
-                         _("\"%s\": Bad dateTime month %u "
-                           "(RFC 8011 section 5.1.15)."), attr->name, date[2]);
+           ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad dateTime month %u (RFC 8011 section 5.1.15)."), attr->name, date[2]);
            return (0);
          }
 
           if (date[3] < 1 || date[3] > 31)
          {
-           ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
-                         _("\"%s\": Bad dateTime day %u "
-                           "(RFC 8011 section 5.1.15)."), attr->name, date[3]);
+           ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad dateTime day %u (RFC 8011 section 5.1.15)."), attr->name, date[3]);
            return (0);
          }
 
           if (date[4] > 23)
          {
-           ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
-                         _("\"%s\": Bad dateTime hours %u "
-                           "(RFC 8011 section 5.1.15)."), attr->name, date[4]);
+           ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad dateTime hours %u (RFC 8011 section 5.1.15)."), attr->name, date[4]);
            return (0);
          }
 
           if (date[5] > 59)
          {
-           ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
-                         _("\"%s\": Bad dateTime minutes %u "
-                           "(RFC 8011 section 5.1.15)."), attr->name, date[5]);
+           ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad dateTime minutes %u (RFC 8011 section 5.1.15)."), attr->name, date[5]);
            return (0);
          }
 
           if (date[6] > 60)
          {
-           ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
-                         _("\"%s\": Bad dateTime seconds %u "
-                           "(RFC 8011 section 5.1.15)."), attr->name, date[6]);
+           ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad dateTime seconds %u (RFC 8011 section 5.1.15)."), attr->name, date[6]);
            return (0);
          }
 
           if (date[7] > 9)
          {
-           ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
-                         _("\"%s\": Bad dateTime deciseconds %u "
-                           "(RFC 8011 section 5.1.15)."), attr->name, date[7]);
+           ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad dateTime deciseconds %u (RFC 8011 section 5.1.15)."), attr->name, date[7]);
            return (0);
          }
 
           if (date[8] != '-' && date[8] != '+')
          {
-           ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
-                         _("\"%s\": Bad dateTime UTC sign '%c' "
-                           "(RFC 8011 section 5.1.15)."), attr->name, date[8]);
+           ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad dateTime UTC sign '%c' (RFC 8011 section 5.1.15)."), attr->name, date[8]);
            return (0);
          }
 
           if (date[9] > 11)
          {
-           ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
-                         _("\"%s\": Bad dateTime UTC hours %u "
-                           "(RFC 8011 section 5.1.15)."), attr->name, date[9]);
+           ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad dateTime UTC hours %u (RFC 8011 section 5.1.15)."), attr->name, date[9]);
            return (0);
          }
 
           if (date[10] > 59)
          {
-           ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
-                         _("\"%s\": Bad dateTime UTC minutes %u "
-                           "(RFC 8011 section 5.1.15)."), attr->name, date[10]);
+           ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad dateTime UTC minutes %u (RFC 8011 section 5.1.15)."), attr->name, date[10]);
            return (0);
          }
        }
@@ -4989,46 +4859,19 @@ ippValidateAttribute(
        {
          if (attr->values[i].resolution.xres <= 0)
          {
-           ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
-                         _("\"%s\": Bad resolution value %dx%d%s - cross "
-                           "feed resolution must be positive "
-                           "(RFC 8011 section 5.1.16)."), attr->name,
-                         attr->values[i].resolution.xres,
-                         attr->values[i].resolution.yres,
-                         attr->values[i].resolution.units ==
-                             IPP_RES_PER_INCH ? "dpi" :
-                             attr->values[i].resolution.units ==
-                                 IPP_RES_PER_CM ? "dpcm" : "unknown");
+           ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad resolution value %dx%d%s - cross feed resolution must be positive (RFC 8011 section 5.1.16)."), attr->name, attr->values[i].resolution.xres, attr->values[i].resolution.yres, attr->values[i].resolution.units == IPP_RES_PER_INCH ? "dpi" : attr->values[i].resolution.units == IPP_RES_PER_CM ? "dpcm" : "unknown");
            return (0);
          }
 
          if (attr->values[i].resolution.yres <= 0)
          {
-           ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
-                         _("\"%s\": Bad resolution value %dx%d%s - feed "
-                           "resolution must be positive "
-                           "(RFC 8011 section 5.1.16)."), attr->name,
-                         attr->values[i].resolution.xres,
-                         attr->values[i].resolution.yres,
-                         attr->values[i].resolution.units ==
-                             IPP_RES_PER_INCH ? "dpi" :
-                             attr->values[i].resolution.units ==
-                                 IPP_RES_PER_CM ? "dpcm" : "unknown");
+           ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad resolution value %dx%d%s - feed resolution must be positive (RFC 8011 section 5.1.16)."), attr->name, attr->values[i].resolution.xres, attr->values[i].resolution.yres, attr->values[i].resolution.units == IPP_RES_PER_INCH ? "dpi" : attr->values[i].resolution.units == IPP_RES_PER_CM ? "dpcm" : "unknown");
             return (0);
          }
 
-         if (attr->values[i].resolution.units != IPP_RES_PER_INCH &&
-             attr->values[i].resolution.units != IPP_RES_PER_CM)
+         if (attr->values[i].resolution.units != IPP_RES_PER_INCH && attr->values[i].resolution.units != IPP_RES_PER_CM)
          {
-           ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
-                         _("\"%s\": Bad resolution value %dx%d%s - bad "
-                           "units value (RFC 8011 section 5.1.16)."),
-                         attr->name, attr->values[i].resolution.xres,
-                         attr->values[i].resolution.yres,
-                         attr->values[i].resolution.units ==
-                             IPP_RES_PER_INCH ? "dpi" :
-                             attr->values[i].resolution.units ==
-                                 IPP_RES_PER_CM ? "dpcm" : "unknown");
+           ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad resolution value %dx%d%s - bad units value (RFC 8011 section 5.1.16)."), attr->name, attr->values[i].resolution.xres, attr->values[i].resolution.yres, attr->values[i].resolution.units == IPP_RES_PER_INCH ? "dpi" : attr->values[i].resolution.units == IPP_RES_PER_CM ? "dpcm" : "unknown");
            return (0);
          }
        }
@@ -5039,11 +4882,7 @@ ippValidateAttribute(
        {
          if (attr->values[i].range.lower > attr->values[i].range.upper)
          {
-           ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
-                         _("\"%s\": Bad rangeOfInteger value %d-%d - lower "
-                           "greater than upper (RFC 8011 section 5.1.14)."),
-                         attr->name, attr->values[i].range.lower,
-                         attr->values[i].range.upper);
+           ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad rangeOfInteger value %d-%d - lower greater than upper (RFC 8011 section 5.1.14)."), attr->name, attr->values[i].range.lower, attr->values[i].range.upper);
            return (0);
          }
        }
@@ -5097,24 +4936,27 @@ ippValidateAttribute(
            }
            else if (*ptr & 0x80)
              break;
+           else if ((*ptr < ' ' && *ptr != '\n' && *ptr != '\r' && *ptr != '\t') || *ptr == 0x7f)
+             break;
          }
 
-         if (*ptr)
-         {
-           ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
-                         _("\"%s\": Bad text value \"%s\" - bad UTF-8 "
-                           "sequence (RFC 8011 section 5.1.2)."), attr->name,
-                         attr->values[i].string.text);
-           return (0);
-         }
+          if (*ptr)
+          {
+           if (*ptr < ' ' || *ptr == 0x7f)
+           {
+             ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad text value \"%s\" - bad control character (PWG 5100.14 section 8.3)."), attr->name, attr->values[i].string.text);
+             return (0);
+           }
+           else
+           {
+             ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad text value \"%s\" - bad UTF-8 sequence (RFC 8011 section 5.1.2)."), attr->name, attr->values[i].string.text);
+             return (0);
+           }
+          }
 
          if ((ptr - attr->values[i].string.text) > (IPP_MAX_TEXT - 1))
          {
-           ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
-                         _("\"%s\": Bad text value \"%s\" - bad length %d "
-                           "(RFC 8011 section 5.1.2)."), attr->name,
-                         attr->values[i].string.text,
-                         (int)(ptr - attr->values[i].string.text));
+           ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad text value \"%s\" - bad length %d (RFC 8011 section 5.1.2)."), attr->name, attr->values[i].string.text, (int)(ptr - attr->values[i].string.text));
            return (0);
          }
        }
@@ -5155,24 +4997,27 @@ ippValidateAttribute(
            }
            else if (*ptr & 0x80)
              break;
+           else if (*ptr < ' ' || *ptr == 0x7f)
+             break;
          }
 
          if (*ptr)
          {
-           ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
-                         _("\"%s\": Bad name value \"%s\" - bad UTF-8 "
-                           "sequence (RFC 8011 section 5.1.3)."), attr->name,
-                         attr->values[i].string.text);
-           return (0);
-         }
+           if (*ptr < ' ' || *ptr == 0x7f)
+           {
+             ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad name value \"%s\" - bad control character (PWG 5100.14 section 8.1)."), attr->name, attr->values[i].string.text);
+             return (0);
+           }
+           else
+           {
+             ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad name value \"%s\" - bad UTF-8 sequence (RFC 8011 section 5.1.3)."), attr->name, attr->values[i].string.text);
+             return (0);
+           }
+          }
 
          if ((ptr - attr->values[i].string.text) > (IPP_MAX_NAME - 1))
          {
-           ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
-                         _("\"%s\": Bad name value \"%s\" - bad length %d "
-                           "(RFC 8011 section 5.1.3)."), attr->name,
-                         attr->values[i].string.text,
-                         (int)(ptr - attr->values[i].string.text));
+           ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad name value \"%s\" - bad length %d (RFC 8011 section 5.1.3)."), attr->name, attr->values[i].string.text, (int)(ptr - attr->values[i].string.text));
            return (0);
          }
        }
@@ -5182,26 +5027,21 @@ ippValidateAttribute(
         for (i = 0; i < attr->num_values; i ++)
        {
          for (ptr = attr->values[i].string.text; *ptr; ptr ++)
+         {
            if (!isalnum(*ptr & 255) && *ptr != '-' && *ptr != '.' &&
                *ptr != '_')
              break;
+         }
 
          if (*ptr || ptr == attr->values[i].string.text)
          {
-           ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
-                         _("\"%s\": Bad keyword value \"%s\" - invalid "
-                           "character (RFC 8011 section 5.1.4)."),
-                         attr->name, attr->values[i].string.text);
+           ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad keyword value \"%s\" - invalid character (RFC 8011 section 5.1.4)."), attr->name, attr->values[i].string.text);
            return (0);
          }
 
          if ((ptr - attr->values[i].string.text) > (IPP_MAX_KEYWORD - 1))
          {
-           ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
-                         _("\"%s\": Bad keyword value \"%s\" - bad "
-                           "length %d (RFC 8011 section 5.1.4)."),
-                         attr->name, attr->values[i].string.text,
-                         (int)(ptr - attr->values[i].string.text));
+           ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad keyword value \"%s\" - bad length %d (RFC 8011 section 5.1.4)."), attr->name, attr->values[i].string.text, (int)(ptr - attr->values[i].string.text));
            return (0);
          }
        }
@@ -5210,31 +5050,17 @@ ippValidateAttribute(
     case IPP_TAG_URI :
         for (i = 0; i < attr->num_values; i ++)
        {
-         uri_status = httpSeparateURI(HTTP_URI_CODING_ALL,
-                                      attr->values[i].string.text,
-                                      scheme, sizeof(scheme),
-                                      userpass, sizeof(userpass),
-                                      hostname, sizeof(hostname),
-                                      &port, resource, sizeof(resource));
+         uri_status = httpSeparateURI(HTTP_URI_CODING_ALL, attr->values[i].string.text, scheme, sizeof(scheme), userpass, sizeof(userpass), hostname, sizeof(hostname), &port, resource, sizeof(resource));
 
          if (uri_status < HTTP_URI_STATUS_OK)
          {
-           ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
-                         _("\"%s\": Bad URI value \"%s\" - %s "
-                           "(RFC 8011 section 5.1.6)."), attr->name,
-                         attr->values[i].string.text,
-                         uri_status_strings[uri_status -
-                                            HTTP_URI_STATUS_OVERFLOW]);
+           ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad URI value \"%s\" - %s (RFC 8011 section 5.1.6)."), attr->name, attr->values[i].string.text, httpURIStatusString(uri_status));
            return (0);
          }
 
          if (strlen(attr->values[i].string.text) > (IPP_MAX_URI - 1))
          {
-           ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
-                         _("\"%s\": Bad URI value \"%s\" - bad length %d "
-                           "(RFC 8011 section 5.1.6)."), attr->name,
-                         attr->values[i].string.text,
-                         (int)strlen(attr->values[i].string.text));
+           ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad URI value \"%s\" - bad length %d (RFC 8011 section 5.1.6)."), attr->name, attr->values[i].string.text, (int)strlen(attr->values[i].string.text));
          }
        }
         break;
@@ -5246,27 +5072,22 @@ ippValidateAttribute(
          if (islower(*ptr & 255))
          {
            for (ptr ++; *ptr; ptr ++)
+           {
              if (!islower(*ptr & 255) && !isdigit(*ptr & 255) &&
                  *ptr != '+' && *ptr != '-' && *ptr != '.')
                 break;
+           }
          }
 
          if (*ptr || ptr == attr->values[i].string.text)
          {
-           ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
-                         _("\"%s\": Bad uriScheme value \"%s\" - bad "
-                           "characters (RFC 8011 section 5.1.7)."),
-                         attr->name, attr->values[i].string.text);
+           ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad uriScheme value \"%s\" - bad characters (RFC 8011 section 5.1.7)."), attr->name, attr->values[i].string.text);
            return (0);
          }
 
          if ((ptr - attr->values[i].string.text) > (IPP_MAX_URISCHEME - 1))
          {
-           ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
-                         _("\"%s\": Bad uriScheme value \"%s\" - bad "
-                           "length %d (RFC 8011 section 5.1.7)."),
-                         attr->name, attr->values[i].string.text,
-                         (int)(ptr - attr->values[i].string.text));
+           ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad uriScheme value \"%s\" - bad length %d (RFC 8011 section 5.1.7)."), attr->name, attr->values[i].string.text, (int)(ptr - attr->values[i].string.text));
            return (0);
          }
        }
@@ -5276,26 +5097,21 @@ ippValidateAttribute(
         for (i = 0; i < attr->num_values; i ++)
        {
          for (ptr = attr->values[i].string.text; *ptr; ptr ++)
+         {
            if (!isprint(*ptr & 255) || isupper(*ptr & 255) ||
                isspace(*ptr & 255))
              break;
+         }
 
          if (*ptr || ptr == attr->values[i].string.text)
          {
-           ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
-                         _("\"%s\": Bad charset value \"%s\" - bad "
-                           "characters (RFC 8011 section 5.1.8)."),
-                         attr->name, attr->values[i].string.text);
+           ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad charset value \"%s\" - bad characters (RFC 8011 section 5.1.8)."), attr->name, attr->values[i].string.text);
            return (0);
          }
 
          if ((ptr - attr->values[i].string.text) > (IPP_MAX_CHARSET - 1))
          {
-           ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
-                         _("\"%s\": Bad charset value \"%s\" - bad "
-                           "length %d (RFC 8011 section 5.1.8)."),
-                         attr->name, attr->values[i].string.text,
-                         (int)(ptr - attr->values[i].string.text));
+           ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad charset value \"%s\" - bad length %d (RFC 8011 section 5.1.8)."), attr->name, attr->values[i].string.text, (int)(ptr - attr->values[i].string.text));
            return (0);
          }
        }
@@ -5327,9 +5143,7 @@ ippValidateAttribute(
           char temp[256];              /* Temporary error string */
 
           regerror(i, &re, temp, sizeof(temp));
-         ipp_set_error(IPP_STATUS_ERROR_INTERNAL,
-                       _("Unable to compile naturalLanguage regular "
-                         "expression: %s."), temp);
+         ipp_set_error(IPP_STATUS_ERROR_INTERNAL, _("Unable to compile naturalLanguage regular expression: %s."), temp);
          return (0);
         }
 
@@ -5337,21 +5151,14 @@ ippValidateAttribute(
        {
          if (regexec(&re, attr->values[i].string.text, 0, NULL, 0))
          {
-           ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
-                         _("\"%s\": Bad naturalLanguage value \"%s\" - bad "
-                           "characters (RFC 8011 section 5.1.9)."),
-                         attr->name, attr->values[i].string.text);
+           ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad naturalLanguage value \"%s\" - bad characters (RFC 8011 section 5.1.9)."), attr->name, attr->values[i].string.text);
            regfree(&re);
            return (0);
          }
 
          if (strlen(attr->values[i].string.text) > (IPP_MAX_LANGUAGE - 1))
          {
-           ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
-                         _("\"%s\": Bad naturalLanguage value \"%s\" - bad "
-                           "length %d (RFC 8011 section 5.1.9)."),
-                         attr->name, attr->values[i].string.text,
-                         (int)strlen(attr->values[i].string.text));
+           ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad naturalLanguage value \"%s\" - bad length %d (RFC 8011 section 5.1.9)."), attr->name, attr->values[i].string.text, (int)strlen(attr->values[i].string.text));
            regfree(&re);
            return (0);
          }
@@ -5381,9 +5188,7 @@ ippValidateAttribute(
           char temp[256];              /* Temporary error string */
 
           regerror(i, &re, temp, sizeof(temp));
-         ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
-                       _("Unable to compile mimeMediaType regular "
-                         "expression: %s."), temp);
+         ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("Unable to compile mimeMediaType regular expression: %s."), temp);
          return (0);
         }
 
@@ -5391,21 +5196,14 @@ ippValidateAttribute(
        {
          if (regexec(&re, attr->values[i].string.text, 0, NULL, 0))
          {
-           ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
-                         _("\"%s\": Bad mimeMediaType value \"%s\" - bad "
-                           "characters (RFC 8011 section 5.1.10)."),
-                         attr->name, attr->values[i].string.text);
+           ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad mimeMediaType value \"%s\" - bad characters (RFC 8011 section 5.1.10)."), attr->name, attr->values[i].string.text);
            regfree(&re);
            return (0);
          }
 
          if (strlen(attr->values[i].string.text) > (IPP_MAX_MIMETYPE - 1))
          {
-           ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
-                         _("\"%s\": Bad mimeMediaType value \"%s\" - bad "
-                           "length %d (RFC 8011 section 5.1.10)."),
-                         attr->name, attr->values[i].string.text,
-                         (int)strlen(attr->values[i].string.text));
+           ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad mimeMediaType value \"%s\" - bad length %d (RFC 8011 section 5.1.10)."), attr->name, attr->values[i].string.text, (int)strlen(attr->values[i].string.text));
            regfree(&re);
            return (0);
          }
@@ -6502,6 +6300,7 @@ ipp_free_values(ipp_attribute_t *attr,    /* I - Attribute to free values from */
          }
          break;
 
+      case IPP_TAG_UNSUPPORTED_VALUE :
       case IPP_TAG_DEFAULT :
       case IPP_TAG_UNKNOWN :
       case IPP_TAG_NOVALUE :
@@ -6843,14 +6642,14 @@ ipp_read_http(http_t      *http,        /* I - Client connection */
 
     if ((bytes = httpRead2(http, (char *)buffer, length - (size_t)tbytes)) < 0)
     {
-#ifdef WIN32
+#ifdef _WIN32
       break;
 #else
       if (errno != EAGAIN && errno != EINTR)
        break;
 
       bytes = 0;
-#endif /* WIN32 */
+#endif /* _WIN32 */
     }
     else if (bytes == 0)
       break;
@@ -6878,11 +6677,11 @@ ipp_read_file(int         *fd,          /* I - File descriptor */
               ipp_uchar_t *buffer,     /* O - Read buffer */
              size_t      length)       /* I - Number of bytes to read */
 {
-#ifdef WIN32
+#ifdef _WIN32
   return ((ssize_t)read(*fd, buffer, (unsigned)length));
 #else
   return (read(*fd, buffer, length));
-#endif /* WIN32 */
+#endif /* _WIN32 */
 }
 
 
@@ -6981,7 +6780,9 @@ ipp_set_value(ipp_t           *ipp,       /* IO - IPP message */
     * Reset pointers in the list...
     */
 
-    DEBUG_printf(("4debug_free: %p %s %s%s (%d)", (void *)*attr, (*attr)->name, (*attr)->num_values > 1 ? "1setOf " : "", ippTagString((*attr)->value_tag), (*attr)->num_values));
+#ifndef __clang_analyzer__
+    DEBUG_printf(("4debug_free: %p %s", (void *)*attr, temp->name));
+#endif /* !__clang_analyzer__ */
     DEBUG_printf(("4debug_alloc: %p %s %s%s (%d)", (void *)temp, temp->name, temp->num_values > 1 ? "1setOf " : "", ippTagString(temp->value_tag), temp->num_values));
 
     if (ipp->current == *attr && ipp->prev)
@@ -7050,9 +6851,9 @@ ipp_write_file(int         *fd,           /* I - File descriptor */
                ipp_uchar_t *buffer,    /* I - Data to write */
                size_t      length)     /* I - Number of bytes to write */
 {
-#ifdef WIN32
+#ifdef _WIN32
   return ((ssize_t)write(*fd, buffer, (unsigned)length));
 #else
   return (write(*fd, buffer, length));
-#endif /* WIN32 */
+#endif /* _WIN32 */
 }