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

Reply via email to