diff options
Diffstat (limited to 'usr/src/lib')
-rw-r--r-- | usr/src/lib/libproc/common/proc_fd.c | 6 | ||||
-rw-r--r-- | usr/src/lib/libsmbios/common/mapfile-vers | 2 | ||||
-rw-r--r-- | usr/src/lib/libzfs/common/libzfs.h | 3 | ||||
-rw-r--r-- | usr/src/lib/libzfs/common/libzfs_pool.c | 22 |
4 files changed, 21 insertions, 12 deletions
diff --git a/usr/src/lib/libproc/common/proc_fd.c b/usr/src/lib/libproc/common/proc_fd.c index e491934c16..6d5c09315a 100644 --- a/usr/src/lib/libproc/common/proc_fd.c +++ b/usr/src/lib/libproc/common/proc_fd.c @@ -155,7 +155,8 @@ proc_get_fdinfo(pid_t pid, int fd) break; } - if ((l = read(ifd, info, st.st_size)) == -1) { + if (lseek(ifd, 0, SEEK_SET) != 0 || + (l = read(ifd, info, st.st_size)) == -1) { err = errno; break; } @@ -164,6 +165,9 @@ proc_get_fdinfo(pid_t pid, int fd) off = offsetof(prfdinfo_t, pr_misc); + if (l < off + sizeof (pr_misc_header_t)) + continue; + while (off <= l - sizeof (pr_misc_header_t)) { pr_misc_header_t *misc; diff --git a/usr/src/lib/libsmbios/common/mapfile-vers b/usr/src/lib/libsmbios/common/mapfile-vers index dd09785fe3..1016220cd7 100644 --- a/usr/src/lib/libsmbios/common/mapfile-vers +++ b/usr/src/lib/libsmbios/common/mapfile-vers @@ -43,6 +43,7 @@ $mapfile_version 2 SYMBOL_VERSION SUNWprivate_1.1 { global: _smb_debug; + smbios_battery_chem_desc; smbios_bboard_flag_desc; smbios_bboard_flag_name; smbios_bboard_type_desc; @@ -80,6 +81,7 @@ SYMBOL_VERSION SUNWprivate_1.1 { smbios_evlog_method_desc; smbios_fdopen; smbios_hwsec_desc; + smbios_info_battery; smbios_info_bboard; smbios_info_bios; smbios_info_boot; diff --git a/usr/src/lib/libzfs/common/libzfs.h b/usr/src/lib/libzfs/common/libzfs.h index 22d04862c7..483f2c7db6 100644 --- a/usr/src/lib/libzfs/common/libzfs.h +++ b/usr/src/lib/libzfs/common/libzfs.h @@ -461,7 +461,8 @@ typedef enum { extern char *zpool_vdev_name(libzfs_handle_t *, zpool_handle_t *, nvlist_t *, int name_flags); extern int zpool_upgrade(zpool_handle_t *, uint64_t); -extern int zpool_get_history(zpool_handle_t *, nvlist_t **); +extern int zpool_get_history(zpool_handle_t *, nvlist_t **, uint64_t *, + boolean_t *); extern int zpool_history_unpack(char *, uint64_t, uint64_t *, nvlist_t ***, uint_t *); extern void zpool_obj_to_path(zpool_handle_t *, uint64_t, uint64_t, char *, diff --git a/usr/src/lib/libzfs/common/libzfs_pool.c b/usr/src/lib/libzfs/common/libzfs_pool.c index 82e5c0f72d..ae8d607b6c 100644 --- a/usr/src/lib/libzfs/common/libzfs_pool.c +++ b/usr/src/lib/libzfs/common/libzfs_pool.c @@ -4346,33 +4346,37 @@ zpool_history_unpack(char *buf, uint64_t bytes_read, uint64_t *leftover, * Retrieve the command history of a pool. */ int -zpool_get_history(zpool_handle_t *zhp, nvlist_t **nvhisp) +zpool_get_history(zpool_handle_t *zhp, nvlist_t **nvhisp, uint64_t *off, + boolean_t *eof) { char *buf; int buflen = 128 * 1024; - uint64_t off = 0; nvlist_t **records = NULL; uint_t numrecords = 0; - int err, i; + int err = 0, i; + uint64_t start = *off; buf = malloc(buflen); if (buf == NULL) return (ENOMEM); - do { + /* process about 1MB a time */ + while (*off - start < 1024 * 1024) { uint64_t bytes_read = buflen; uint64_t leftover; - if ((err = get_history(zhp, buf, &off, &bytes_read)) != 0) + if ((err = get_history(zhp, buf, off, &bytes_read)) != 0) break; /* if nothing else was read in, we're at EOF, just return */ - if (!bytes_read) + if (!bytes_read) { + *eof = B_TRUE; break; + } if ((err = zpool_history_unpack(buf, bytes_read, &leftover, &records, &numrecords)) != 0) break; - off -= leftover; + *off -= leftover; if (leftover == bytes_read) { /* * no progress made, because buffer is not big enough @@ -4384,9 +4388,7 @@ zpool_get_history(zpool_handle_t *zhp, nvlist_t **nvhisp) if (buf == NULL) return (ENOMEM); } - - /* CONSTCOND */ - } while (1); + } free(buf); |