aboutsummaryrefslogtreecommitdiff
path: root/libpam/pam_misc.c
diff options
context:
space:
mode:
authorTobias Stoeckmann <tobias@stoeckmann.org>2023-11-11 13:58:06 +0100
committerDmitry V. Levin <github.dl@altlinux.org>2023-11-12 22:53:37 +0000
commitcb13aa40cb4ea0c8f1d12d79cbf9ed94828c837f (patch)
treeaf4d0ea66a50509207739c4745bd3a9cb388b539 /libpam/pam_misc.c
parentda3bc2fc01c2443486ac1d241c4a09eaa71083c6 (diff)
downloadpam-cb13aa40cb4ea0c8f1d12d79cbf9ed94828c837f.tar.gz
pam-cb13aa40cb4ea0c8f1d12d79cbf9ed94828c837f.tar.bz2
pam-cb13aa40cb4ea0c8f1d12d79cbf9ed94828c837f.zip
libpam: fix integer overflow when parsing configs
It is possible to trigger a signed integer overflow when parsing jump numbers for pam return types. Fail if the number becomes too large. Signed-off-by: Tobias Stoeckmann <tobias@stoeckmann.org>
Diffstat (limited to 'libpam/pam_misc.c')
-rw-r--r--libpam/pam_misc.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/libpam/pam_misc.c b/libpam/pam_misc.c
index 4c53451f..22b613e1 100644
--- a/libpam/pam_misc.c
+++ b/libpam/pam_misc.c
@@ -37,6 +37,7 @@
#include "pam_private.h"
+#include <limits.h>
#include <stdarg.h>
#include <stdlib.h>
#include <stdio.h>
@@ -329,8 +330,17 @@ void _pam_parse_control(int *control_array, char *tok)
/* parse a number */
act = 0;
do {
+ int digit = *tok - '0';
+ if (act > INT_MAX / 10) {
+ error = "expecting smaller jump number";
+ goto parse_error;
+ }
act *= 10;
- act += *tok - '0'; /* XXX - this assumes ascii behavior */
+ if (act > INT_MAX - digit) {
+ error = "expecting smaller jump number";
+ goto parse_error;
+ }
+ act += digit; /* XXX - this assumes ascii behavior */
} while (*++tok && isdigit((unsigned char)*tok));
if (! act) {
/* we do not allow 0 jumps. There is a token ('ignore')