1
0
mirror of https://github.com/samba-team/samba.git synced 2025-01-26 10:04:02 +03:00

s3: Make char_flags and base_reverse const arrays

This moves those arrays from dynamic to static, shared memory, removing them
from globals.c.

I did it by dumping the result of init_tables() with dump_data(). Some massage
by an editor macro made it the initializer.
This commit is contained in:
Volker Lendecke 2010-08-24 21:40:25 +02:00
parent 2d81721a3f
commit d3a0ff311e
3 changed files with 178 additions and 74 deletions

View File

@ -57,15 +57,12 @@ const struct mangle_fns *mangle_fns = NULL;
unsigned char *chartest = NULL;
TDB_CONTEXT *tdb_mangled_cache = NULL;
/* these tables are used to provide fast tests for characters */
unsigned char char_flags[256];
/*
this determines how many characters are used from the original filename
in the 8.3 mangled name. A larger value leads to a weaker hash and more collisions.
The largest possible value is 6.
*/
unsigned mangle_prefix = 0;
unsigned char base_reverse[256];
struct msg_state *smbd_msg_state = NULL;
@ -146,9 +143,6 @@ struct memcache *smbd_memcache(void)
void smbd_init_globals(void)
{
ZERO_STRUCT(char_flags);
ZERO_STRUCT(base_reverse);
ZERO_STRUCT(conn_ctx_stack);
ZERO_STRUCT(sec_ctx_stack);

View File

@ -54,15 +54,12 @@ extern const struct mangle_fns *mangle_fns;
extern unsigned char *chartest;
extern TDB_CONTEXT *tdb_mangled_cache;
/* these tables are used to provide fast tests for characters */
extern unsigned char char_flags[256];
/*
this determines how many characters are used from the original filename
in the 8.3 mangled name. A larger value leads to a weaker hash and more collisions.
The largest possible value is 6.
*/
extern unsigned mangle_prefix;
extern unsigned char base_reverse[256];
struct msg_state;
extern struct msg_state *smbd_msg_state;

View File

@ -49,6 +49,19 @@
===============================================================================
*/
/*
* ============================================================================
* Whenever you change anything in the FLAG_ or other fields,
* re-initialize the tables char_flags and base_reverse by running the
* init_tables() routine once and dump its results. To do this, a
* single smbd run with
*
* #define DYNAMIC_MANGLE_TABLES 1
*
* and debug level 10 should be sufficient.
* ============================================================================
*/
#include "includes.h"
#include "smbd/globals.h"
@ -93,6 +106,169 @@ static const char * const reserved_names[] =
{ "AUX", "LOCK$", "CON", "COM1", "COM2", "COM3", "COM4",
"LPT1", "LPT2", "LPT3", "NUL", "PRN", NULL };
#define DYNAMIC_MANGLE_TABLES 0
#if DYNAMIC_MANGLE_TABLES
/* these tables are used to provide fast tests for characters */
static unsigned char char_flags[256];
static unsigned char base_reverse[256];
/* initialise the flags table
we allow only a very restricted set of characters as 'ascii' in this
mangling backend. This isn't a significant problem as modern clients
use the 'long' filenames anyway, and those don't have these
restrictions.
*/
static void init_tables(void)
{
int i;
memset(char_flags, 0, sizeof(char_flags));
for (i=1;i<128;i++) {
if (i <= 0x1f) {
/* Control characters. */
char_flags[i] |= FLAG_ILLEGAL;
}
if ((i >= '0' && i <= '9') ||
(i >= 'a' && i <= 'z') ||
(i >= 'A' && i <= 'Z')) {
char_flags[i] |= (FLAG_ASCII | FLAG_BASECHAR);
}
if (strchr("_-$~", i)) {
char_flags[i] |= FLAG_ASCII;
}
if (strchr("*\\/?<>|\":", i)) {
char_flags[i] |= FLAG_ILLEGAL;
}
if (strchr("*?\"<>", i)) {
char_flags[i] |= FLAG_WILDCARD;
}
}
memset(base_reverse, 0, sizeof(base_reverse));
for (i=0;i<36;i++) {
base_reverse[(unsigned char)base_forward(i)] = i;
}
/* fill in the reserved names flags. These are used as a very
fast filter for finding possible DOS reserved filenames */
for (i=0; reserved_names[i]; i++) {
unsigned char c1, c2, c3, c4;
c1 = (unsigned char)reserved_names[i][0];
c2 = (unsigned char)reserved_names[i][1];
c3 = (unsigned char)reserved_names[i][2];
c4 = (unsigned char)reserved_names[i][3];
char_flags[c1] |= FLAG_POSSIBLE1;
char_flags[c2] |= FLAG_POSSIBLE2;
char_flags[c3] |= FLAG_POSSIBLE3;
char_flags[c4] |= FLAG_POSSIBLE4;
char_flags[tolower_ascii(c1)] |= FLAG_POSSIBLE1;
char_flags[tolower_ascii(c2)] |= FLAG_POSSIBLE2;
char_flags[tolower_ascii(c3)] |= FLAG_POSSIBLE3;
char_flags[tolower_ascii(c4)] |= FLAG_POSSIBLE4;
char_flags[(unsigned char)'.'] |= FLAG_POSSIBLE4;
}
#if 0
DEBUG(10, ("char_flags\n"));
dump_data(10, char_flags, sizeof(char_flags));
DEBUG(10, ("base_reverse\n"));
dump_data(10, base_reverse, sizeof(base_reverse));
#endif
}
#else
/*
* These tables were initialized by a single run of the above
* init_tables() routine, dumping the tables and a simple emacs macro.
*
* Technically we could leave out the 0's at the end of the array
* initializers, but I'll leave it in: less surprise.
*/
static uint8_t char_flags[256] = {
0x80, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04,
0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04,
0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04,
0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04,
0x00, 0x00, 0x0C, 0x00, 0x02, 0x00, 0x00, 0x00,
0x00, 0x00, 0x0C, 0x00, 0x00, 0x02, 0x80, 0x04,
0x03, 0x83, 0x83, 0x83, 0x83, 0x03, 0x03, 0x03,
0x03, 0x03, 0x04, 0x00, 0x0C, 0x00, 0x0C, 0x0C,
0x00, 0x13, 0x03, 0x53, 0x03, 0x03, 0x03, 0x03,
0x03, 0x03, 0x03, 0x83, 0x53, 0x43, 0x53, 0x23,
0x33, 0x03, 0x23, 0x03, 0x43, 0x23, 0x03, 0x03,
0x43, 0x03, 0x03, 0x00, 0x04, 0x00, 0x00, 0x02,
0x00, 0x13, 0x03, 0x53, 0x03, 0x03, 0x03, 0x03,
0x03, 0x03, 0x03, 0x83, 0x53, 0x43, 0x53, 0x23,
0x33, 0x03, 0x23, 0x03, 0x43, 0x23, 0x03, 0x03,
0x43, 0x03, 0x03, 0x00, 0x04, 0x00, 0x02, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
static uint8_t base_reverse[256] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
0x08, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10,
0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20,
0x21, 0x22, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
#endif
/*
hash a string of the specified length. The string does not need to be
null terminated
@ -615,71 +791,6 @@ static bool hash2_name_to_8_3(const char *name,
return True;
}
/* initialise the flags table
we allow only a very restricted set of characters as 'ascii' in this
mangling backend. This isn't a significant problem as modern clients
use the 'long' filenames anyway, and those don't have these
restrictions.
*/
static void init_tables(void)
{
int i;
memset(char_flags, 0, sizeof(char_flags));
for (i=1;i<128;i++) {
if (i <= 0x1f) {
/* Control characters. */
char_flags[i] |= FLAG_ILLEGAL;
}
if ((i >= '0' && i <= '9') ||
(i >= 'a' && i <= 'z') ||
(i >= 'A' && i <= 'Z')) {
char_flags[i] |= (FLAG_ASCII | FLAG_BASECHAR);
}
if (strchr("_-$~", i)) {
char_flags[i] |= FLAG_ASCII;
}
if (strchr("*\\/?<>|\":", i)) {
char_flags[i] |= FLAG_ILLEGAL;
}
if (strchr("*?\"<>", i)) {
char_flags[i] |= FLAG_WILDCARD;
}
}
memset(base_reverse, 0, sizeof(base_reverse));
for (i=0;i<36;i++) {
base_reverse[(unsigned char)base_forward(i)] = i;
}
/* fill in the reserved names flags. These are used as a very
fast filter for finding possible DOS reserved filenames */
for (i=0; reserved_names[i]; i++) {
unsigned char c1, c2, c3, c4;
c1 = (unsigned char)reserved_names[i][0];
c2 = (unsigned char)reserved_names[i][1];
c3 = (unsigned char)reserved_names[i][2];
c4 = (unsigned char)reserved_names[i][3];
char_flags[c1] |= FLAG_POSSIBLE1;
char_flags[c2] |= FLAG_POSSIBLE2;
char_flags[c3] |= FLAG_POSSIBLE3;
char_flags[c4] |= FLAG_POSSIBLE4;
char_flags[tolower_ascii(c1)] |= FLAG_POSSIBLE1;
char_flags[tolower_ascii(c2)] |= FLAG_POSSIBLE2;
char_flags[tolower_ascii(c3)] |= FLAG_POSSIBLE3;
char_flags[tolower_ascii(c4)] |= FLAG_POSSIBLE4;
char_flags[(unsigned char)'.'] |= FLAG_POSSIBLE4;
}
}
/*
the following provides the abstraction layer to make it easier
to drop in an alternative mangling implementation */
@ -704,7 +815,9 @@ const struct mangle_fns *mangle_hash2_init(void)
mangle_prefix = 1;
}
#if DYNAMIC_MANGLE_TABLES
init_tables();
#endif
mangle_reset();
return &mangle_hash2_fns;