Browse Source

Cleanup & optimize php_filter_encode_url()

experimental/5.2-WITH_DRCP
Ilia Alshanetsky 20 years ago
parent
commit
b9531d5b07
  1. 50
      ext/filter/sanitizing_filters.c

50
ext/filter/sanitizing_filters.c

@ -64,27 +64,47 @@ static const unsigned char hexchars[] = "0123456789ABCDEF";
#define DEFAULT_URL_ENCODE LOWALPHA HIALPHA DIGIT "-._"
static void php_filter_encode_url(zval *value, const char* chars, int high, int low, int encode_nul)
static void php_filter_encode_url(zval *value, const unsigned char* chars, const int char_len, int high, int low, int encode_nul)
{
register int x, y;
unsigned char *str;
int len = Z_STRLEN_P(value);
char *s = Z_STRVAL_P(value);
unsigned char *str, *p;
unsigned char tmp[256];
unsigned char *s = (unsigned char *)chars;
unsigned char *e = s + char_len;
memset(tmp, 1, sizeof(tmp)-1);
str = (unsigned char *) safe_emalloc(3, len, 1);
for (x = 0, y = 0; len--; x++, y++) {
str[y] = (unsigned char) s[x];
while (s < e) {
tmp[*s++] = 0;
}
/* XXX: This is not needed since these chars in the allowed list never include the high/low/null value
if (encode_nul) {
tmp[0] = 1;
}
if (high) {
memset(tmp + 127, 1, sizeof(tmp) - 127);
}
if (low) {
memset(tmp, 1, 32);
}
*/
p = str = (unsigned char *) safe_emalloc(3, Z_STRLEN_P(value), 1);
s = (unsigned char *)Z_STRVAL_P(value);
e = s + Z_STRLEN_P(value);
if ((strlen(chars) && !strchr(chars, str[y])) || (high && str[y] > 127) || (low && str[y] < 32) || (encode_nul && str[y] == 0)) {
str[y++] = '%';
str[y++] = hexchars[(unsigned char) s[x] >> 4];
str[y] = hexchars[(unsigned char) s[x] & 15];
while (s < e) {
if (tmp[*s]) {
*p++ = '%';
*p++ = hexchars[(unsigned char) *s >> 4];
*p++ = hexchars[(unsigned char) *s & 15];
} else {
*p++ = *s;
}
s++;
}
str[y] = '\0';
*p = '\0';
efree(Z_STRVAL_P(value));
Z_STRVAL_P(value) = (char *)str;
Z_STRLEN_P(value) = y;
Z_STRLEN_P(value) = p - str;
}
static void php_filter_strip(zval *value, long flags)
@ -196,7 +216,7 @@ void php_filter_encoded(PHP_INPUT_FILTER_PARAM_DECL)
/* apply strip_high and strip_low filters */
php_filter_strip(value, flags);
/* urlencode */
php_filter_encode_url(value, DEFAULT_URL_ENCODE, flags & FILTER_FLAG_ENCODE_HIGH, flags & FILTER_FLAG_ENCODE_LOW, 1);
php_filter_encode_url(value, (unsigned char *)DEFAULT_URL_ENCODE, sizeof(DEFAULT_URL_ENCODE)-1, flags & FILTER_FLAG_ENCODE_HIGH, flags & FILTER_FLAG_ENCODE_LOW, 1);
}
/* }}} */

Loading…
Cancel
Save