On (15/06/16 21:08), Lukas Slebodnik wrote:
>On (15/06/16 19:08), Lukas Slebodnik wrote:
>>On (15/06/16 14:08), Pavel Březina wrote:
>>>On 06/15/2016 08:44 AM, Lukas Slebodnik wrote:
>>>> On (14/06/16 15:30), Pavel Březina wrote:
>>>> > On 05/16/2016 02:00 PM, Pavel Březina wrote:
>>>> > > Hi,
>>>> > > the patches are finally ready to be tested and reviewed. It is too huge
>>>> > > to be sent to the list so please checkout my fedorapeople or github 
>>>> > > repo:
>>>> > > 
>>>> > > https://fedorapeople.org/cgit/pbrezina/public_git/sssd.git/log/?h=backend
>>>> > > https://github.com/pbrezina/sssd/tree/backend
>>>> > > 
>>>> > > Subdomain handlers are not yet converted so subdomain support is
>>>> > > disabled, otherwise everything should work although I'm sure you'll 
>>>> > > find
>>>> > > some bugs.
>>>> > > 
>>>> > > I managed to do some simple tests (initgroups, authentication) with 
>>>> > > ldap
>>>> > > provider so far and will continue testing and fixing so if you find a
>>>> > > bug make sure you run with the latest version before reporting it 
>>>> > > please
>>>> > > :-)
>>>> > > 
>>>> > > Since the changes touch almost all areas of SSSD I encourage everyone 
>>>> > > to
>>>> > > run and try. Some handlers were converted quite easily, some took more
>>>> > > handy work. Areas that are most likely to contain some bugs are these
>>>> > > (please give it extra attention):
>>>> > > 
>>>> > > - proxy provider
>>>> > > - if group membership changes during initgroups, nss memory cache 
>>>> > > should
>>>> > > be clear through dbus call
>>>> > > - selinux support
>>>> > > - hbac support
>>>> > > - change password
>>>> > > - password migration (ipa)
>>>> > > 
>>>> > > Don't be alarmed with the number of new lines -- there is not that many
>>>> > > changes. I copied all touched files and suffixed them with _new so sssd
>>>> > > can be compiled and kept working until the latest patches. I also 
>>>> > > wanted
>>>> > > to keep the original code intact for comparison (it was easier for
>>>> > > development and it may be handy for bug chasing), you can simply use
>>>> > > some diff tool to see the changes. We can squash it in the end.
>>>> > > 
>>>> > > When I will be confident that the patches are stable I will do some
>>>> > > clean up and remove content that is no longer needed.
>>>> > 
>>>> > Just a quick update: all found bugs were fixed, CI pass, all downstream 
>>>> > tests
>>>> > which were tried (I think all but IPA) pass.
>>>> 
>>>> 30      errno_t dp_host_handler(struct sbus_request *sbus_req,
>>>> 31                              void *dp_cli,
>>>> 32                              uint32_t dp_flags,
>>>> 33                              const char *name,
>>>> 34                              const char *alias)
>>>> 35      {
>>>> 36          struct dp_hostid_data *data;
>>>> 37          const char *key;
>>>> 38
>>>> 39          if (name == NULL) {
>>>> 40              return EINVAL;
>>>> 41          }
>>>> 42
>>>> 43          data = talloc_zero(sbus_req, struct dp_hostid_data);
>>>> 44          if (data == NULL) {
>>>> 45              return ENOMEM;
>>>> 46          }
>>>> 47
>>>> 48          data->name = name;
>>>> 49          data->alias = alias[0] == '\0' ? NULL : alias;
>>>> 50
>>>> 51          key = talloc_asprintf("%s:%s", name, (alias == '\0' ? "(null)" 
>>>> : alias));
>>>>                                   ^^^
>>>>                              The 1st argument should be a talloc context
>>>>                              otherwise it will CRASH.
>>>> 
>>>> 52          if (key == NULL) {
>>>> 53              talloc_free(data);
>>>> 54              return ENOMEM;
>>>> 55          }
>>>
>>>Thanks fixed.
>>>
>>>> 
>>>> I can see a gcc warning on my fedora 24
>>>> src/providers/ad/ad_subdomains_new.c: In function 
>>>> ‘ad_subdomains_refresh_root_done’:
>>>> src/providers/ad/ad_subdomains_new.c:575:23: warning: ‘root_attrs’ may be 
>>>> used uninitialized in this function [-Wmaybe-uninitialized]
>>>>       state->root_attrs = root_attrs;
>>>>       ~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~
>>>> src/providers/ad/ad_subdomains_new.c:1161:25: note: ‘root_attrs’ was 
>>>> declared here
>>>>       struct sysdb_attrs *root_attrs;
>>>>                           ^~~~~~~~~~
>>>> src/providers/ad/ad_subdomains_new.c:1194:14: warning: ‘root_id_ctx’ may 
>>>> be used uninitialized in this function [-Wmaybe-uninitialized]
>>>>       subreq = ad_get_slave_domain_send(state, state->ev, state->sd_ctx,
>>>>                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>>>>                                         root_attrs, root_id_ctx->ldap_ctx);
>>>>                                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>>>
>>>I seen this in Coverity also reported with root_attrs maybe uninitialized. It
>>>seems to me as false positive but maybe I miss something?
>>>
>>It's verly likely some gcc-6 otimisation.
>>I will try to take a look.
>>
>I think that gcc want to tell us this
>
>1156 static void ad_subdomains_refresh_root_done(struct tevent_req *subreq)
>1157 {
>1158     struct ad_subdomains_refresh_state *state;
>1159     struct tevent_req *req;
>1160     struct ad_id_ctx *root_id_ctx;
>1161     struct sysdb_attrs *root_attrs;
>1162     int dp_error;
>1163     errno_t ret;
>1164 
>1165     req = tevent_req_callback_data(subreq, struct tevent_req);
>1166     state = tevent_req_data(req, struct ad_subdomains_refresh_state);
>1167 
>1168     ret = ad_get_root_domain_recv(state, subreq, &root_attrs, 
>&root_id_ctx);
>1169     talloc_zfree(subreq);
>1170     if (ret != EOK) {
>1171         DEBUG(SSSDBG_CRIT_FAILURE, "Unable to get forest root [%d]: %s\n",
>1172               ret, sss_strerror(ret));
>1173         /* We continue to finish sdap_id_op. */
>             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>             root_attrs and root_id_ctx needn't be initialized after this line.
>1174     }
>1175 

hmm,
maybe no.

I tried to initialize variables after DEBUG message and it was not enough.
I still could see a warnings.

After following change I could see warning only for root_id_ctx.

diff --git a/src/providers/ad/ad_subdomains_new.c 
b/src/providers/ad/ad_subdomains_new.c
index 83539a1..09cc985 100644
--- a/src/providers/ad/ad_subdomains_new.c
+++ b/src/providers/ad/ad_subdomains_new.c
@@ -1175,7 +1175,9 @@ static void ad_subdomains_refresh_root_done(struct 
tevent_req *subreq)
 
     ret = ad_get_root_domain_recv(state, subreq, &root_attrs, &root_id_ctx);
     talloc_zfree(subreq);
+    root_attrs = NULL;
     if (ret != EOK) {
+        root_id_ctx = NULL;
         DEBUG(SSSDBG_CRIT_FAILURE, "Unable to get forest root [%d]: %s\n",
               ret, sss_strerror(ret));
         /* We continue to finish sdap_id_op. */

I went deeper and compiler does not like macro TEVENT_REQ_RETURN_ON_ERROR.
according to compiler TEVENT_REQ_RETURN_ON_ERROR could return 0

Here is "version after expansion" of macro TEVENT_REQ_RETURN_ON_ERROR
diff --git a/src/providers/ad/ad_subdomains_new.c 
b/src/providers/ad/ad_subdomains_new.c
index 9a2f035..83539a1 100644
--- a/src/providers/ad/ad_subdomains_new.c
+++ b/src/providers/ad/ad_subdomains_new.c
@@ -969,7 +969,15 @@ static errno_t ad_get_root_domain_recv(TALLOC_CTX *mem_ctx,
     struct ad_get_root_domain_state *state = NULL;
     state = tevent_req_data(req, struct ad_get_root_domain_state);
 
-    TEVENT_REQ_RETURN_ON_ERROR(req);
+    enum tevent_req_state TRROEstate;
+    uint64_t TRROEerr;
+
+    if (tevent_req_is_error(req, &TRROEstate, &TRROEerr)) {
+        if (TRROEstate == TEVENT_REQ_USER_ERROR) {
+            return TRROEerr;
+        }
+        return ERR_INTERNAL;
+    }
 
     *_attrs = talloc_steal(mem_ctx, state->root_domain_attrs);
     *_id_ctx = state->root_id_ctx;


and here is diff on top of previous one which makes complier happy
diff --git a/src/providers/ad/ad_subdomains_new.c 
b/src/providers/ad/ad_subdomains_new.c
index 83539a1..eab1972 100644
--- a/src/providers/ad/ad_subdomains_new.c
+++ b/src/providers/ad/ad_subdomains_new.c
@@ -970,10 +970,15 @@ static errno_t ad_get_root_domain_recv(TALLOC_CTX 
*mem_ctx,
     state = tevent_req_data(req, struct ad_get_root_domain_state);
 
     enum tevent_req_state TRROEstate;
-    uint64_t TRROEerr;
+    uint64_t TRROEuint64;
+    errno_t TRROEerr;
 
-    if (tevent_req_is_error(req, &TRROEstate, &TRROEerr)) {
+    if (tevent_req_is_error(req, &TRROEstate, &TRROEuint64)) {
+        TRROEerr = (errno_t) TRROEuint64;
         if (TRROEstate == TEVENT_REQ_USER_ERROR) {
+            if (TRROEerr == 0) {
+                return EINVAL;
+            }
             return TRROEerr;
         }
         return ERR_INTERNAL;
@@ -1179,6 +1184,8 @@ static void ad_subdomains_refresh_root_done(struct 
tevent_req *subreq)
         DEBUG(SSSDBG_CRIT_FAILURE, "Unable to get forest root [%d]: %s\n",
               ret, sss_strerror(ret));
         /* We continue to finish sdap_id_op. */
+        root_attrs = NULL;
+        root_id_ctx = NULL;
     }
 
     /* We finish sdap_id_op here since we connect

LS
_______________________________________________
sssd-devel mailing list
sssd-devel@lists.fedorahosted.org
https://lists.fedorahosted.org/admin/lists/sssd-devel@lists.fedorahosted.org

Reply via email to