Print this page
OS-4361 libzonecfg should be aware of branded zone native root
Reviewed by: Robert Mustacchi <rm@joyent.com>

*** 18,27 **** --- 18,28 ---- * * CDDL HEADER END */ /* * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright 2015 Joyent, Inc. */ /* * This module contains functions used for reading and writing the index file.
*** 168,189 **** return (ze); } static boolean_t ! get_index_path(char *path) { ! return (snprintf(path, MAXPATHLEN, "%s%s", zonecfg_root, ! ZONE_INDEX_FILE) < MAXPATHLEN); } FILE * setzoneent(void) { char path[MAXPATHLEN]; ! if (!get_index_path(path)) { errno = EINVAL; return (NULL); } return (fopen(path, "r")); } --- 169,212 ---- return (ze); } static boolean_t ! path_common(char *path, size_t path_size, const char *stem) { ! const char *native_root = zone_get_nroot(); ! ! if (native_root == NULL || zonecfg_in_alt_root()) { ! /* ! * Do not prepend the native system root (e.g. "/native") if an ! * alternative configuration root has been selected. ! */ ! native_root = ""; ! } ! ! return (snprintf(path, path_size, "%s%s%s", native_root, zonecfg_root, ! stem) < path_size); } + static boolean_t + get_index_path(char *path, size_t path_size) + { + return (path_common(path, path_size, ZONE_INDEX_FILE)); + } + + static boolean_t + get_temp_path(char *path, size_t path_size) + { + return (path_common(path, path_size, _PATH_TMPFILE)); + } + FILE * setzoneent(void) { char path[MAXPATHLEN]; ! if (!get_index_path(path, sizeof (path))) { errno = EINVAL; return (NULL); } return (fopen(path, "r")); }
*** 200,211 **** { int lock_fd; struct flock lock; char path[MAXPATHLEN]; ! if (snprintf(path, sizeof (path), "%s%s", zonecfg_root, ! ZONE_INDEX_LOCK_DIR) >= sizeof (path)) return (-1); if ((mkdir(path, S_IRWXU) == -1) && errno != EEXIST) return (-1); if (strlcat(path, ZONE_INDEX_LOCK_FILE, sizeof (path)) >= sizeof (path)) --- 223,233 ---- { int lock_fd; struct flock lock; char path[MAXPATHLEN]; ! if (!path_common(path, sizeof (path), ZONE_INDEX_LOCK_DIR)) return (-1); if ((mkdir(path, S_IRWXU) == -1) && errno != EEXIST) return (-1); if (strlcat(path, ZONE_INDEX_LOCK_FILE, sizeof (path)) >= sizeof (path))
*** 267,283 **** */ int putzoneent(struct zoneent *ze, zoneent_op_t operation) { FILE *index_file, *tmp_file; ! char *tmp_file_name, buf[MAX_INDEX_LEN]; int tmp_file_desc, lock_fd, err; boolean_t exist, need_quotes; char *cp; char path[MAXPATHLEN]; char uuidstr[UUID_PRINTABLE_STRING_LENGTH]; ! size_t tlen, namelen; const char *zone_name, *zone_state, *zone_path, *zone_uuid; assert(ze != NULL); /* --- 289,306 ---- */ int putzoneent(struct zoneent *ze, zoneent_op_t operation) { FILE *index_file, *tmp_file; ! char buf[MAX_INDEX_LEN]; int tmp_file_desc, lock_fd, err; boolean_t exist, need_quotes; char *cp; + char tmp_path[MAXPATHLEN]; char path[MAXPATHLEN]; char uuidstr[UUID_PRINTABLE_STRING_LENGTH]; ! size_t namelen; const char *zone_name, *zone_state, *zone_path, *zone_uuid; assert(ze != NULL); /*
*** 297,320 **** return (Z_INVAL); if ((lock_fd = lock_index_file()) == -1) return (Z_LOCKING_FILE); ! /* using sizeof gives us room for the terminating NUL byte as well */ ! tlen = sizeof (_PATH_TMPFILE) + strlen(zonecfg_root); ! tmp_file_name = malloc(tlen); ! if (tmp_file_name == NULL) { (void) unlock_index_file(lock_fd); return (Z_NOMEM); } - (void) snprintf(tmp_file_name, tlen, "%s%s", zonecfg_root, - _PATH_TMPFILE); ! tmp_file_desc = mkstemp(tmp_file_name); if (tmp_file_desc == -1) { ! (void) unlink(tmp_file_name); ! free(tmp_file_name); (void) unlock_index_file(lock_fd); return (Z_TEMP_FILE); } (void) fchmod(tmp_file_desc, ZONE_INDEX_MODE); (void) fchown(tmp_file_desc, ZONE_INDEX_UID, ZONE_INDEX_GID); --- 320,337 ---- return (Z_INVAL); if ((lock_fd = lock_index_file()) == -1) return (Z_LOCKING_FILE); ! if (!get_temp_path(tmp_path, sizeof (tmp_path))) { (void) unlock_index_file(lock_fd); return (Z_NOMEM); } ! tmp_file_desc = mkstemp(tmp_path); if (tmp_file_desc == -1) { ! (void) unlink(tmp_path); (void) unlock_index_file(lock_fd); return (Z_TEMP_FILE); } (void) fchmod(tmp_file_desc, ZONE_INDEX_MODE); (void) fchown(tmp_file_desc, ZONE_INDEX_UID, ZONE_INDEX_GID);
*** 321,331 **** if ((tmp_file = fdopen(tmp_file_desc, "w")) == NULL) { (void) close(tmp_file_desc); err = Z_MISC_FS; goto error; } ! if (!get_index_path(path)) { err = Z_MISC_FS; goto error; } if ((index_file = fopen(path, "r")) == NULL) { err = Z_MISC_FS; --- 338,348 ---- if ((tmp_file = fdopen(tmp_file_desc, "w")) == NULL) { (void) close(tmp_file_desc); err = Z_MISC_FS; goto error; } ! if (!get_index_path(path, sizeof (path))) { err = Z_MISC_FS; goto error; } if ((index_file = fopen(path, "r")) == NULL) { err = Z_MISC_FS;
*** 462,485 **** tmp_file = NULL; err = Z_MISC_FS; goto error; } tmp_file = NULL; ! if (rename(tmp_file_name, path) == -1) { err = errno == EACCES ? Z_ACCES : Z_MISC_FS; goto error; } - free(tmp_file_name); if (unlock_index_file(lock_fd) != Z_OK) return (Z_UNLOCKING_FILE); return (Z_OK); error: if (index_file != NULL) (void) fclose(index_file); if (tmp_file != NULL) (void) fclose(tmp_file); ! (void) unlink(tmp_file_name); ! free(tmp_file_name); (void) unlock_index_file(lock_fd); return (err); } --- 479,500 ---- tmp_file = NULL; err = Z_MISC_FS; goto error; } tmp_file = NULL; ! if (rename(tmp_path, path) == -1) { err = errno == EACCES ? Z_ACCES : Z_MISC_FS; goto error; } if (unlock_index_file(lock_fd) != Z_OK) return (Z_UNLOCKING_FILE); return (Z_OK); error: if (index_file != NULL) (void) fclose(index_file); if (tmp_file != NULL) (void) fclose(tmp_file); ! (void) unlink(tmp_path); (void) unlock_index_file(lock_fd); return (err); }