@@ -290,14 +290,14 @@ PHP_FUNCTION(flock)
290
290
PHP_FUNCTION (get_meta_tags )
291
291
{
292
292
pval * * filename , * * arg2 ;
293
- FILE * fp ;
294
293
int use_include_path = 0 ;
295
- int issock = 0 , socketd = 0 ;
296
- int in_tag = 0 , in_meta_tag = 0 , looking_for_val = 0 , done = 0 , ulc = 0 ;
297
- int num_parts = 0 , lc = 0 ;
298
- int token_len = 0 ;
299
- char * token_data = NULL , * name = NULL , * value = NULL , * temp = NULL ;
294
+ int in_tag = 0 , in_meta_tag = 0 , done = 0 ;
295
+ int looking_for_val = 0 , have_name = 0 , have_content = 0 ;
296
+ int saw_name = 0 , saw_content = 0 ;
297
+ int num_parts = 0 ;
298
+ char * name = NULL , * value = NULL , * temp = NULL ;
300
299
php_meta_tags_token tok , tok_last ;
300
+ php_meta_tags_data md ;
301
301
PLS_FETCH ();
302
302
303
303
/* check args */
@@ -319,9 +319,9 @@ PHP_FUNCTION(get_meta_tags)
319
319
}
320
320
convert_to_string_ex (filename );
321
321
322
- fp = php_fopen_wrapper ((* filename )-> value .str .val ,"rb" , use_include_path |ENFORCE_SAFE_MODE , & issock , & socketd , NULL );
323
- if (!fp && !socketd ) {
324
- if (issock != BAD_URL ) {
322
+ md . fp = php_fopen_wrapper ((* filename )-> value .str .val , "rb" , use_include_path |ENFORCE_SAFE_MODE , & md . issock , & md . socketd , NULL );
323
+ if (!md . fp && !md . socketd ) {
324
+ if (md . issock != BAD_URL ) {
325
325
char * tmp = estrndup (Z_STRVAL_PP (filename ), Z_STRLEN_PP (filename ));
326
326
php_strip_url_passwd (tmp );
327
327
php_error (E_WARNING ,"get_meta_tags(\"%s\") - %s" , tmp , strerror (errno ));
@@ -331,109 +331,133 @@ PHP_FUNCTION(get_meta_tags)
331
331
}
332
332
333
333
if (array_init (return_value )== FAILURE ) {
334
- if (issock ) {
335
- SOCK_FCLOSE (socketd );
334
+ if (md . issock ) {
335
+ SOCK_FCLOSE (md . socketd );
336
336
} else {
337
- fclose (fp );
337
+ fclose (md . fp );
338
338
}
339
339
RETURN_FALSE ;
340
340
}
341
341
342
342
tok_last = TOK_EOF ;
343
343
344
- while (!done && (tok = php_next_meta_token (fp ,socketd ,issock ,& ulc ,& lc ,& token_data ,& token_len )) != TOK_EOF ) {
344
+ md .ulc = 0 ;
345
+ md .token_data = NULL ;
346
+ md .token_len = 0 ;
347
+
348
+ while (!done && (tok = php_next_meta_token (& md )) != TOK_EOF ) {
349
+
345
350
if (tok == TOK_ID ) {
346
351
if (tok_last == TOK_OPENTAG ) {
347
- in_meta_tag = !strcasecmp ("meta" ,token_data );
352
+ in_meta_tag = !strcasecmp ("meta" ,md . token_data );
348
353
} else if (tok_last == TOK_SLASH && in_tag ) {
349
- if (strcasecmp ("head" ,token_data ) == 0 ) {
354
+ if (strcasecmp ("head" , md . token_data ) == 0 ) {
350
355
/* We are done here! */
351
356
done = 1 ;
352
357
}
353
358
} else if (tok_last == TOK_EQUAL && looking_for_val ) {
354
-
355
- if (!num_parts ) {
356
- /* This is a single word attribute */
357
- temp = name = estrndup (token_data ,token_len );
359
+ if (saw_name ) {
360
+ /* Get the NAME attr (Single word attr, non-quoted) */
361
+ temp = name = estrndup (md .token_data ,md .token_len );
358
362
359
363
while (temp && * temp ) {
360
364
if (strchr (PHP_META_UNSAFE , * temp )) {
361
365
* temp = '_' ;
362
366
}
363
367
temp ++ ;
364
368
}
365
- num_parts ++ ;
366
- } else {
369
+
370
+ have_name = 1 ;
371
+ } else if (saw_content ) {
372
+ /* Get the CONTENT attr (Single word attr, non-quoted) */
367
373
if (PG (magic_quotes_runtime )) {
368
- value = php_addslashes (token_data ,0 ,& token_len ,0 );
374
+ value = php_addslashes (md . token_data ,0 ,& md . token_len ,0 );
369
375
} else {
370
- value = estrndup (token_data ,token_len );
376
+ value = estrndup (md . token_data ,md . token_len );
371
377
}
372
378
373
- /* Insert the value into the array */
374
- add_assoc_string (return_value , name , value , 0 );
375
- num_parts = 0 ;
379
+ have_content = 1 ;
376
380
}
381
+
377
382
looking_for_val = 0 ;
378
383
} else {
379
384
if (in_meta_tag ) {
380
- if (strcasecmp ("name" ,token_data ) == 0 || strcasecmp ("content" ,token_data ) == 0 ) {
385
+ if (strcasecmp ("name" , md .token_data ) == 0 ) {
386
+ saw_name = 1 ;
387
+ saw_content = 0 ;
388
+ looking_for_val = 1 ;
389
+ } else if (strcasecmp ("content" , md .token_data ) == 0 ) {
390
+ saw_name = 0 ;
391
+ saw_content = 1 ;
381
392
looking_for_val = 1 ;
382
- } else {
383
- looking_for_val = 0 ;
384
393
}
385
394
}
386
395
}
387
396
} else if (tok == TOK_STRING && tok_last == TOK_EQUAL && looking_for_val ) {
388
- if (!num_parts ) {
389
- /* First, get the name value and store it */
390
- temp = name = estrndup (token_data ,token_len );
397
+ if (saw_name ) {
398
+ /* Get the NAME attr (Quoted single/double) */
399
+ temp = name = estrndup (md .token_data ,md .token_len );
400
+
391
401
while (temp && * temp ) {
392
402
if (strchr (PHP_META_UNSAFE , * temp )) {
393
403
* temp = '_' ;
394
404
}
395
405
temp ++ ;
396
406
}
397
- num_parts ++ ;
398
- } else {
399
- /* Then get the value value and store it, quoting if neccessary */
407
+
408
+ have_name = 1 ;
409
+ } else if (saw_content ) {
410
+ /* Get the CONTENT attr (Single word attr, non-quoted) */
400
411
if (PG (magic_quotes_runtime )) {
401
- value = php_addslashes (token_data ,0 ,& token_len ,0 );
412
+ value = php_addslashes (md . token_data ,0 ,& md . token_len ,0 );
402
413
} else {
403
- value = estrndup (token_data ,token_len );
414
+ value = estrndup (md . token_data ,md . token_len );
404
415
}
405
416
406
- /* Insert the value into the array */
407
- add_assoc_string (return_value , name , value , 0 );
408
- num_parts = 0 ;
417
+ have_content = 1 ;
409
418
}
419
+
410
420
looking_for_val = 0 ;
411
421
} else if (tok == TOK_OPENTAG ) {
412
422
if (looking_for_val ) {
413
423
looking_for_val = 0 ;
424
+ have_name = saw_name = 0 ;
425
+ have_content = saw_content = 0 ;
414
426
}
415
427
in_tag = 1 ;
416
428
} else if (tok == TOK_CLOSETAG ) {
417
- /* We never made it to the value, free the name */
418
- if (num_parts ) {
429
+ if (have_name ) {
430
+ if (have_content ) {
431
+ add_assoc_string (return_value , name , value , 0 );
432
+ } else {
433
+ add_assoc_string (return_value , name , empty_string , 0 );
434
+ }
435
+
419
436
efree (name );
437
+ } else if (have_content ) {
438
+ efree (value );
420
439
}
440
+
441
+ name = value = NULL ;
442
+
421
443
/* Reset all of our flags */
422
444
in_tag = in_meta_tag = looking_for_val = num_parts = 0 ;
445
+ have_name = saw_name = 0 ;
446
+ have_content = saw_content = 0 ;
423
447
}
424
448
425
449
tok_last = tok ;
426
450
427
- if (token_data )
428
- efree (token_data );
451
+ if (md . token_data )
452
+ efree (md . token_data );
429
453
430
- token_data = NULL ;
454
+ md . token_data = NULL ;
431
455
}
432
456
433
- if (issock ) {
434
- SOCK_FCLOSE (socketd );
457
+ if (md . issock ) {
458
+ SOCK_FCLOSE (md . socketd );
435
459
} else {
436
- fclose (fp );
460
+ fclose (md . fp );
437
461
}
438
462
}
439
463
@@ -2367,20 +2391,21 @@ size_t php_fread_all(char **buf, int socket, FILE *fp, int issock) {
2367
2391
2368
2392
/* {{{ php_next_meta_token
2369
2393
Tokenizes an HTML file for get_meta_tags */
2370
- php_meta_tags_token php_next_meta_token (FILE * fp , int socketd , int issock , int * use_last_char , int * last_char , char * * data , int * datalen ) {
2371
- int ch , compliment ;
2394
+ php_meta_tags_token php_next_meta_token (php_meta_tags_data * md )
2395
+ {
2396
+ int ch = 0 , compliment ;
2372
2397
char buff [META_DEF_BUFSIZE + 1 ];
2373
2398
2374
2399
memset ((void * )buff ,0 ,META_DEF_BUFSIZE + 1 );
2375
2400
2376
- while (* use_last_char || (!FP_FEOF (socketd ,fp ,issock ) && (ch = FP_FGETC (socketd ,fp ,issock )))) {
2401
+ while (md -> ulc || (!FP_FEOF (md -> socketd ,md -> fp ,md -> issock ) && (ch = FP_FGETC (md -> socketd ,md -> fp ,md -> issock )))) {
2377
2402
2378
- if (FP_FEOF (socketd ,fp ,issock ))
2403
+ if (FP_FEOF (md -> socketd ,md -> fp ,md -> issock ))
2379
2404
break ;
2380
2405
2381
- if (* use_last_char ) {
2382
- ch = * last_char ;
2383
- * use_last_char = 0 ;
2406
+ if (md -> ulc ) {
2407
+ ch = md -> lc ;
2408
+ md -> ulc = 0 ;
2384
2409
}
2385
2410
2386
2411
switch (ch ) {
@@ -2399,16 +2424,25 @@ php_meta_tags_token php_next_meta_token(FILE *fp, int socketd, int issock, int *
2399
2424
case '\'' :
2400
2425
case '"' :
2401
2426
compliment = ch ;
2402
- * datalen = 0 ;
2403
- while (!FP_FEOF (socketd ,fp ,issock ) && (ch = FP_FGETC (socketd ,fp ,issock )) && ch != compliment ) {
2404
- buff [(* datalen )++ ] = ch ;
2427
+ md -> token_len = 0 ;
2428
+ while (!FP_FEOF (md -> socketd ,md -> fp ,md -> issock ) &&
2429
+ (ch = FP_FGETC (md -> socketd ,md -> fp ,md -> issock )) &&
2430
+ ch != compliment && ch != '<' && ch != '>' ) {
2405
2431
2406
- if (* datalen == META_DEF_BUFSIZE )
2432
+ buff [(md -> token_len )++ ] = ch ;
2433
+
2434
+ if (md -> token_len == META_DEF_BUFSIZE )
2407
2435
break ;
2408
2436
}
2409
2437
2410
- * data = (char * ) emalloc ( * datalen + 1 );
2411
- memcpy (* data ,buff ,* datalen + 1 );
2438
+ if (ch == '<' || ch == '>' ) {
2439
+ /* Was just an apostrohpe */
2440
+ md -> ulc = 1 ;
2441
+ md -> lc = ch ;
2442
+ }
2443
+
2444
+ md -> token_data = (char * ) emalloc (md -> token_len + 1 );
2445
+ memcpy (md -> token_data ,buff ,md -> token_len + 1 );
2412
2446
2413
2447
return TOK_STRING ;
2414
2448
break ;
@@ -2421,26 +2455,26 @@ php_meta_tags_token php_next_meta_token(FILE *fp, int socketd, int issock, int *
2421
2455
break ;
2422
2456
default :
2423
2457
if (isalnum (ch )) {
2424
- * datalen = 0 ;
2425
- buff [(* datalen )++ ] = ch ;
2426
- while (!FP_FEOF (socketd ,fp ,issock ) &&
2427
- (ch = FP_FGETC (socketd ,fp ,issock )) &&
2458
+ md -> token_len = 0 ;
2459
+ buff [(md -> token_len )++ ] = ch ;
2460
+ while (!FP_FEOF (md -> socketd ,md -> fp ,md -> issock ) &&
2461
+ (ch = FP_FGETC (md -> socketd ,md -> fp ,md -> issock )) &&
2428
2462
(isalnum (ch ) || strchr (PHP_META_HTML401_CHARS ,ch ))) {
2429
2463
2430
- buff [(* datalen )++ ] = ch ;
2464
+ buff [(md -> token_len )++ ] = ch ;
2431
2465
2432
- if (* datalen == META_DEF_BUFSIZE )
2466
+ if (md -> token_len == META_DEF_BUFSIZE )
2433
2467
break ;
2434
2468
}
2435
2469
2436
2470
/* This is ugly, but we have to replace ungetc */
2437
2471
if (!isalpha (ch ) && ch != '-' ) {
2438
- * use_last_char = 1 ;
2439
- * last_char = ch ;
2472
+ md -> ulc = 1 ;
2473
+ md -> lc = ch ;
2440
2474
}
2441
2475
2442
- * data = (char * ) emalloc ( * datalen + 1 );
2443
- memcpy (* data ,buff ,* datalen + 1 );
2476
+ md -> token_data = (char * ) emalloc (md -> token_len + 1 );
2477
+ memcpy (md -> token_data ,buff ,md -> token_len + 1 );
2444
2478
2445
2479
return TOK_ID ;
2446
2480
} else {
0 commit comments