X-Git-Url: http://git.ipfire.org/?p=thirdparty%2Fcups.git;a=blobdiff_plain;f=cgi-bin%2Fvar.c;h=fb9d051c0ba7e1e83fb4998e16b659ed478ea727;hp=12f3c83448779e26945b01f5d76376f7d1e406f4;hb=eda46e3aac94d42e4199d95befe99ff83afb098f;hpb=b9ff93ce913ff633a3f667317e5a81fa7fe0d5d3 diff --git a/cgi-bin/var.c b/cgi-bin/var.c index 12f3c8344..fb9d051c0 100644 --- a/cgi-bin/var.c +++ b/cgi-bin/var.c @@ -1,10 +1,11 @@ /* * CGI form variable and array functions for CUPS. * - * Copyright 2007-2015 by Apple Inc. - * Copyright 1997-2005 by Easy Software Products. + * Copyright © 2007-2019 by Apple Inc. + * Copyright © 1997-2005 by Easy Software Products. * - * Licensed under Apache License v2.0. See the file "LICENSE" for more information. + * Licensed under Apache License v2.0. See the file "LICENSE" for more + * information. */ /* @@ -29,10 +30,10 @@ typedef struct /**** Form variable structure ****/ { - const char *name; /* Name of variable */ + char *name; /* Name of variable */ int nvalues, /* Number of values */ avalues; /* Number of values allocated */ - const char **values; /* Value(s) of variable */ + char **values; /* Value(s) of variable */ } _cgi_var_t; @@ -113,7 +114,12 @@ cgiCheckVariables(const char *names) /* I - Variables to look for */ return (0); if (*val == '\0') + { + free((void *)val); return (0); /* Can't be blank, either! */ + } + + free((void *)val); } return (1); @@ -135,10 +141,10 @@ cgiClearVariables(void) for (v = form_vars, i = form_count; i > 0; v ++, i --) { - _cupsStrFree(v->name); + free(v->name); for (j = 0; j < v->nvalues; j ++) if (v->values[j]) - _cupsStrFree(v->values[j]); + free(v->values[j]); } form_count = 0; @@ -151,7 +157,7 @@ cgiClearVariables(void) * 'cgiGetArray()' - Get an element from a form array. */ -const char * /* O - Element value or NULL */ +char * /* O - Element value or NULL */ cgiGetArray(const char *name, /* I - Name of array variable */ int element) /* I - Element number (0 to N) */ { @@ -164,7 +170,10 @@ cgiGetArray(const char *name, /* I - Name of array variable */ if (element < 0 || element >= var->nvalues) return (NULL); - return (_cupsStrRetain(var->values[element])); + if (var->values[element] == NULL) + return (NULL); + + return (strdup(var->values[element])); } @@ -214,7 +223,7 @@ cgiGetSize(const char *name) /* I - Name of variable */ * array of values, returns the last element. */ -const char * /* O - Value of variable */ +char * /* O - Value of variable */ cgiGetVariable(const char *name) /* I - Name of variable */ { const _cgi_var_t *var; /* Returned variable */ @@ -222,7 +231,7 @@ cgiGetVariable(const char *name) /* I - Name of variable */ var = cgi_find_variable(name); - return ((var == NULL) ? NULL : _cupsStrRetain(var->values[var->nvalues - 1])); + return ((var == NULL) ? NULL : strdup(var->values[var->nvalues - 1])); } @@ -312,11 +321,18 @@ cgiInitialize(void) else fputs("DEBUG: " CUPS_SID " form variable is not present.\n", stderr); + free((void *)cups_sid_form); + cgiClearVariables(); + return (0); } else + { + free((void *)cups_sid_form); + return (1); + } } else return (0); @@ -370,10 +386,9 @@ cgiSetArray(const char *name, /* I - Name of variable */ { if (element >= var->avalues) { - const char **temp; /* Temporary pointer */ + char **temp; /* Temporary pointer */ - temp = (const char **)realloc((void *)(var->values), - sizeof(char *) * (size_t)(element + 16)); + temp = (char **)realloc((void *)(var->values), sizeof(char *) * (size_t)(element + 16)); if (!temp) return; @@ -389,9 +404,9 @@ cgiSetArray(const char *name, /* I - Name of variable */ var->nvalues = element + 1; } else if (var->values[element]) - _cupsStrFree((char *)var->values[element]); + free((char *)var->values[element]); - var->values[element] = _cupsStrAlloc(value); + var->values[element] = strdup(value); } } @@ -448,10 +463,9 @@ cgiSetSize(const char *name, /* I - Name of variable */ if (size >= var->avalues) { - const char **temp; /* Temporary pointer */ + char **temp; /* Temporary pointer */ - temp = (const char **)realloc((void *)(var->values), - sizeof(char *) * (size_t)(size + 16)); + temp = (char **)realloc((void *)(var->values), sizeof(char *) * (size_t)(size + 16)); if (!temp) return; @@ -468,7 +482,7 @@ cgiSetSize(const char *name, /* I - Name of variable */ { for (i = size; i < var->nvalues; i ++) if (var->values[i]) - _cupsStrFree((void *)(var->values[i])); + free((void *)(var->values[i])); } var->nvalues = size; @@ -503,9 +517,9 @@ cgiSetVariable(const char *name, /* I - Name of variable */ { for (i = 0; i < var->nvalues; i ++) if (var->values[i]) - _cupsStrFree((char *)var->values[i]); + free((char *)var->values[i]); - var->values[0] = _cupsStrAlloc(value); + var->values[0] = strdup(value); var->nvalues = 1; } } @@ -548,10 +562,10 @@ cgi_add_variable(const char *name, /* I - Variable name */ if ((var->values = calloc((size_t)element + 1, sizeof(char *))) == NULL) return; - var->name = _cupsStrAlloc(name); + var->name = strdup(name); var->nvalues = element + 1; var->avalues = element + 1; - var->values[element] = _cupsStrAlloc(value); + var->values[element] = strdup(value); form_count ++; } @@ -583,7 +597,7 @@ cgi_find_variable(const char *name) /* I - Name of variable */ if (form_count < 1 || name == NULL) return (NULL); - key.name = name; + key.name = (char *)name; return ((_cgi_var_t *)bsearch(&key, form_vars, (size_t)form_count, sizeof(_cgi_var_t), (int (*)(const void *, const void *))cgi_compare_variables)); @@ -870,12 +884,13 @@ cgi_initialize_multipart( if (line[0]) cgiSetArray(name, atoi(ptr) - 1, line); } - else if (cgiGetVariable(name)) + else if ((ptr = cgiGetVariable(name)) != NULL) { /* * Add another element in the array... */ + free(ptr); cgiSetArray(name, cgiGetSize(name), line); } else @@ -1030,7 +1045,8 @@ cgi_initialize_string(const char *data) /* I - Form data string */ char *s, /* Pointer to current form string */ ch, /* Temporary character */ name[255], /* Name of form variable */ - value[65536]; /* Variable value */ + value[65536], /* Variable value */ + *temp; /* Temporary pointer */ /* @@ -1132,8 +1148,11 @@ cgi_initialize_string(const char *data) /* I - Form data string */ if (value[0]) cgiSetArray(name, atoi(s) - 1, value); } - else if (cgiGetVariable(name) != NULL) + else if ((temp = cgiGetVariable(name)) != NULL) + { + free(temp); cgiSetArray(name, cgiGetSize(name), value); + } else cgiSetVariable(name, value); }