From: Michael R Sweet Date: Thu, 10 Jan 2019 16:53:04 +0000 (-0500) Subject: Allow ippSetXxx from no-value or unknown to the corresponding type. X-Git-Tag: v2.3b8~162 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d7cd12f0090fcccb788ebc60bd5c5c1c6e25db48;p=thirdparty%2Fcups.git Allow ippSetXxx from no-value or unknown to the corresponding type. --- diff --git a/cups/ipp.c b/cups/ipp.c index d96f774048..cc720d2220 100644 --- a/cups/ipp.c +++ b/cups/ipp.c @@ -1,7 +1,7 @@ /* * Internet Printing Protocol functions for CUPS. * - * Copyright © 2007-2018 by Apple Inc. + * Copyright © 2007-2019 by Apple Inc. * Copyright © 1997-2007 by Easy Software Products, all rights reserved. * * Licensed under Apache License v2.0. See the file "LICENSE" for more @@ -3749,8 +3749,7 @@ ippSetDate(ipp_t *ipp, /* I - IPP message */ * Range check input... */ - if (!ipp || !attr || !*attr || (*attr)->value_tag != IPP_TAG_DATE || - element < 0 || element > (*attr)->num_values || !datevalue) + if (!ipp || !attr || !*attr || ((*attr)->value_tag != IPP_TAG_DATE && (*attr)->value_tag != IPP_TAG_NOVALUE && (*attr)->value_tag != IPP_TAG_UNKNOWN) || element < 0 || element > (*attr)->num_values || !datevalue) return (0); /* @@ -3833,9 +3832,7 @@ ippSetInteger(ipp_t *ipp, /* I - IPP message */ * Range check input... */ - if (!ipp || !attr || !*attr || - ((*attr)->value_tag != IPP_TAG_INTEGER && (*attr)->value_tag != IPP_TAG_ENUM) || - element < 0 || element > (*attr)->num_values) + if (!ipp || !attr || !*attr || ((*attr)->value_tag != IPP_TAG_INTEGER && (*attr)->value_tag != IPP_TAG_ENUM && (*attr)->value_tag != IPP_TAG_NOVALUE && (*attr)->value_tag != IPP_TAG_UNKNOWN) || element < 0 || element > (*attr)->num_values) return (0); /* @@ -3843,7 +3840,12 @@ ippSetInteger(ipp_t *ipp, /* I - IPP message */ */ if ((value = ipp_set_value(ipp, attr, element)) != NULL) + { + if ((*attr)->value_tag != IPP_TAG_ENUM) + (*attr)->value_tag = IPP_TAG_INTEGER; + value->integer = intvalue; + } return (value != NULL); } @@ -3920,9 +3922,7 @@ ippSetOctetString( * Range check input... */ - if (!ipp || !attr || !*attr || (*attr)->value_tag != IPP_TAG_STRING || - element < 0 || element > (*attr)->num_values || - datalen < 0 || datalen > IPP_MAX_LENGTH) + if (!ipp || !attr || !*attr || ((*attr)->value_tag != IPP_TAG_STRING && (*attr)->value_tag != IPP_TAG_NOVALUE && (*attr)->value_tag != IPP_TAG_UNKNOWN) || element < 0 || element > (*attr)->num_values || datalen < 0 || datalen > IPP_MAX_LENGTH) return (0); /* @@ -3946,6 +3946,8 @@ ippSetOctetString( * Copy the data... */ + (*attr)->value_tag = IPP_TAG_STRING; + if (value->unknown.data) { /* @@ -4037,8 +4039,7 @@ ippSetRange(ipp_t *ipp, /* I - IPP message */ * Range check input... */ - if (!ipp || !attr || !*attr || (*attr)->value_tag != IPP_TAG_RANGE || - element < 0 || element > (*attr)->num_values || lowervalue > uppervalue) + if (!ipp || !attr || !*attr || ((*attr)->value_tag != IPP_TAG_RANGE && (*attr)->value_tag != IPP_TAG_NOVALUE && (*attr)->value_tag != IPP_TAG_UNKNOWN) || element < 0 || element > (*attr)->num_values || lowervalue > uppervalue) return (0); /* @@ -4047,6 +4048,7 @@ ippSetRange(ipp_t *ipp, /* I - IPP message */ if ((value = ipp_set_value(ipp, attr, element)) != NULL) { + (*attr)->value_tag = IPP_TAG_RANGE; value->range.lower = lowervalue; value->range.upper = uppervalue; } @@ -4119,9 +4121,7 @@ ippSetResolution( * Range check input... */ - if (!ipp || !attr || !*attr || (*attr)->value_tag != IPP_TAG_RESOLUTION || - element < 0 || element > (*attr)->num_values || xresvalue <= 0 || yresvalue <= 0 || - unitsvalue < IPP_RES_PER_INCH || unitsvalue > IPP_RES_PER_CM) + if (!ipp || !attr || !*attr || ((*attr)->value_tag != IPP_TAG_RESOLUTION && (*attr)->value_tag != IPP_TAG_NOVALUE && (*attr)->value_tag != IPP_TAG_UNKNOWN) || element < 0 || element > (*attr)->num_values || xresvalue <= 0 || yresvalue <= 0 || unitsvalue < IPP_RES_PER_INCH || unitsvalue > IPP_RES_PER_CM) return (0); /* @@ -4130,6 +4130,7 @@ ippSetResolution( if ((value = ipp_set_value(ipp, attr, element)) != NULL) { + (*attr)->value_tag = IPP_TAG_RESOLUTION; value->resolution.units = unitsvalue; value->resolution.xres = xresvalue; value->resolution.yres = yresvalue; @@ -4231,10 +4232,7 @@ ippSetString(ipp_t *ipp, /* I - IPP message */ else value_tag = IPP_TAG_ZERO; - if (!ipp || !attr || !*attr || - (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) + if (!ipp || !attr || !*attr || (value_tag < IPP_TAG_TEXT && value_tag != IPP_TAG_TEXTLANG && value_tag != IPP_TAG_NAMELANG && value_tag != IPP_TAG_NOVALUE && value_tag != IPP_TAG_UNKNOWN) || value_tag > IPP_TAG_MIMETYPE || element < 0 || element > (*attr)->num_values || !strvalue) return (0); /* @@ -4243,6 +4241,9 @@ ippSetString(ipp_t *ipp, /* I - IPP message */ if ((value = ipp_set_value(ipp, attr, element)) != NULL) { + if (value_tag == IPP_TAG_NOVALUE || value_tag == IPP_TAG_UNKNOWN) + (*attr)->value_tag = IPP_TAG_KEYWORD; + if (element > 0) value->string.language = (*attr)->values[0].string.language; @@ -4343,10 +4344,7 @@ ippSetStringfv(ipp_t *ipp, /* I - IPP message */ else value_tag = IPP_TAG_ZERO; - if (!ipp || !attr || !*attr || - (value_tag < IPP_TAG_TEXT && value_tag != IPP_TAG_TEXTLANG && - value_tag != IPP_TAG_NAMELANG) || value_tag > IPP_TAG_MIMETYPE || - !format) + if (!ipp || !attr || !*attr || (value_tag < IPP_TAG_TEXT && value_tag != IPP_TAG_TEXTLANG && value_tag != IPP_TAG_NAMELANG && value_tag != IPP_TAG_NOVALUE && value_tag != IPP_TAG_UNKNOWN) || value_tag > IPP_TAG_MIMETYPE || !format) return (0); /* @@ -4398,6 +4396,8 @@ ippSetStringfv(ipp_t *ipp, /* I - IPP message */ max_bytes = IPP_MAX_CHARSET; break; + case IPP_TAG_NOVALUE : + case IPP_TAG_UNKNOWN : case IPP_TAG_KEYWORD : max_bytes = IPP_MAX_KEYWORD; break;