[SSSD] [PATCH] Use explicit base 10 for converting strings to integers

Jakub Hrozek jhrozek at redhat.com
Mon Oct 3 09:13:51 UTC 2011


https://fedorahosted.org/sssd/ticket/1013

I'll provide a 1.6/1.5 back port when this patch is acked.

I've tested with a user that looks like this:
---------------
dn: cn=octaluid,$DC
objectClass: posixAccount
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
objectClass: top
uid: octaluid
uidNumber: 1000
gidNumber: 1000
homeDirectory: /home/octaluid
gecos: 01000
loginShell: /bin/bash
sn: octaluid
givenName: octaluid
cn: octaluid
---------------

Then remapped the uidNumber attribute in /etc/sssd/sssd.conf:
ldap_user_uid_number = gecos

Without the patch, getent passwd octaluid reported uid 512, with the
patch, it reports 1000. Saving users with UIDs of bases that cannot
be converted with base-10 fails now (I tested hexadecimal 0x1000).
-------------- next part --------------
From 18d47182d4ecd09705911ef558207771609a51c4 Mon Sep 17 00:00:00 2001
From: Jakub Hrozek <jhrozek at redhat.com>
Date: Thu, 29 Sep 2011 20:00:58 +0200
Subject: [PATCH] Use explicit base 10 for converting strings to integers

https://fedorahosted.org/sssd/ticket/1013
---
 src/db/sysdb.c                  |    2 +-
 src/db/sysdb_ops.c              |    2 +-
 src/providers/ldap/ldap_id.c    |    4 ++--
 src/providers/proxy/proxy_id.c  |    4 ++--
 src/responder/common/negcache.c |    4 ++--
 src/tools/sss_debuglevel.c      |    2 +-
 6 files changed, 9 insertions(+), 9 deletions(-)

diff --git a/src/db/sysdb.c b/src/db/sysdb.c
index eafa7fd..1a32603 100644
--- a/src/db/sysdb.c
+++ b/src/db/sysdb.c
@@ -378,7 +378,7 @@ int sysdb_attrs_get_uint32_t(struct sysdb_attrs *attrs, const char *name,
     }
 
     errno = 0;
-    val = strtouint32((const char *) el->values[0].data, &endptr, 0);
+    val = strtouint32((const char *) el->values[0].data, &endptr, 10);
     if (errno != 0) return errno;
     if (*endptr) return EINVAL;
 
diff --git a/src/db/sysdb_ops.c b/src/db/sysdb_ops.c
index 522bbb0..f4418e4 100644
--- a/src/db/sysdb_ops.c
+++ b/src/db/sysdb_ops.c
@@ -60,7 +60,7 @@ static uint32_t get_attr_as_uint32(struct ldb_message *msg, const char *attr)
     }
 
     errno = 0;
-    l = strtoll((const char *)v->data, NULL, 0);
+    l = strtoll((const char *)v->data, NULL, 10);
     if (errno) {
         return (uint32_t)-1;
     }
diff --git a/src/providers/ldap/ldap_id.c b/src/providers/ldap/ldap_id.c
index 2d8aeff..46f6889 100644
--- a/src/providers/ldap/ldap_id.c
+++ b/src/providers/ldap/ldap_id.c
@@ -235,7 +235,7 @@ static void users_get_done(struct tevent_req *subreq)
             break;
 
         case BE_FILTER_IDNUM:
-            uid = (uid_t) strtouint32(state->name, &endptr, 0);
+            uid = (uid_t) strtouint32(state->name, &endptr, 10);
             if (errno || *endptr || (state->name == endptr)) {
                 tevent_req_error(req, errno ? errno : EINVAL);
                 return;
@@ -478,7 +478,7 @@ static void groups_get_done(struct tevent_req *subreq)
             break;
 
         case BE_FILTER_IDNUM:
-            gid = (gid_t) strtouint32(state->name, &endptr, 0);
+            gid = (gid_t) strtouint32(state->name, &endptr, 10);
             if (errno || *endptr || (state->name == endptr)) {
                 tevent_req_error(req, errno ? errno : EINVAL);
                 return;
diff --git a/src/providers/proxy/proxy_id.c b/src/providers/proxy/proxy_id.c
index ba45d7a..2428475 100644
--- a/src/providers/proxy/proxy_id.c
+++ b/src/providers/proxy/proxy_id.c
@@ -1080,7 +1080,7 @@ void proxy_get_account_info(struct be_req *breq)
             break;
 
         case BE_FILTER_IDNUM:
-            uid = (uid_t) strtouint32(ar->filter_value, &endptr, 0);
+            uid = (uid_t) strtouint32(ar->filter_value, &endptr, 10);
             if (errno || *endptr || (ar->filter_value == endptr)) {
                 return proxy_reply(breq, DP_ERR_FATAL,
                                    EINVAL, "Invalid attr type");
@@ -1102,7 +1102,7 @@ void proxy_get_account_info(struct be_req *breq)
             ret = get_gr_name(breq, ctx, sysdb, domain, ar->filter_value);
             break;
         case BE_FILTER_IDNUM:
-            gid = (gid_t) strtouint32(ar->filter_value, &endptr, 0);
+            gid = (gid_t) strtouint32(ar->filter_value, &endptr, 10);
             if (errno || *endptr || (ar->filter_value == endptr)) {
                 return proxy_reply(breq, DP_ERR_FATAL,
                                    EINVAL, "Invalid attr type");
diff --git a/src/responder/common/negcache.c b/src/responder/common/negcache.c
index d8c4c26..3926574 100644
--- a/src/responder/common/negcache.c
+++ b/src/responder/common/negcache.c
@@ -90,7 +90,7 @@ static int sss_ncache_check_str(struct sss_nc_ctx *ctx, char *str, int ttl)
     }
 
     errno = 0;
-    timestamp = strtoull((const char *)data.dptr, &ep, 0);
+    timestamp = strtoull((const char *)data.dptr, &ep, 10);
     if (errno != 0 || *ep != '\0') {
         /* Malformed entry, remove it and return no entry */
         expired = true;
@@ -330,7 +330,7 @@ static int delete_permanent(struct tdb_context *tdb,
     }
 
     errno = 0;
-    timestamp = strtoull((const char *)data.dptr, &ep, 0);
+    timestamp = strtoull((const char *)data.dptr, &ep, 10);
     if (errno != 0 || *ep != '\0') {
         /* Malformed entry, remove it */
         remove_key = true;
diff --git a/src/tools/sss_debuglevel.c b/src/tools/sss_debuglevel.c
index 45723ec..38262dd 100644
--- a/src/tools/sss_debuglevel.c
+++ b/src/tools/sss_debuglevel.c
@@ -369,7 +369,7 @@ pid_t parse_pid(const char *strpid)
     char *endptr;
 
     errno = 0;
-    value = strtol(strpid, &endptr, 0);
+    value = strtol(strpid, &endptr, 10);
     if ((errno != 0) || (endptr == strpid)
         || ((*endptr != '\0') && (*endptr != '\n'))) {
         return 0;
-- 
1.7.6.4



More information about the sssd-devel mailing list