]> granicus.if.org Git - linux-pam/commitdiff
Relevant BUGIDs:
authorThorsten Kukuk <kukuk@thkukuk.de>
Sun, 10 Dec 2006 10:37:26 +0000 (10:37 +0000)
committerThorsten Kukuk <kukuk@thkukuk.de>
Sun, 10 Dec 2006 10:37:26 +0000 (10:37 +0000)
Purpose of commit: bugfix

Commit summary:
---------------

2006-12-09  Thorsten Kukuk  <kukuk@thkukuk.de>

        * modules/pam_umask/pam_umask.c: Use strtoul instead of strtol,
        fix overflow detection.

ChangeLog
modules/pam_umask/pam_umask.c

index ad555c5298bc742c0160161ae90c7fc3d7978a50..22333569a6d06780537981f6ecc9ecdf097c13a0 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2006-12-09  Thorsten Kukuk  <kukuk@thkukuk.de>
+
+       * modules/pam_umask/pam_umask.c: Use strtoul instead of strtol,
+       fix overflow detection.
+
 2006-12-06  Thorsten Kukuk  <kukuk@thkukuk.de>
 
        * modules/pam_mkhomedir/pam_mkhomedir.c (rec_mkdir): Fix
index c5fa773b1a1ec9a246458e8a5d81f7c908fc5523..fdeb3c51a3a8a43b7bac64e52b39e1472599f212 100644 (file)
@@ -15,8 +15,8 @@
  *    written permission.
  *
  * ALTERNATIVELY, this product may be distributed under the terms of
- * the GNU Public License, in which case the provisions of the GPL are
- * required INSTEAD OF the above restrictions.  (This clause is
+ * the GNU Public License V2, in which case the provisions of the GPL
+ * are required INSTEAD OF the above restrictions.  (This clause is
  * necessary due to a potential bad interaction between the GPL and
  * the restrictions contained in a BSD-style copyright.)
  *
@@ -40,6 +40,7 @@
 #include <stdio.h>
 #include <ctype.h>
 #include <errno.h>
+#include <limits.h>
 #include <string.h>
 #include <stdarg.h>
 #include <unistd.h>
 #include <security/pam_modutil.h>
 #include <security/pam_ext.h>
 
+#define BUF_SIZE 4096
+#define LOGIN_DEFS "/etc/login.defs"
+#define LOGIN_CONF "/etc/default/login"
+
 struct options_t {
   int debug;
   int usergroups;
@@ -105,7 +110,7 @@ search_key (const char *filename)
 
       if (buf == NULL)
         {
-          buflen = 8096;
+          buflen = BUF_SIZE;
           buf = malloc (buflen);
         }
       buf[0] = '\0';
@@ -145,8 +150,7 @@ search_key (const char *filename)
     }
   fclose (fp);
 
-  if (buf)
-    free (buf);
+  free (buf);
 
   return retval;
 }
@@ -161,9 +165,9 @@ get_options (const pam_handle_t *pamh, options_t *options,
     parse_option (pamh, *argv, options);
 
   if (options->umask == NULL)
-    options->umask = search_key ("/etc/login.defs");
+    options->umask = search_key (LOGIN_DEFS);
   if (options->umask == NULL)
-    options->umask = search_key ("/etc/default/login");
+    options->umask = search_key (LOGIN_CONF);
 
   return 0;
 }
@@ -175,8 +179,9 @@ set_umask (const char *value)
   mode_t mask;
   char *endptr;
 
-  mask = strtol (value, &endptr, 8) & 0777;
-  if ((mask == 0) && (value_orig == endptr))
+  mask = strtoul (value, &endptr, 8) & 0777;
+  if (((mask == 0) && (value_orig == endptr)) ||
+      ((mask == ULONG_MAX) && (errno == ERANGE)))
     return;
   umask (mask);
   return;