nfs_strerror() leaks memory allocated by xasprintf(), which never gets free()'d.
function old new delta nfs_print_strerror - 118 +118 nfsmount 5473 5467 -6 .rodata 475927 475919 -8 xdr_mountstat3 54 38 -16 xdr_mountres3_ok 118 102 -16 xdr_fhandle3 69 53 -16 xdr_fhandle 59 43 -16 xdr_dirpath 59 43 -16 nfs_strerror 105 - -105 ------------------------------------------------------------------------------ (add/remove: 1/1 grow/shrink: 0/7 up/down: 118/-199) Total: -81 bytes Signed-off-by: Alexander Shishkin <[email protected]> --- util-linux/mount.c | 62 +++++++++++++++++++++------------------------------- 1 files changed, 25 insertions(+), 37 deletions(-) diff --git a/util-linux/mount.c b/util-linux/mount.c index 5e85f99..75a793f 100644 --- a/util-linux/mount.c +++ b/util-linux/mount.c @@ -762,22 +762,22 @@ static const nfs_err_type nfs_err_errnum[] = { ENODEV, ENOTDIR , EISDIR , EINVAL, EFBIG , ENOSPC, EROFS , ENAMETOOLONG, ENOTEMPTY, EDQUOT, ESTALE, EREMOTE }; -static char *nfs_strerror(int status) +static void nfs_print_strerror(int status) { int i; - for (i = 0; i < ARRAY_SIZE(nfs_err_stat); i++) { - if (nfs_err_stat[i] == status) - return strerror(nfs_err_errnum[i]); - } - return xasprintf("unknown nfs status return value: %d", status); + for (i = 0; i < ARRAY_SIZE(nfs_err_stat) && nfs_err_stat[i] != status; + i++) + ; + + bb_error_msg("%s (%d)", i == ARRAY_SIZE(nfs_err_stat) ? + "unknown nfs status return value" : + strerror(nfs_err_errnum[i]), status); } static bool_t xdr_fhandle(XDR *xdrs, fhandle objp) { - if (!xdr_opaque(xdrs, objp, FHSIZE)) - return FALSE; - return TRUE; + return xdr_opaque(xdrs, objp, FHSIZE); } static bool_t xdr_fhstatus(XDR *xdrs, fhstatus *objp) @@ -797,42 +797,30 @@ static bool_t xdr_fhstatus(XDR *xdrs, fhstatus *objp) static bool_t xdr_dirpath(XDR *xdrs, dirpath *objp) { - if (!xdr_string(xdrs, objp, MNTPATHLEN)) - return FALSE; - return TRUE; + return xdr_string(xdrs, objp, MNTPATHLEN); } static bool_t xdr_fhandle3(XDR *xdrs, fhandle3 *objp) { - if (!xdr_bytes(xdrs, (char **)&objp->fhandle3_val, - (unsigned int *) &objp->fhandle3_len, - FHSIZE3) - ) { - return FALSE; - } - return TRUE; + return xdr_bytes(xdrs, (char **)&objp->fhandle3_val, + (unsigned int *) &objp->fhandle3_len, + FHSIZE3); } static bool_t xdr_mountres3_ok(XDR *xdrs, mountres3_ok *objp) { if (!xdr_fhandle3(xdrs, &objp->fhandle)) return FALSE; - if (!xdr_array(xdrs, &(objp->auth_flavours.auth_flavours_val), - &(objp->auth_flavours.auth_flavours_len), - ~0, - sizeof(int), - (xdrproc_t) xdr_int) - ) { - return FALSE; - } - return TRUE; + return xdr_array(xdrs, &(objp->auth_flavours.auth_flavours_val), + &(objp->auth_flavours.auth_flavours_len), + ~0, + sizeof(int), + (xdrproc_t) xdr_int); } static bool_t xdr_mountstat3(XDR *xdrs, mountstat3 *objp) { - if (!xdr_enum(xdrs, (enum_t *) objp)) - return FALSE; - return TRUE; + return xdr_enum(xdrs, (enum_t *) objp); } static bool_t xdr_mountres3(XDR *xdrs, mountres3 *objp) @@ -1477,9 +1465,9 @@ static NOINLINE int nfsmount(struct mntent *mp, long vfsflags, char *filteropts) if (nfsvers == 2) { if (status.nfsv2.fhs_status != 0) { - bb_error_msg("%s:%s failed, reason given by server: %s", - hostname, pathname, - nfs_strerror(status.nfsv2.fhs_status)); + bb_error_msg("%s:%s failed, reason given by server:", + hostname, pathname); + nfs_print_strerror(status.nfsv2.fhs_status); goto fail; } memcpy(data.root.data, @@ -1492,9 +1480,9 @@ static NOINLINE int nfsmount(struct mntent *mp, long vfsflags, char *filteropts) } else { fhandle3 *my_fhandle; if (status.nfsv3.fhs_status != 0) { - bb_error_msg("%s:%s failed, reason given by server: %s", - hostname, pathname, - nfs_strerror(status.nfsv3.fhs_status)); + bb_error_msg("%s:%s failed, reason given by server:", + hostname, pathname); + nfs_print_strerror(status.nfsv3.fhs_status); goto fail; } my_fhandle = &status.nfsv3.mountres3_u.mountinfo.fhandle; -- 1.7.2.1.45.gb66c2 _______________________________________________ busybox mailing list [email protected] http://lists.busybox.net/mailman/listinfo/busybox
