[PATCH] mount: redo nfs error printing, fix memory leak (0 bytes)
Denys Vlasenko
vda.linux at googlemail.com
Thu Oct 28 19:48:39 UTC 2010
On Wednesday 27 October 2010 15:33, Alexander Shishkin wrote:
> -/* Convert each NFSERR_BLAH into EBLAH */
> +/* Convert each NFSERR_BLAH into EBLAH, null-terminated so that it
> + * can be searched with strchr() */
> static const uint8_t nfs_err_stat[] = {
> 1, 2, 5, 6, 13, 17,
> 19, 20, 21, 22, 27, 28,
> - 30, 63, 66, 69, 70, 71
> + 30, 63, 66, 69, 70, 71, 0
> };
> #if ( \
> EPERM | ENOENT | EIO | ENXIO | EACCES| EEXIST | \
> @@ -768,15 +769,18 @@ 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_error_msg(char *hostname, char *path, unsigned int status)
> {
> - int i;
> + uint8_t *r;
> + char *reason = "unknown nfs status";
>
> - 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);
> + r = strchr(nfs_err_stat, status);
Bug. For example, status 257 will be interpreted as status 1
due to truncation to char in call to strchr.
> + if (r)
> + reason = strerror(nfs_err_errnum[r - nfs_err_stat]);
> +
> + bb_error_msg("%s:%s failed, reason given by server: %s (%d)", hostname, path,
> + reason, status);
> }
>
> static bool_t xdr_fhandle(XDR *xdrs, fhandle objp)
> @@ -1457,9 +1461,7 @@ 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));
> + nfs_error_msg(hostname, pathname, status.nfsv2.fhs_status);
> goto fail;
> }
Hmmm... it is possible to fold "!= 0" check into nfs_error_msg(),
so that code looks simply like this:
if (emit_nfs_error_msg(hostname, pathname, status.nfsv2.fhs_status))
goto fail; /* fhs_status != 0, message was printed */
...
> 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));
> + nfs_error_msg(hostname, pathname, status.nfsv3.fhs_status);
> goto fail;
> }
in both places -> likely smaller code.
--
vda
More information about the busybox
mailing list