Changeset 594 in openpam for trunk/lib/openpam_configure.c


Ignore:
Timestamp:
Apr 14, 2012, 2:18:41 PM (9 years ago)
Author:
Dag-Erling Smørgrav
Message:

Add an experimental mechanism for enabling / disabling optional features.
Use it to control policy and module file checks. The default settings
correspond to the current behavior: disallow path separators in policy
names, but allow them in module names; verify ownership and permissions
for both policy files and modules.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/lib/openpam_configure.c

    r554 r594  
    6969        const char *p;
    7070
    71         for (p = name; *p != '\0'; ++p)
    72                 if (!is_pfcs(*p))
    73                         return (0);
     71        if (OPENPAM_FEATURE(RESTRICT_SERVICE_NAME)) {
     72                /* path separator not allowed */
     73                for (p = name; *p != '\0'; ++p)
     74                        if (!is_pfcs(*p))
     75                                return (0);
     76        } else {
     77                /* path separator allowed */
     78                for (p = name; *p != '\0'; ++p)
     79                        if (!is_pfcs(*p) && *p != '/')
     80                                return (0);
     81        }
    7482        return (1);
    7583}
     
    117125 */
    118126static int
    119 valid_filename(const char *name)
     127valid_module_name(const char *name)
    120128{
    121129        const char *p;
    122130
    123         for (p = name; *p != '\0'; ++p)
    124                 if (!is_pfcs(*p) && *p != '/')
    125                         return (0);
     131        if (OPENPAM_FEATURE(RESTRICT_MODULE_NAME)) {
     132                /* path separator not allowed */
     133                for (p = name; *p != '\0'; ++p)
     134                        if (!is_pfcs(*p))
     135                                return (0);
     136        } else {
     137                /* path separator allowed */
     138                for (p = name; *p != '\0'; ++p)
     139                        if (!is_pfcs(*p) && *p != '/')
     140                                return (0);
     141        }
    126142        return (1);
    127143}
     
    220236                /* get module name */
    221237                if ((modulename = wordv[i++]) == NULL ||
    222                     !valid_filename(modulename)) {
     238                    !valid_module_name(modulename)) {
    223239                        openpam_log(PAM_LOG_ERROR,
    224240                            "%s(%d): missing or invalid module name",
     
    319335        int ret, serrno;
    320336
    321         if (!valid_service_name(service)) {
    322                 openpam_log(PAM_LOG_ERROR, "invalid service name");
    323                 errno = EINVAL;
    324                 RETURNN(-1);
    325         }
    326337        ENTERS(facility < 0 ? "any" : pam_facility_name[facility]);
    327338        for (path = openpam_policy_path; *path != NULL; ++path) {
     
    355366
    356367                /* verify type, ownership and permissions */
    357                 if (openpam_check_desc_owner_perms(filename, fileno(f)) != 0) {
     368                if (OPENPAM_FEATURE(VERIFY_POLICY_FILE) &&
     369                    openpam_check_desc_owner_perms(filename, fileno(f)) != 0) {
    358370                        serrno = errno;
    359371                        fclose(f);
     
    384396{
    385397        pam_facility_t fclt;
    386         const char *p;
    387398        int serrno;
    388399
    389400        ENTERS(service);
    390         for (p = service; *p; ++p)
    391                 if (!is_pfcs(*p))
    392                         RETURNC(PAM_SYSTEM_ERR);
     401        if (!valid_service_name(service)) {
     402                openpam_log(PAM_LOG_ERROR, "invalid service name");
     403                RETURNC(PAM_SYSTEM_ERR);
     404        }
    393405        if (openpam_load_chain(pamh, service, PAM_FACILITY_ANY) < 0)
    394406                goto load_err;
Note: See TracChangeset for help on using the changeset viewer.