From ef2e1a72cf0b6c6307bedd57fcb7074c020ddf4b Mon Sep 17 00:00:00 2001 From: Sean Bright Date: Sun, 11 Feb 2001 02:38:40 +0000 Subject: [PATCH] Fix for bug #4556 # This is pretty much a total rewrite of get_meta_tags using a simple # handwritten tokenizer. It might be overkill, but it works. --- ext/standard/file.c | 218 ++++++++++++++++++++++++++++++-------------- ext/standard/file.h | 16 ++++ 2 files changed, 164 insertions(+), 70 deletions(-) diff --git a/ext/standard/file.c b/ext/standard/file.c index 9ce23971f1..63d14053d9 100644 --- a/ext/standard/file.c +++ b/ext/standard/file.c @@ -260,12 +260,13 @@ PHP_FUNCTION(get_meta_tags) { pval **filename, **arg2; FILE *fp; - char buf[8192]; - char buf_lcase[8192]; int use_include_path = 0; int issock=0, socketd=0; - int len, var_namelen; - char var_name[50],*val=NULL,*tmp,*end,*slashed; + int in_tag=0, in_meta_tag=0, looking_for_val=0, done=0, ulc=0; + int num_parts=0, lc=0; + int token_len=0; + char *token_data=NULL, *name=NULL, *value=NULL, *temp=NULL; + php_meta_tags_token tok, tok_last; PLS_FETCH(); /* check args */ @@ -306,83 +307,78 @@ PHP_FUNCTION(get_meta_tags) } RETURN_FALSE; } - /* Now loop through the file and do the magic quotes thing if needed */ - memset(buf, 0, 8191); - while((FP_FGETS(buf,8191,socketd,fp,issock) != NULL)) { - memcpy(buf_lcase, buf, 8191); - php_strtolower(buf_lcase, 8191); - if (php_memnstr(buf_lcase, "", sizeof("")-1, buf_lcase + 8191)) - break; - if(php_memnstr(buf_lcase, "': + return TOK_CLOSETAG; + break; + case '=': + return TOK_EQUAL; + break; + case '/': + return TOK_SLASH; + break; + case '"': + *datalen = 0; + while (!FP_FEOF(socketd,fp,issock) && (ch = FP_FGETC(socketd,fp,issock)) && ch != '"') { + buff[(*datalen)++] = ch; + + if (*datalen == META_DEF_BUFSIZE) + break; + } + + *data = (char *) emalloc( *datalen + 1 ); + memcpy(*data,buff,*datalen+1); + + return TOK_STRING; + break; + case '\n': + case '\r': + case '\t': + break; + case ' ': + return TOK_SPACE; + break; + default: + if (isalpha(ch)) { + *datalen = 0; + buff[(*datalen)++] = ch; + while (!FP_FEOF(socketd,fp,issock) && (ch = FP_FGETC(socketd,fp,issock)) && (isalpha(ch) || ch == '-')) { + buff[(*datalen)++] = ch; + + if (*datalen == META_DEF_BUFSIZE) + break; + } + + /* This is ugly, but we have to replace ungetc */ + if (!isalpha(ch) && ch != '-') { + *use_last_char = 1; + *last_char = ch; + } + + *data = (char *) emalloc( *datalen + 1 ); + memcpy(*data,buff,*datalen+1); + + return TOK_ID; + } else { + return TOK_OTHER; + } + break; + } + } + + return TOK_EOF; +} + /* * Local variables: * tab-width: 4 diff --git a/ext/standard/file.h b/ext/standard/file.h index d1b58d937c..f52eeec531 100644 --- a/ext/standard/file.h +++ b/ext/standard/file.h @@ -73,6 +73,22 @@ PHPAPI int php_file_le_popen(void); PHPAPI int php_file_le_socket(void); PHPAPI int php_copy_file(char *src, char *dest); +#define META_DEF_BUFSIZE 8192 + +typedef enum _php_meta_tags_token { + TOK_EOF = 0, + TOK_OPENTAG, + TOK_CLOSETAG, + TOK_SLASH, + TOK_EQUAL, + TOK_SPACE, + TOK_ID, + TOK_STRING, + TOK_OTHER +} php_meta_tags_token; + +php_meta_tags_token php_next_meta_token(FILE *, int, int, int *, int *, char **, int *); + typedef struct { int fgetss_state; int pclose_ret; -- 2.40.0