Because an existing project's path contain "]",the authorization configuration don't work.
For example:
the project contain a path name: abc[123]
ths access configuration my be:
[test:/abc[123]/def]
samyang=rw
But It don't work!
I think that may be parse_section_name() in subversion\libsvn_subr\config_file.c cause it.
-------------------------------------------------------------------------
/* Read chars until enounter ']', then skip everything to the end of
* the line. Set *PCH to the character that ended the line (either
* newline or EOF), and set CTX->section to the string of characters
* seen before ']'.
*
* This is meant to be called immediately after reading the '[' that
* starts a section name.
*/
static svn_error_t *
parse_section_name (int *pch, parse_context_t *ctx)
{
svn_error_t *err = SVN_NO_ERROR;
int ch;
svn_stringbuf_setempty (ctx->section);
for (ch = getc (ctx->fd);
ch != EOF && ch != ']' && ch != '\n';
ch = getc (ctx->fd))
{
const char char_from_int = ch;
svn_stringbuf_appendbytes (ctx->section, &char_from_int, 1);
}
if (ch != ']')
{
ch = EOF;
err = svn_error_createf (SVN_ERR_MALFORMED_FILE, NULL,
"%s:%d: Section header must end with ']'",
svn_path_local_style (ctx->file,
ctx->cfg->pool),
ctx->line);
}
else
{
/* Everything from the ']' to the end of the line is ignored. */
ch = skip_to_eoln (ctx->fd);
if (ch != EOF)
++ctx->line;
}
*pch = ch;
return err;
}
My modification as following.
------------------------------------------------------------------------
/* Read chars until encounter last ']', then skip everything to the end of
* the line. Set *PCH to the character that ended the line (either
* newline or EOF), and set CTX->section to the string of characters
* seen before ']'.
*
* This is meant to be called immediately after reading the '[' that
* starts a section name.
*/
static svn_error_t *
parse_section_name (int *pch, parse_context_t *ctx)
{
svn_error_t *err = SVN_NO_ERROR;
int ch;
int counter = 0;
apr_size_t pos = 0;
svn_stringbuf_setempty (ctx->section);
for (ch = getc (ctx->fd);
ch != EOF && ch != '\n';
ch = getc (ctx->fd))
{
const char char_from_int = ch;
svn_stringbuf_appendbytes (ctx->section, &char_from_int, 1);
if (']' == ch)
{
counter ++;
}
}
if (!counter)
{
ch = EOF;
err = svn_error_createf (SVN_ERR_MALFORMED_FILE, NULL,
"%s:%d: Section header must end with ']'",
svn_path_local_style (ctx->file,
ctx->cfg->pool),
ctx->line);
}
else
{
/* Everything from the last ']' to the end of the line is ignored. */
ch = skip_to_eoln (ctx->fd);
if (ch != EOF)
++ctx->line;
pos = svn_stringbuf_find_char_backward(ctx->section, ']');
ctx->section->data[pos] = '\0'; //risk changing svn_stringbuf struct's values.
ctx->section->len = pos; //A better way to new a svn_stringbuf's function to do it.
}
*pch = ch;
return err;
}
Received on Tue Jun 27 14:37:33 2006