summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGELOG3
-rw-r--r--doc/pam_source.sgml24
-rw-r--r--libpam/pam_misc.c16
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.
<title>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 */