X-Git-Url: https://git.camperquake.de/gitweb.cgi?a=blobdiff_plain;f=lib%2Flibzpool%2Fkernel.c;h=494e544ea7f8ba8746f0909f2de0921e1b0a1e4f;hb=f1fb119f6bb0c3185ec88912e4488fdd9ec08ab2;hp=4bd08cdd450e0fe193db076cae19d0c1864b1a3f;hpb=1e33ac1e2677c898a0b5ef6207048c692cb51bf4;p=zfs.git diff --git a/lib/libzpool/kernel.c b/lib/libzpool/kernel.c index 4bd08cd..494e544 100644 --- a/lib/libzpool/kernel.c +++ b/lib/libzpool/kernel.c @@ -517,10 +517,12 @@ vn_open(char *path, int x1, int flags, int mode, vnode_t **vpp, int x2, int x3) int fd; vnode_t *vp; int old_umask; - char realpath[MAXPATHLEN]; + char *realpath; struct stat64 st; int err; + realpath = umem_alloc(MAXPATHLEN, UMEM_NOFAIL); + /* * If we're accessing a real disk from userland, we need to use * the character interface to avoid caching. This is particularly @@ -534,11 +536,16 @@ vn_open(char *path, int x1, int flags, int mode, vnode_t **vpp, int x2, int x3) if (strncmp(path, "/dev/", 5) == 0) { char *dsk; fd = open64(path, O_RDONLY); - if (fd == -1) - return (errno); + if (fd == -1) { + err = errno; + free(realpath); + return (err); + } if (fstat64(fd, &st) == -1) { + err = errno; close(fd); - return (errno); + free(realpath); + return (err); } close(fd); (void) sprintf(realpath, "%s", path); @@ -548,8 +555,11 @@ vn_open(char *path, int x1, int flags, int mode, vnode_t **vpp, int x2, int x3) dsk + 1); } else { (void) sprintf(realpath, "%s", path); - if (!(flags & FCREAT) && stat64(realpath, &st) == -1) - return (errno); + if (!(flags & FCREAT) && stat64(realpath, &st) == -1) { + err = errno; + free(realpath); + return (err); + } } if (flags & FCREAT) @@ -560,6 +570,7 @@ vn_open(char *path, int x1, int flags, int mode, vnode_t **vpp, int x2, int x3) * FREAD and FWRITE to the corresponding O_RDONLY, O_WRONLY, and O_RDWR. */ fd = open64(realpath, flags - FREAD, mode); + free(realpath); if (flags & FCREAT) (void) umask(old_umask); @@ -1096,25 +1107,27 @@ ksiddomain_rele(ksiddomain_t *ksid) umem_free(ksid, sizeof (ksiddomain_t)); } -/* - * Do not change the length of the returned string; it must be freed - * with strfree(). - */ char * -kmem_asprintf(const char *fmt, ...) +kmem_vasprintf(const char *fmt, va_list adx) { - int size; - va_list adx; - char *buf; + char *buf = NULL; + va_list adx_copy; - va_start(adx, fmt); - size = vsnprintf(NULL, 0, fmt, adx) + 1; - va_end(adx); + va_copy(adx_copy, adx); + VERIFY(vasprintf(&buf, fmt, adx_copy) != -1); + va_end(adx_copy); + + return (buf); +} - buf = kmem_alloc(size, KM_SLEEP); +char * +kmem_asprintf(const char *fmt, ...) +{ + char *buf = NULL; + va_list adx; va_start(adx, fmt); - size = vsnprintf(buf, size, fmt, adx); + VERIFY(vasprintf(&buf, fmt, adx) != -1); va_end(adx); return (buf);