From: Paul H. Hargrove (PHHargrove_at_lbl_dot_gov)
Date: Mon Aug 11 2008 - 11:34:42 PDT
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 {