From: Anthony Liguori <anthony@codemonkey.ws>
To: Jim Meyering <jim@meyering.net>
Cc: qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [PATCH] don't dereference NULL after failed strdup
Date: Wed, 10 Feb 2010 15:41:34 -0600 [thread overview]
Message-ID: <4B73280E.808@codemonkey.ws> (raw)
In-Reply-To: <87fx5br38p.fsf@meyering.net>
On 02/08/2010 12:28 PM, Jim Meyering wrote:
> Most of these are obvious NULL-deref bug fixes, for example,
> the ones in these files:
>
> block/curl.c
> net.c
> slirp/misc.c
>
> and the first one in block/vvfat.c.
> The others in block/vvfat.c may not lead to an immediate segfault, but I
> traced the two schedule_rename(..., strdup(path)) uses, and a failed
> strdup would appear to trigger this assertion in handle_renames_and_mkdirs:
>
> assert(commit->path);
>
> The conversion to use qemu_strdup in envlist_to_environ is not technically
> needed, but does avoid a theoretical leak in the caller when strdup fails
> for one value, but later succeeds in allocating another buffer(plausible,
> if one string length is much larger than the others). The caller does
> not know the length of the returned list, and as such can only free
> pointers until it hits the first NULL. If there are non-NULL pointers
> beyond the first, their buffers would be leaked. This one is admittedly
> far-fetched.
>
> The two in linux-user/main.c are worth fixing to ensure that an
> OOM error is diagnosed up front, rather than letting it provoke some
> harder-to-diagnose secondary error, in case of exec failure, or worse, in
> case the exec succeeds but with an invalid list of command line options.
> However, considering how unlikely it is to encounter a failed strdup early
> in main, this isn't a big deal. Note that adding the required uses of
> qemu_strdup here and in envlist.c induce link failures because qemu_strdup
> is not currently in any library they're linked with. So for now, I've
> omitted those changes, as well as the fixes in target-i386/helper.c
> and target-sparc/helper.c.
>
> If you'd like to see the above discussion (or anything else)
> in the commit log, just let me know and I'll be happy to adjust.
>
>
> > From 9af42864fd1ea666bd25e2cecfdfae74c20aa8c7 Mon Sep 17 00:00:00 2001
> From: Jim Meyering<meyering@redhat.com>
> Date: Mon, 8 Feb 2010 18:29:29 +0100
> Subject: [PATCH] don't dereference NULL after failed strdup
>
> Handle failing strdup by replacing each use with qemu_strdup,
> so as not to dereference NULL or trigger a failing assertion.
> * block/curl.c (curl_open): s/\bstrdup\b/qemu_strdup/
> * block/vvfat.c (init_directories): Likewise.
> (get_cluster_count_for_direntry, check_directory_consistency): Likewise.
> * net.c (parse_host_src_port): Likewise.
>
Applied, but this got ugly in git am. FYI, if you want to include
comments with a patch that aren't in the git commit message, you can use
a '---' separator just like with diffstat below.
Regards,
Anthony Liguori
> * slirp/misc.c (fork_exec): Likewise.
> ---
> block/curl.c | 2 +-
> block/vvfat.c | 10 +++++-----
> net.c | 2 +-
> slirp/misc.c | 2 +-
> 4 files changed, 8 insertions(+), 8 deletions(-)
>
> diff --git a/block/curl.c b/block/curl.c
> index fe08f7b..2cf72cb 100644
> --- a/block/curl.c
> +++ b/block/curl.c
> @@ -309,7 +309,7 @@ static int curl_open(BlockDriverState *bs, const char *filename, int flags)
>
> static int inited = 0;
>
> - file = strdup(filename);
> + file = qemu_strdup(filename);
> s->readahead_size = READ_AHEAD_SIZE;
>
> /* Parse a trailing ":readahead=#:" param, if present. */
> diff --git a/block/vvfat.c b/block/vvfat.c
> index d2787b9..bb707c0 100644
> --- a/block/vvfat.c
> +++ b/block/vvfat.c
> @@ -883,7 +883,7 @@ static int init_directories(BDRVVVFATState* s,
> mapping->dir_index = 0;
> mapping->info.dir.parent_mapping_index = -1;
> mapping->first_mapping_index = -1;
> - mapping->path = strdup(dirname);
> + mapping->path = qemu_strdup(dirname);
> i = strlen(mapping->path);
> if (i> 0&& mapping->path[i - 1] == '/')
> mapping->path[i - 1] = '\0';
> @@ -1633,10 +1633,10 @@ static uint32_t get_cluster_count_for_direntry(BDRVVVFATState* s,
>
> /* rename */
> if (strcmp(basename, basename2))
> - schedule_rename(s, cluster_num, strdup(path));
> + schedule_rename(s, cluster_num, qemu_strdup(path));
> } else if (is_file(direntry))
> /* new file */
> - schedule_new_file(s, strdup(path), cluster_num);
> + schedule_new_file(s, qemu_strdup(path), cluster_num);
> else {
> assert(0);
> return 0;
> @@ -1753,10 +1753,10 @@ static int check_directory_consistency(BDRVVVFATState *s,
> mapping->mode&= ~MODE_DELETED;
>
> if (strcmp(basename, basename2))
> - schedule_rename(s, cluster_num, strdup(path));
> + schedule_rename(s, cluster_num, qemu_strdup(path));
> } else
> /* new directory */
> - schedule_mkdir(s, cluster_num, strdup(path));
> + schedule_mkdir(s, cluster_num, qemu_strdup(path));
>
> lfn_init(&lfn);
> do {
> diff --git a/net.c b/net.c
> index 6ef93e6..8e951ca 100644
> --- a/net.c
> +++ b/net.c
> @@ -96,7 +96,7 @@ int parse_host_src_port(struct sockaddr_in *haddr,
> struct sockaddr_in *saddr,
> const char *input_str)
> {
> - char *str = strdup(input_str);
> + char *str = qemu_strdup(input_str);
> char *host_str = str;
> char *src_str;
> const char *src_str2;
> diff --git a/slirp/misc.c b/slirp/misc.c
> index 05f4fb3..dcb1dc1 100644
> --- a/slirp/misc.c
> +++ b/slirp/misc.c
> @@ -179,7 +179,7 @@ fork_exec(struct socket *so, const char *ex, int do_pty)
> close(s);
>
> i = 0;
> - bptr = strdup(ex); /* No need to free() this */
> + bptr = qemu_strdup(ex); /* No need to free() this */
> if (do_pty == 1) {
> /* Setup "slirp.telnetd -x" */
> argv[i++] = "slirp.telnetd";
> --
> 1.7.0.rc2.156.g2ac04
>
>
>
>
prev parent reply other threads:[~2010-02-10 21:41 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-02-08 18:28 [Qemu-devel] [PATCH] don't dereference NULL after failed strdup Jim Meyering
2010-02-10 21:41 ` Anthony Liguori [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4B73280E.808@codemonkey.ws \
--to=anthony@codemonkey.ws \
--cc=jim@meyering.net \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).