From patchwork Mon Mar 3 19:29:45 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Aneesh Kumar K.V" X-Patchwork-Id: 326045 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 55FA92C00C1 for ; Tue, 4 Mar 2014 06:30:36 +1100 (EST) Received: from localhost ([::1]:41418 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WKYZN-0006r5-33 for incoming@patchwork.ozlabs.org; Mon, 03 Mar 2014 14:30:33 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:52138) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WKYYq-0006hX-LU for qemu-devel@nongnu.org; Mon, 03 Mar 2014 14:30:08 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1WKYYj-0007Fe-2i for qemu-devel@nongnu.org; Mon, 03 Mar 2014 14:30:00 -0500 Received: from e28smtp08.in.ibm.com ([122.248.162.8]:39445) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WKYYi-0007FN-Hq for qemu-devel@nongnu.org; Mon, 03 Mar 2014 14:29:53 -0500 Received: from /spool/local by e28smtp08.in.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Tue, 4 Mar 2014 00:59:50 +0530 Received: from d28dlp03.in.ibm.com (9.184.220.128) by e28smtp08.in.ibm.com (192.168.1.138) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Tue, 4 Mar 2014 00:59:48 +0530 Received: from d28relay04.in.ibm.com (d28relay04.in.ibm.com [9.184.220.61]) by d28dlp03.in.ibm.com (Postfix) with ESMTP id B58111258053 for ; Tue, 4 Mar 2014 01:01:55 +0530 (IST) Received: from d28av05.in.ibm.com (d28av05.in.ibm.com [9.184.220.67]) by d28relay04.in.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id s23JTngp59113690 for ; Tue, 4 Mar 2014 00:59:50 +0530 Received: from d28av05.in.ibm.com (localhost [127.0.0.1]) by d28av05.in.ibm.com (8.14.4/8.14.4/NCO v10.0 AVout) with ESMTP id s23JTkdS009747 for ; Tue, 4 Mar 2014 00:59:46 +0530 Received: from skywalker.linux.vnet.ibm.com ([9.77.120.171]) by d28av05.in.ibm.com (8.14.4/8.14.4/NCO v10.0 AVin) with ESMTP id s23JTjYa009728 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO); Tue, 4 Mar 2014 00:59:46 +0530 From: "Aneesh Kumar K.V" To: Chen Gang , Markus Armbruster , aliguori@amazon.com, Eric Blake , "Daniel P. Berrange" In-Reply-To: <87d2i3xne9.fsf@linux.vnet.ibm.com> References: <52EF68CA.9060604@gmail.com> <20140203103429.GB10408@redhat.com> <52EF71DC.3000309@gmail.com> <52F0C8BA.7020709@gmail.com> <20140204110631.GD5632@redhat.com> <52F0CD67.5070601@gmail.com> <87siry3l7t.fsf@linux.vnet.ibm.com> <52F17B5E.1050602@gmail.com> <52FF3182.9090106@gmail.com> <53097D8E.1030803@gmail.com> <87sir850ho.fsf@blackfin.pond.sub.org> <87ha7o3c5x.fsf@blackfin.pond.sub.org> <530FCBAD.10305@gmail.com> <531219CC.4050505@gmail.com> <53121A12.5050105@gmail.com> <53121A4B.70308@gmail.com> <53121A93.8080301@gmail.com> <87d2i3xne9.fsf@linux.vnet.ibm.com> User-Agent: Notmuch/0.17+7~gc734dd75344e (http://notmuchmail.org) Emacs/24.3.1 (x86_64-pc-linux-gnu) Date: Tue, 04 Mar 2014 00:59:45 +0530 Message-ID: <871tyjxeqe.fsf@linux.vnet.ibm.com> MIME-Version: 1.0 X-TM-AS-MML: disable X-Content-Scanned: Fidelis XPS MAILER x-cbid: 14030319-2000-0000-0000-00000FFD2988 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.4.x-2.6.x [generic] X-Received-From: 122.248.162.8 Cc: QEMU Developers Subject: Re: [Qemu-devel] [PATCH 3/3] hw/9pfs: use g_strdup_printf() instead of PATH_MAX limitation X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org "Aneesh Kumar K.V" writes: > Chen Gang writes: > Can we keep this as > v9fs_co_run_in_worker( > { > > buf->data = __readlink(&s->ctx, path); > > } > > I can do that change for you if you want. I will also have to go through > the rest of the code to make sure we do free the memory in all error > path. So the rest of the review is going to take time. Hope that is ok > I ended up with the below diff on top. The resulting tree is pushed to https://github.com/kvaneesh/qemu/commits/for-upstream and pass all the tuxera tests. Let me know what you think. diff --git a/hw/9pfs/cofs.c b/hw/9pfs/cofs.c index 739bad019e3a..42ee614e27f0 100644 --- a/hw/9pfs/cofs.c +++ b/hw/9pfs/cofs.c @@ -17,42 +17,55 @@ #include "block/coroutine.h" #include "virtio-9p-coth.h" +static ssize_t __readlink(V9fsState *s, V9fsPath *path, V9fsString *buf) +{ + ssize_t len, maxlen = PATH_MAX; + + buf->data = g_malloc(PATH_MAX); + for(;;) { + len = s->ops->readlink(&s->ctx, path, buf->data, maxlen); + if (len < 0) { + g_free(buf->data); + buf->data = NULL; + buf->size = 0; + break; + } else if (len == maxlen) { + /* + * We dodn't have space to put the NULL or we have more + * to read. Increase the size and try again + */ + maxlen *= 2; + g_free(buf->data); + buf->data = g_malloc(maxlen); + continue; + } + /* + * Null terminate the readlink output + */ + buf->data[len] = '\0'; + buf->size = len; + break; + } + return len; +} + int v9fs_co_readlink(V9fsPDU *pdu, V9fsPath *path, V9fsString *buf) { int err; - ssize_t len, maxlen = PATH_MAX; V9fsState *s = pdu->s; if (v9fs_request_cancelled(pdu)) { return -EINTR; } - buf->data = g_malloc(maxlen); v9fs_path_read_lock(s); v9fs_co_run_in_worker( - while (1) { - len = s->ops->readlink(&s->ctx, path, - buf->data, maxlen - 1); - if (len == maxlen - 1) { - g_free(buf->data); - maxlen *= 2; - buf->data = g_malloc(maxlen); - continue; - } - if (len > -1) { - buf->size = len; - buf->data[len] = 0; - err = 0; - } else { + { + err = __readlink(s, path, buf); + if (err < 0) { err = -errno; } - break; }); v9fs_path_unlock(s); - if (err) { - g_free(buf->data); - buf->data = NULL; - buf->size = 0; - } return err; } diff --git a/hw/9pfs/virtio-9p-local.c b/hw/9pfs/virtio-9p-local.c index 9e9cc319ec54..56b302c122b6 100644 --- a/hw/9pfs/virtio-9p-local.c +++ b/hw/9pfs/virtio-9p-local.c @@ -125,8 +125,7 @@ static int local_lstat(FsContext *fs_ctx, V9fsPath *fs_path, struct stat *stbuf) buffer = rpath(fs_ctx, path); err = lstat(buffer, stbuf); if (err) { - g_free(buffer); - return err; + goto err_out; } if (fs_ctx->export_flags & V9FS_SM_MAPPED) { /* Actual credentials are part of extended attrs */ @@ -151,6 +150,7 @@ static int local_lstat(FsContext *fs_ctx, V9fsPath *fs_path, struct stat *stbuf) local_mapped_file_attr(fs_ctx, path, stbuf); } +err_out: g_free(buffer); return err; }