From: Michael R Sweet Date: Thu, 10 Jan 2019 16:54:15 +0000 (-0500) Subject: Allow ippSetXxx from no-value and unknown to corresponding type. X-Git-Tag: v2.2.11~29 X-Git-Url: http://git.ipfire.org/?p=thirdparty%2Fcups.git;a=commitdiff_plain;h=21cbc2f2923961c764e3e1ff2745128343f0d76f Allow ippSetXxx from no-value and unknown to corresponding type. --- diff --git a/cups/ipp.c b/cups/ipp.c index 2c09f2703..fb3413981 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. * * These coded instructions, statements, and computer programs are the @@ -3752,8 +3752,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); /* @@ -3836,9 +3835,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); /* @@ -3846,7 +3843,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); } @@ -3923,9 +3925,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); /* @@ -3949,6 +3949,8 @@ ippSetOctetString( * Copy the data... */ + (*attr)->value_tag = IPP_TAG_STRING; + if (value->unknown.data) { /* @@ -4040,8 +4042,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); /* @@ -4050,6 +4051,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; } @@ -4122,9 +4124,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); /* @@ -4133,6 +4133,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; @@ -4234,10 +4235,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); /* @@ -4246,6 +4244,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; @@ -4346,10 +4347,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); /* @@ -4401,6 +4399,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;