conf: lxc_map_ids() non-functional changes

Signed-off-by: Christian Brauner <christian.brauner@ubuntu.com>
This commit is contained in:
Christian Brauner 2017-04-15 13:25:59 +02:00
parent 421a42bfe3
commit 4bc3b75957
No known key found for this signature in database
GPG Key ID: 8EB056D53EECB12D
2 changed files with 24 additions and 20 deletions

View File

@ -3321,11 +3321,13 @@ static int write_id_mapping(enum idtype idtype, pid_t pid, const char *buf,
int lxc_map_ids(struct lxc_list *idmap, pid_t pid) int lxc_map_ids(struct lxc_list *idmap, pid_t pid)
{ {
struct lxc_list *iterator;
struct id_map *map; struct id_map *map;
int ret = 0, use_shadow = 0; struct lxc_list *iterator;
enum idtype type; enum idtype type;
char *buf = NULL, *pos, *cmdpath = NULL; char *pos;
char *buf = NULL, *cmdpath = NULL;
bool use_shadow = false;
int ret = 0;
/* /*
* If newuidmap exists, that is, if shadow is handing out subuid * If newuidmap exists, that is, if shadow is handing out subuid
@ -3335,7 +3337,7 @@ int lxc_map_ids(struct lxc_list *idmap, pid_t pid)
*/ */
cmdpath = on_path("newuidmap", NULL); cmdpath = on_path("newuidmap", NULL);
if (cmdpath) { if (cmdpath) {
use_shadow = 1; use_shadow = true;
free(cmdpath); free(cmdpath);
} }
@ -3344,50 +3346,51 @@ int lxc_map_ids(struct lxc_list *idmap, pid_t pid)
return -1; return -1;
} }
for(type = ID_TYPE_UID; type <= ID_TYPE_GID; type++) { for (type = ID_TYPE_UID; type <= ID_TYPE_GID; type++) {
int left, fill; int left, fill;
int had_entry = 0; bool had_entry = false;
if (!buf) { if (!buf) {
buf = pos = malloc(4096); buf = pos = malloc(LXC_IDMAPLEN);
if (!buf) if (!buf)
return -ENOMEM; return -ENOMEM;
} }
pos = buf; pos = buf;
if (use_shadow) if (use_shadow)
pos += sprintf(buf, "new%cidmap %d", pos += sprintf(buf, "new%cidmap %d", type == ID_TYPE_UID ? 'u' : 'g', pid);
type == ID_TYPE_UID ? 'u' : 'g',
pid);
lxc_list_for_each(iterator, idmap) { lxc_list_for_each(iterator, idmap) {
/* The kernel only takes <= 4k for writes to /proc/<nr>/[ug]id_map */ /* The kernel only takes <= 4k for writes to
* /proc/<nr>/[ug]id_map
*/
map = iterator->elem; map = iterator->elem;
if (map->idtype != type) if (map->idtype != type)
continue; continue;
had_entry = 1; had_entry = true;
left = 4096 - (pos - buf);
left = LXC_IDMAPLEN - (pos - buf);
fill = snprintf(pos, left, "%s%lu %lu %lu%s", fill = snprintf(pos, left, "%s%lu %lu %lu%s",
use_shadow ? " " : "", use_shadow ? " " : "", map->nsid,
map->nsid, map->hostid, map->range, map->hostid, map->range,
use_shadow ? "" : "\n"); use_shadow ? "" : "\n");
if (fill <= 0 || fill >= left) if (fill <= 0 || fill >= left)
SYSERROR("snprintf failed, too many mappings"); SYSERROR("Too many {g,u}id mappings defined.");
pos += fill; pos += fill;
} }
if (!had_entry) if (!had_entry)
continue; continue;
if (!use_shadow) { if (!use_shadow) {
ret = write_id_mapping(type, pid, buf, pos-buf); ret = write_id_mapping(type, pid, buf, pos - buf);
} else { } else {
left = 4096 - (pos - buf); left = LXC_IDMAPLEN - (pos - buf);
fill = snprintf(pos, left, "\n"); fill = snprintf(pos, left, "\n");
if (fill <= 0 || fill >= left) if (fill <= 0 || fill >= left)
SYSERROR("snprintf failed, too many mappings"); SYSERROR("Too many {g,u}id mappings defined.");
pos += fill; pos += fill;
ret = system(buf); ret = system(buf);
} }
if (ret) if (ret)
break; break;
} }

View File

@ -39,6 +39,7 @@
/* Maximum number for 64 bit integer is a string with 21 digits: 2^64 - 1 = 21 */ /* Maximum number for 64 bit integer is a string with 21 digits: 2^64 - 1 = 21 */
#define LXC_NUMSTRLEN64 21 #define LXC_NUMSTRLEN64 21
#define LXC_LINELEN 4096 #define LXC_LINELEN 4096
#define LXC_IDMAPLEN 4096
/* returns 1 on success, 0 if there were any failures */ /* returns 1 on success, 0 if there were any failures */
extern int lxc_rmdir_onedev(char *path, const char *exclude); extern int lxc_rmdir_onedev(char *path, const char *exclude);