From 6daa9f4e4eecb8efb60879a5c98135aa0c4d4081 Mon Sep 17 00:00:00 2001 From: "Andrew G. Morgan" Date: Sun, 26 May 2002 23:58:23 +0000 Subject: [PATCH] Relevant BUGIDs: 517064 Purpose of commit: feature Commit summary: --------------- document old feature and add '\]' parsing to make it a better feature. The feature is that we can accept spaces in module arguments by enclosing the whole argument inside square brackets. For example a module argument like this: "[hello [you\], this is me]" will be parsed as "hello [you], this is me" Not very interesting, but you get the idea. Thanks to Russell Kliese for requesting this. --- CHANGELOG | 3 +++ doc/pam_source.sgml | 24 ++++++++++++++++++++++-- libpam/pam_misc.c | 16 ++++++++++++++-- 3 files changed, 39 insertions(+), 4 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 055f2b7b..dd759764 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -55,6 +55,9 @@ bug report - outstanding bugs are listed here: 0.76: please submit patches for this section with actual code/doc patches! +* '[...]' parsing: document it and also fix it to support '\]' escape + sequence. Feature request from Russell Kliese (Bug 517064 - + agmorgan). * pam_rootok: compilation warning noted by Tony den Haan wrt no prototype for strcmp() (Bug 557322 - agmorgan). * documentation: (a few of mine in passing) and app documentation diff --git a/doc/pam_source.sgml b/doc/pam_source.sgml index 92295126..7ed1e131 100644 --- a/doc/pam_source.sgml +++ b/doc/pam_source.sgml @@ -46,7 +46,7 @@ DAMAGE. The Linux-PAM System Administrators' Guide <author>Andrew G. Morgan, <tt>morgan@kernel.org</tt> -<date>DRAFT v0.76 2002/05/09 +<date>DRAFT v0.76 2002/05/26 <abstract> This manual documents what a system-administrator needs to know about the <bf>Linux-PAM</bf> library. It covers the correct syntax of the @@ -366,7 +366,7 @@ A general configuration line of the <tt>/etc/pam.conf</tt> file has the following form: <tscreen> <verb> -service-name module-type control-flag module-path arguments +service-name module-type control-flag module-path args </verb> </tscreen> Below, we explain the meaning of each of these tokens. The second (and @@ -575,6 +575,26 @@ encountering an invalid argument, the module is required to write an error to <tt/syslog(3)/. For a list of <em/generic/ options see the next section. +Note, if you wish to include spaces in an argument, you should +surround that argument with square brackets. For example: +<tscreen> +<verb> +squid auth required pam_mysql.so user=passwd_query passwd=mada \ + db=eminence [query=select user_name from internet_service where \ + user_name='%u' and password=PASSWORD('%p') and \ + service='web_proxy'] +</verb> +</tscreen> +Note, when using this convention, you can include `<tt/[/' characters +inside the string, and if you wish to include a `<tt/]/' character +inside the string that will survive the argument parsing, you should +use `<tt/\[/'. In other words: +<tscreen> +<verb> +[..[..\]..] --> ..[..].. +</verb> +</tscreen> + </descrip> <p> diff --git a/libpam/pam_misc.c b/libpam/pam_misc.c index 2d93a946..bd4ed958 100644 --- a/libpam/pam_misc.c +++ b/libpam/pam_misc.c @@ -43,7 +43,7 @@ char *_pam_StrTok(char *from, const char *format, char **next) for (i=1; i<256; table[i++] = '\0'); for (i=0; format[i] ; table[(int)format[i++]] = 'y'); - /* look for first non-blank char */ + /* look for first non-format char */ while (*from && table[(int)*from]) { ++from; } @@ -53,10 +53,22 @@ char *_pam_StrTok(char *from, const char *format, char **next) * special case, "[...]" is considered to be a single * object. Note, however, if one of the format[] chars is * '[' this single string will not be read correctly. + * Note, any '[' inside the outer "[...]" pair will survive. + * Note, the first ']' will terminate this string, but + * that "\]" will get compressed into "]". That is: + * + * "[..[..\]..]..." --> "..[..].." */ - for (end=++from; *end && *end != ']'; ++end) { + char *to; + for (to=end=++from; *end && *end != ']'; ++to, ++end) { if (*end == '\\' && end[1] == ']') ++end; + if (to != end) { + *to = *end; + } + } + if (to != end) { + *to = '\0'; } /* note, this string is stripped of its edges: "..." is what remains */ -- 2.40.0