Changeset 241 in openpam for trunk/lib


Ignore:
Timestamp:
May 26, 2003, 3:31:28 PM (16 years ago)
Author:
Dag-Erling Smørgrav
Message:

Continue improving the new configuration parser, particularly error
reporting: error messages relating to policy files now include line
numbers, and the parser will warn about invalid facility names.

Also fix an off-by-one bug in the option handling code.

Location:
trunk/lib
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/lib/openpam_configure.c

    r240 r241  
    3232 * SUCH DAMAGE.
    3333 *
    34  * $P4: //depot/projects/openpam/lib/openpam_configure.c#8 $
    35  */
    36 
    37 #include <ctype.h>
     34 * $P4: //depot/projects/openpam/lib/openpam_configure.c#9 $
     35 */
     36
    3837#include <errno.h>
    3938#include <stdio.h>
     
    4544#include "openpam_impl.h"
    4645
     46const char *_pam_facility_name[PAM_NUM_FACILITIES] = {
     47        [PAM_ACCOUNT]           = "account",
     48        [PAM_AUTH]              = "auth",
     49        [PAM_PASSWORD]          = "password",
     50        [PAM_SESSION]           = "session",
     51};
     52
     53const char *_pam_control_flag_name[PAM_NUM_CONTROL_FLAGS] = {
     54        [PAM_BINDING]           = "binding",
     55        [PAM_OPTIONAL]          = "optional",
     56        [PAM_REQUIRED]          = "required",
     57        [PAM_REQUISITE]         = "requisite",
     58        [PAM_SUFFICIENT]        = "sufficient",
     59};
     60
    4761static int openpam_load_chain(pam_chain_t **, const char *, const char *);
    4862
     
    6882
    6983        /* skip current word */
    70         while (*str && !isspace(*str))
     84        while (*str && *str != ' ')
    7185                ++str;
    7286        /* skip whitespace */
    73         while (isspace(*str))
     87        while (*str == ' ')
    7488                ++str;
    7589        return (str);
     
    8599        char *word;
    86100
    87         for (end = str; *end && !isspace(*end); ++end)
     101        for (end = str; *end && *end != ' '; ++end)
    88102                /* nothing */ ;
    89103        if (asprintf(&word, "%.*s", (int)(end - str), str) < 0)
    90104                return (NULL);
    91105        return (word);
     106}
     107
     108/*
     109 * Return the length of the first word in a string.
     110 */
     111static int
     112wordlen(const char *str)
     113{
     114        int i;
     115
     116        for (i = 0; str[i] && str[i] != ' '; ++i)
     117                /* nothing */ ;
     118        return (i);
    92119}
    93120
     
    106133        pam_chain_t *this, **next;
    107134        const char *p, *q;
    108         int count, i, ret;
     135        int count, i, lineno, ret;
    109136        char *line, *name;
    110137        FILE *f;
    111138
    112139        if ((f = fopen(filename, "r")) == NULL) {
    113                 openpam_log(errno == ENOENT ? PAM_LOG_NOTICE : PAM_LOG_ERROR,
     140                openpam_log(errno == ENOENT ? PAM_LOG_DEBUG : PAM_LOG_NOTICE,
    114141                    "%s: %m", filename);
    115142                return (0);
     
    117144        next = chain;
    118145        this = *next = NULL;
    119         count = 0;
    120         while ((line = openpam_readline(f, NULL)) != NULL) {
     146        count = lineno = 0;
     147        while ((line = openpam_readline(f, &lineno, NULL)) != NULL) {
    121148                p = line;
    122149
     
    131158
    132159                /* match facility name */
     160                for (i = 0; i < PAM_NUM_FACILITIES; ++i)
     161                        if (match_word(p, _pam_facility_name[i]))
     162                                break;
     163                if (i == PAM_NUM_FACILITIES) {
     164                        openpam_log(PAM_LOG_NOTICE,
     165                            "%s(%d): invalid facility '%.*s' (ignored)",
     166                            filename, lineno, wordlen(p), p);
     167                }
    133168                if (!match_word(p, facility)) {
    134169                        FREE(line);
     
    142177                        if (*next_word(p) != '\0')
    143178                                openpam_log(PAM_LOG_NOTICE,
    144                                     "%s: garbage at end of 'include' line",
    145                                     filename);
     179                                    "%s(%d): garbage at end of 'include' line",
     180                                    filename, lineno);
    146181                        if ((name = dup_word(p)) == NULL)
    147182                                goto syserr;
     
    163198
    164199                /* control flag */
    165                 if (match_word(p, "required")) {
    166                         this->flag = PAM_REQUIRED;
    167                 } else if (match_word(p, "requisite")) {
    168                         this->flag = PAM_REQUISITE;
    169                 } else if (match_word(p, "sufficient")) {
    170                         this->flag = PAM_SUFFICIENT;
    171                 } else if (match_word(p, "optional")) {
    172                         this->flag = PAM_OPTIONAL;
    173                 } else if (match_word(p, "binding")) {
    174                         this->flag = PAM_BINDING;
    175                 } else {
    176                         q = next_word(p);
     200                for (i = 0; i < PAM_NUM_CONTROL_FLAGS; ++i)
     201                        if (match_word(p, _pam_control_flag_name[i]))
     202                                break;
     203                if (i == PAM_NUM_CONTROL_FLAGS) {
    177204                        openpam_log(PAM_LOG_ERROR,
    178                             "%s: invalid control flag '%.*s'",
    179                             filename, (int)(q - p), p);
     205                            "%s(%d): invalid control flag '%.*s'",
     206                            filename, lineno, wordlen(p), p);
    180207                        goto fail;
    181208                }
     209                this->flag = i;
    182210
    183211                /* module name */
    184212                p = next_word(p);
    185                 q = next_word(p);
    186213                if (*p == '\0') {
    187214                        openpam_log(PAM_LOG_ERROR,
    188                             "%s: missing module name", filename);
     215                            "%s(%d): missing module name",
     216                            filename, lineno);
    189217                        goto fail;
    190218                }
     
    197225
    198226                /* module options */
     227                p = q = next_word(p);
    199228                while (*q != '\0') {
    200229                        ++this->optc;
     
    205234                        goto syserr;
    206235                for (i = 0; i < this->optc; ++i) {
    207                         p = next_word(p);
    208236                        if ((this->optv[i] = dup_word(p)) == NULL)
    209237                                goto syserr;
     238                        p = next_word(p);
    210239                }
    211240
     
    214243                next = &this->next;
    215244                this = NULL;
    216                 ++count;
     245                ++count;
    217246
    218247                /* next please... */
     
    274303}
    275304
    276 const char *_pam_chain_name[PAM_NUM_CHAINS] = {
    277         [PAM_AUTH] = "auth",
    278         [PAM_ACCOUNT] = "account",
    279         [PAM_SESSION] = "session",
    280         [PAM_PASSWORD] = "password"
    281 };
    282 
    283305/*
    284306 * OpenPAM internal
     
    293315        int i, ret;
    294316
    295         for (i = 0; i < PAM_NUM_CHAINS; ++i) {
     317        for (i = 0; i < PAM_NUM_FACILITIES; ++i) {
    296318                ret = openpam_load_chain(&pamh->chains[i],
    297                     service, _pam_chain_name[i]);
     319                    service, _pam_facility_name[i]);
    298320                if (ret == 0)
    299321                        ret = openpam_load_chain(&pamh->chains[i],
    300                             PAM_OTHER, _pam_chain_name[i]);
     322                            PAM_OTHER, _pam_facility_name[i]);
    301323                if (ret < 0) {
    302324                        openpam_clear_chains(pamh->chains);
  • trunk/lib/openpam_impl.h

    r240 r241  
    3232 * SUCH DAMAGE.
    3333 *
    34  * $P4: //depot/projects/openpam/lib/openpam_impl.h#25 $
     34 * $P4: //depot/projects/openpam/lib/openpam_impl.h#26 $
    3535 */
    3636
     
    5050 * Control flags
    5151 */
     52#define PAM_BINDING             0
    5253#define PAM_REQUIRED            1
    5354#define PAM_REQUISITE           2
    5455#define PAM_SUFFICIENT          3
    5556#define PAM_OPTIONAL            4
    56 #define PAM_BINDING             5
    57 #define PAM_NUM_CONTROLFLAGS    6
     57#define PAM_NUM_CONTROL_FLAGS   5
    5858
    5959/*
    60  * Chains
     60 * Facilities
    6161 */
    6262#define PAM_AUTH                0
     
    6464#define PAM_SESSION             2
    6565#define PAM_PASSWORD            3
    66 #define PAM_NUM_CHAINS          4
     66#define PAM_NUM_FACILITIES      4
    6767
    6868typedef struct pam_chain pam_chain_t;
     
    8787
    8888        /* chains */
    89         pam_chain_t     *chains[PAM_NUM_CHAINS];
     89        pam_chain_t     *chains[PAM_NUM_FACILITIES];
    9090        pam_chain_t     *current;
    9191        int              primitive;
  • trunk/lib/openpam_load.c

    r240 r241  
    3232 * SUCH DAMAGE.
    3333 *
    34  * $P4: //depot/projects/openpam/lib/openpam_load.c#17 $
     34 * $P4: //depot/projects/openpam/lib/openpam_load.c#18 $
    3535 */
    3636
     
    171171        int i;
    172172
    173         for (i = 0; i < PAM_NUM_CHAINS; ++i)
     173        for (i = 0; i < PAM_NUM_FACILITIES; ++i)
    174174                openpam_destroy_chain(policy[i]);
    175175}
  • trunk/lib/openpam_readline.c

    r240 r241  
    3232 * SUCH DAMAGE.
    3333 *
    34  * $P4: //depot/projects/openpam/lib/openpam_readline.c#1 $
     34 * $P4: //depot/projects/openpam/lib/openpam_readline.c#2 $
    3535 */
    3636
     
    5151
    5252char *
    53 openpam_readline(FILE *f, size_t *lenp)
     53openpam_readline(FILE *f, int *lineno, size_t *lenp)
    5454{
    5555        char *line;
     
    9393                /* eol */
    9494                if (ch == '\n') {
     95                        if (lineno != NULL)
     96                                ++*lineno;
     97
    9598                        /* remove trailing whitespace */
    9699                        while (len > 0 && isspace(line[len - 1]))
     
    141144 * line is appended.
    142145 *
     146 * If =lineno is not =NULL, the integer variable it points to is
     147 * incremented every time a newline character is read.
     148 *
    143149 * If =lenp is not =NULL, the length of the line (not including the
    144150 * terminating NUL character) is stored in the variable it points to.
Note: See TracChangeset for help on using the changeset viewer.