From: mukti jain (muktijn_at_gmail_dot_com)
Date: Wed Aug 13 2008 - 01:57:49 PDT
We have not seen the issue on x86 with the same application, why is this problem arm specific? > > On Tue, Aug 12, 2008 at 12:04 AM, Paul H. Hargrove <PHHargrove_at_lbl_dot_gov>wrote: > >> It seems the ENOMEM problem reported by Manish Dwivedi recently is due to >> having zero supplementary group ids. When BLCR goes to save the group ids, >> this results in vmalloc(0) which rightly returns NULL. BLCR, however, >> interprets the NULL return as an out of memory condition. Mukti Jain has >> observed that the same exists on the corresponding restore path. >> >> Attached is a patch that should resolve these problems (works in my >> limited testing). >> >> I had planned to release 0.7.3 today, but will probably delay that until >> I've gotten confirmation from Manish and/or Mukti that this patch solves the >> problem, or until somebody finds a problem with this patch. >> >> -Paul >> >> -- >> Paul H. Hargrove PHHargrove_at_lbl_dot_gov >> Future Technologies Group >> HPC Research Department Tel: +1-510-495-2352 >> Lawrence Berkeley National Laboratory Fax: +1-510-486-6900 >> >> Index: cr_module/cr_dump_self.c >> =================================================================== >> RCS file: /var/local/cvs/lbnl_cr/cr_module/cr_dump_self.c,v >> retrieving revision 1.202.2.5 >> diff -u -r1.202.2.5 cr_dump_self.c >> --- cr_module/cr_dump_self.c 26 Jun 2008 00:05:42 -0000 1.202.2.5 >> +++ cr_module/cr_dump_self.c 11 Aug 2008 18:22:40 -0000 >> @@ -819,7 +819,7 @@ >> } >> >> #if HAVE_TASK_GROUP_INFO >> - { >> + if (sizeof_groups != 0) { >> /* copy current->groups into an array and write it out */ >> int i; >> gid_t *groups; >> Index: cr_module/cr_rstrt_req.c >> =================================================================== >> RCS file: /var/local/cvs/lbnl_cr/cr_module/cr_rstrt_req.c,v >> retrieving revision 1.292.2.8 >> diff -u -r1.292.2.8 cr_rstrt_req.c >> --- cr_module/cr_rstrt_req.c 5 Aug 2008 00:39:59 -0000 1.292.2.8 >> +++ cr_module/cr_rstrt_req.c 11 Aug 2008 18:22:40 -0000 >> @@ -144,8 +144,7 @@ >> { >> struct cr_context_creds cf_creds; >> int retval; >> - gid_t *groups; >> - size_t sizeof_groups; >> + gid_t *groups = NULL; >> >> retval = cr_kread(proc_req->file, &cf_creds, sizeof(cf_creds)); >> if (retval < sizeof(cf_creds)) { >> @@ -162,20 +161,21 @@ >> CR_ERR("Invalid supplemental group count (%d)", >> (int)cf_creds.ngroups); >> retval = -EINVAL; >> goto out; >> - } >> + } else if (cf_creds.ngroups) { >> + size_t sizeof_groups = cf_creds.ngroups*sizeof(gid_t); >> + groups = vmalloc(sizeof_groups); >> + retval = -ENOMEM; >> + if (groups == NULL) { >> + goto out; >> + } >> >> - sizeof_groups = cf_creds.ngroups*sizeof(gid_t); >> - groups = vmalloc(sizeof_groups); >> - retval = -ENOMEM; >> - if (groups == NULL) { >> - goto out; >> + retval = cr_kread(proc_req->file, groups, sizeof_groups); >> + if (retval < sizeof_groups) { >> + CR_ERR("groups: read returned %d", retval); >> + goto out_vfree; >> + } >> } >> >> - retval = cr_kread(proc_req->file, groups, sizeof_groups); >> - if (retval < sizeof_groups) { >> - CR_ERR("groups: read returned %d", retval); >> - goto out_vfree; >> - } >> >> #if CR_RESTORE_IDS >> { >> >> >