From 6ee54c072996fd4cde3d5a53e80918e90f8e29c5 Mon Sep 17 00:00:00 2001 From: msweet Date: Tue, 10 Sep 2013 19:15:36 +0000 Subject: [PATCH] PDF detection in cups needs to be tightened up Add regex() rule support. git-svn-id: svn+ssh://src.apple.com/svn/cups/cups.org/trunk@11272 a1ca3aef-8c08-0410-bb20-df032aa958be --- CHANGES.txt | 4 +++- conf/mime.types | 5 +++-- scheduler/mime.c | 2 +- scheduler/mime.h | 7 +++++-- scheduler/type.c | 53 +++++++++++++++++++++++++++++++++++++++++++++++- 5 files changed, 64 insertions(+), 7 deletions(-) diff --git a/CHANGES.txt b/CHANGES.txt index cde9d92a4..e3c8a1b22 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,5 +1,7 @@ -CHANGES.txt - 2.0b1 - 2013-08-06 +CHANGES.txt - 2.0b1 - 2013-09-10 -------------------------------- CHANGES IN CUPS V2.0b1 + - Added support for regular expression matching in the MIME type rules + () diff --git a/conf/mime.types b/conf/mime.types index 217d75bee..3e07408b9 100644 --- a/conf/mime.types +++ b/conf/mime.types @@ -7,7 +7,7 @@ # VERSIONS OF CUPS. Instead, create a "local.types" file that # reflects your local configuration changes. # -# Copyright 2007-2011 by Apple Inc. +# Copyright 2007-2013 by Apple Inc. # Copyright 1997-2007 by Easy Software Products. # # These coded instructions, statements, and computer programs are the @@ -37,6 +37,7 @@ # 100=default, 200=highest) # printable(offset,length) True if bytes are printable 8-bit chars # (CR, NL, TAB, BS, 32-126, 128-254) +# regex(offset,"regex") True if bytes match regular expression # string(offset,"string") True if bytes are identical to string # istring(offset,"string") True if bytes are identical to # case-insensitive string @@ -70,7 +71,7 @@ # #application/msword doc string(0,) -application/pdf pdf string(0,%PDF) +application/pdf pdf regex(0,^[\\n\\r]*%PDF) application/postscript ai eps ps string(0,%!) string(0,<04>%!) \ contains(0,128,<1B>%-12345X) + \ (contains(0,4096,"LANGUAGE=POSTSCRIPT") \ diff --git a/scheduler/mime.c b/scheduler/mime.c index de3821c96..60272cf8a 100644 --- a/scheduler/mime.c +++ b/scheduler/mime.c @@ -3,7 +3,7 @@ * * MIME database file routines for CUPS. * - * Copyright 2007-2012 by Apple Inc. + * Copyright 2007-2013 by Apple Inc. * Copyright 1997-2006 by Easy Software Products, all rights reserved. * * These coded instructions, statements, and computer programs are the diff --git a/scheduler/mime.h b/scheduler/mime.h index 6feceecc4..3d61d2e1e 100644 --- a/scheduler/mime.h +++ b/scheduler/mime.h @@ -3,7 +3,7 @@ * * MIME type/conversion database definitions for CUPS. * - * Copyright 2007-2011 by Apple Inc. + * Copyright 2007-2013 by Apple Inc. * Copyright 1997-2007 by Easy Software Products, all rights reserved. * * These coded instructions, statements, and computer programs are the @@ -19,6 +19,7 @@ # include # include # include +# include /* @@ -58,7 +59,8 @@ typedef enum MIME_MAGIC_INT, /* Integer/32-bit word matches */ MIME_MAGIC_LOCALE, /* Current locale matches string */ MIME_MAGIC_CONTAINS, /* File contains a string */ - MIME_MAGIC_ISTRING /* Case-insensitive string matches */ + MIME_MAGIC_ISTRING, /* Case-insensitive string matches */ + MIME_MAGIC_REGEX /* Regular expression matches */ } mime_op_t; typedef struct _mime_magic_s /**** MIME Magic Data ****/ @@ -80,6 +82,7 @@ typedef struct _mime_magic_s /**** MIME Magic Data ****/ unsigned char charv; /* Byte value */ unsigned short shortv; /* Short value */ unsigned intv; /* Integer value */ + regex_t rev; /* Regular expression value */ } value; } mime_magic_t; diff --git a/scheduler/type.c b/scheduler/type.c index 7b8743882..c466a257f 100644 --- a/scheduler/type.c +++ b/scheduler/type.c @@ -3,7 +3,7 @@ * * MIME typing routines for CUPS. * - * Copyright 2007-2012 by Apple Inc. + * Copyright 2007-2013 by Apple Inc. * Copyright 1997-2006 by Easy Software Products, all rights reserved. * * These coded instructions, statements, and computer programs are the @@ -425,6 +425,8 @@ mimeAddTypeRule(mime_type_t *mt, /* I - Type to add to */ op = MIME_MAGIC_ASCII; else if (!strcmp(name, "printable")) op = MIME_MAGIC_PRINTABLE; + else if (!strcmp(name, "regex")) + op = MIME_MAGIC_REGEX; else if (!strcmp(name, "string")) op = MIME_MAGIC_STRING; else if (!strcmp(name, "istring")) @@ -524,6 +526,12 @@ mimeAddTypeRule(mime_type_t *mt, /* I - Type to add to */ if (temp->length > MIME_MAX_BUFFER) temp->length = MIME_MAX_BUFFER; break; + case MIME_MAGIC_REGEX : + temp->offset = strtol(value[0], NULL, 0); + temp->length = MIME_MAX_BUFFER; + if (regcomp(&(temp->value.rev), value[1], REG_NOSUB | REG_EXTENDED)) + return (-1); + break; case MIME_MAGIC_STRING : case MIME_MAGIC_ISTRING : temp->offset = strtol(value[0], NULL, 0); @@ -852,6 +860,49 @@ mime_check_rules( result = (n == 0); break; + case MIME_MAGIC_REGEX : + DEBUG_printf(("5mime_check_rules: regex(%d, \"%s\")", rules->offset, + rules->value.stringv)); + + /* + * Load the buffer if necessary... + */ + + if (fb->offset < 0 || rules->offset < fb->offset || + (rules->offset + rules->length) > (fb->offset + fb->length)) + { + /* + * Reload file buffer... + */ + + cupsFileSeek(fb->fp, rules->offset); + fb->length = cupsFileRead(fb->fp, (char *)fb->buffer, + sizeof(fb->buffer)); + fb->offset = rules->offset; + + DEBUG_printf(("5mime_check_rules: loaded %d byte fb->buffer at %d, starts " + "with \"%c%c%c%c\".", + fb->length, fb->offset, fb->buffer[0], fb->buffer[1], + fb->buffer[2], fb->buffer[3])); + } + + /* + * Compare the buffer against the string. If the file is too + * short then don't compare - it can't match... + */ + + { + char temp[MIME_MAX_BUFFER + 1]; + /* Temporary buffer */ + + memcpy(temp, fb->buffer, fb->length); + temp[fb->length] = '\0'; + result = !regexec(&(rules->value.rev), temp, 0, NULL, 0); + } + + DEBUG_printf(("5mime_check_rules: result=%d", result)); + break; + case MIME_MAGIC_STRING : DEBUG_printf(("5mime_check_rules: string(%d, \"%s\")", rules->offset, rules->value.stringv)); -- 2.39.2