qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCHv4 0/2] envlist.c: handle strdup failure
@ 2012-08-17 18:24 Jim Meyering
  2012-08-17 18:24 ` [Qemu-devel] [PATCHv4 1/2] envlist.c: conform to QEMU's coding style Jim Meyering
  2012-08-17 18:24 ` [Qemu-devel] [PATCHv4 2/2] envlist.c: handle strdup failure Jim Meyering
  0 siblings, 2 replies; 5+ messages in thread
From: Jim Meyering @ 2012-08-17 18:24 UTC (permalink / raw)
  To: qemu-devel; +Cc: Jim Meyering

From: Jim Meyering <meyering@redhat.com>

Differences from v3 (no semantic change):
  - change 1/2 so this file conforms more closely to QEMU's coding style,
    by adding braces around each one-line if body (there was no one-line
    else- or while-block).
  - move an indentation correction from 2/2 into 1/2

Jim Meyering (2):
  envlist.c: conform to QEMU's coding style
  envlist.c: handle strdup failure

 envlist.c | 284 +++++++++++++++++++++++++++++++++-----------------------------
 1 file changed, 152 insertions(+), 132 deletions(-)

--
1.7.12.rc2

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [Qemu-devel] [PATCHv4 1/2] envlist.c: conform to QEMU's coding style
  2012-08-17 18:24 [Qemu-devel] [PATCHv4 0/2] envlist.c: handle strdup failure Jim Meyering
@ 2012-08-17 18:24 ` Jim Meyering
  2012-08-19 13:17   ` [Qemu-devel] [PATCH for-1.2? v4 " Andreas Färber
  2012-08-17 18:24 ` [Qemu-devel] [PATCHv4 2/2] envlist.c: handle strdup failure Jim Meyering
  1 sibling, 1 reply; 5+ messages in thread
From: Jim Meyering @ 2012-08-17 18:24 UTC (permalink / raw)
  To: qemu-devel; +Cc: Jim Meyering

From: Jim Meyering <meyering@redhat.com>

Convert each TAB(width-4) to equivalent spaces.
Put braces around each one-line if-body.

Signed-off-by: Jim Meyering <meyering@redhat.com>
---
 envlist.c | 268 ++++++++++++++++++++++++++++++++------------------------------
 1 file changed, 140 insertions(+), 128 deletions(-)

diff --git a/envlist.c b/envlist.c
index f2303cd..230596f 100644
--- a/envlist.c
+++ b/envlist.c
@@ -8,13 +8,13 @@
 #include "envlist.h"

 struct envlist_entry {
-	const char *ev_var;			/* actual env value */
-	QLIST_ENTRY(envlist_entry) ev_link;
+    const char *ev_var;         /* actual env value */
+    QLIST_ENTRY(envlist_entry) ev_link;
 };

 struct envlist {
-	QLIST_HEAD(, envlist_entry) el_entries;	/* actual entries */
-	size_t el_count;			/* number of entries */
+    QLIST_HEAD(, envlist_entry) el_entries; /* actual entries */
+    size_t el_count;            /* number of entries */
 };

 static int envlist_parse(envlist_t *envlist,
@@ -27,15 +27,16 @@ static int envlist_parse(envlist_t *envlist,
 envlist_t *
 envlist_create(void)
 {
-	envlist_t *envlist;
+    envlist_t *envlist;

-	if ((envlist = malloc(sizeof (*envlist))) == NULL)
-		return (NULL);
+    if ((envlist = malloc(sizeof(*envlist))) == NULL) {
+        return NULL;
+    }

-	QLIST_INIT(&envlist->el_entries);
-	envlist->el_count = 0;
+    QLIST_INIT(&envlist->el_entries);
+    envlist->el_count = 0;

-	return (envlist);
+    return envlist;
 }

 /*
@@ -44,18 +45,18 @@ envlist_create(void)
 void
 envlist_free(envlist_t *envlist)
 {
-	struct envlist_entry *entry;
+    struct envlist_entry *entry;

-	assert(envlist != NULL);
+    assert(envlist != NULL);

-	while (envlist->el_entries.lh_first != NULL) {
-		entry = envlist->el_entries.lh_first;
-		QLIST_REMOVE(entry, ev_link);
+    while (envlist->el_entries.lh_first != NULL) {
+        entry = envlist->el_entries.lh_first;
+        QLIST_REMOVE(entry, ev_link);

-		free((char *)entry->ev_var);
-		free(entry);
-	}
-	free(envlist);
+        free((char *)entry->ev_var);
+        free(entry);
+    }
+    free(envlist);
 }

 /*
@@ -72,7 +73,7 @@ envlist_free(envlist_t *envlist)
 int
 envlist_parse_set(envlist_t *envlist, const char *env)
 {
-	return (envlist_parse(envlist, env, &envlist_setenv));
+    return envlist_parse(envlist, env, &envlist_setenv);
 }

 /*
@@ -84,7 +85,7 @@ envlist_parse_set(envlist_t *envlist, const char *env)
 int
 envlist_parse_unset(envlist_t *envlist, const char *env)
 {
-	return (envlist_parse(envlist, env, &envlist_unsetenv));
+    return envlist_parse(envlist, env, &envlist_unsetenv);
 }

 /*
@@ -97,32 +98,34 @@ static int
 envlist_parse(envlist_t *envlist, const char *env,
     int (*callback)(envlist_t *, const char *))
 {
-	char *tmpenv, *envvar;
-	char *envsave = NULL;
-
-	assert(callback != NULL);
-
-	if ((envlist == NULL) || (env == NULL))
-		return (EINVAL);
-
-	/*
-	 * We need to make temporary copy of the env string
-	 * as strtok_r(3) modifies it while it tokenizes.
-	 */
-	if ((tmpenv = strdup(env)) == NULL)
-		return (errno);
-
-	envvar = strtok_r(tmpenv, ",", &envsave);
-	while (envvar != NULL) {
-		if ((*callback)(envlist, envvar) != 0) {
-			free(tmpenv);
-			return (errno);
-		}
-		envvar = strtok_r(NULL, ",", &envsave);
-	}
-
-	free(tmpenv);
-	return (0);
+    char *tmpenv, *envvar;
+    char *envsave = NULL;
+
+    assert(callback != NULL);
+
+    if ((envlist == NULL) || (env == NULL)) {
+        return EINVAL;
+    }
+
+    /*
+     * We need to make temporary copy of the env string
+     * as strtok_r(3) modifies it while it tokenizes.
+     */
+    if ((tmpenv = strdup(env)) == NULL) {
+        return errno;
+    }
+
+    envvar = strtok_r(tmpenv, ",", &envsave);
+    while (envvar != NULL) {
+        if ((*callback)(envlist, envvar) != 0) {
+            free(tmpenv);
+            return errno;
+        }
+        envvar = strtok_r(NULL, ",", &envsave);
+    }
+
+    free(tmpenv);
+    return 0;
 }

 /*
@@ -134,46 +137,50 @@ envlist_parse(envlist_t *envlist, const char *env,
 int
 envlist_setenv(envlist_t *envlist, const char *env)
 {
-	struct envlist_entry *entry = NULL;
-	const char *eq_sign;
-	size_t envname_len;
-
-	if ((envlist == NULL) || (env == NULL))
-		return (EINVAL);
-
-	/* find out first equals sign in given env */
-	if ((eq_sign = strchr(env, '=')) == NULL)
-		return (EINVAL);
-	envname_len = eq_sign - env + 1;
-
-	/*
-	 * If there already exists variable with given name
-	 * we remove and release it before allocating a whole
-	 * new entry.
-	 */
-	for (entry = envlist->el_entries.lh_first; entry != NULL;
-	    entry = entry->ev_link.le_next) {
-		if (strncmp(entry->ev_var, env, envname_len) == 0)
-			break;
-	}
-
-	if (entry != NULL) {
-		QLIST_REMOVE(entry, ev_link);
-		free((char *)entry->ev_var);
-		free(entry);
-	} else {
-		envlist->el_count++;
-	}
-
-	if ((entry = malloc(sizeof (*entry))) == NULL)
-		return (errno);
-	if ((entry->ev_var = strdup(env)) == NULL) {
-		free(entry);
-		return (errno);
-	}
-	QLIST_INSERT_HEAD(&envlist->el_entries, entry, ev_link);
-
-	return (0);
+    struct envlist_entry *entry = NULL;
+    const char *eq_sign;
+    size_t envname_len;
+
+    if ((envlist == NULL) || (env == NULL)) {
+        return EINVAL;
+    }
+
+    /* find out first equals sign in given env */
+    if ((eq_sign = strchr(env, '=')) == NULL) {
+        return EINVAL;
+    }
+    envname_len = eq_sign - env + 1;
+
+    /*
+     * If there already exists variable with given name
+     * we remove and release it before allocating a whole
+     * new entry.
+     */
+    for (entry = envlist->el_entries.lh_first; entry != NULL;
+         entry = entry->ev_link.le_next) {
+        if (strncmp(entry->ev_var, env, envname_len) == 0) {
+            break;
+        }
+    }
+
+    if (entry != NULL) {
+        QLIST_REMOVE(entry, ev_link);
+        free((char *)entry->ev_var);
+        free(entry);
+    } else {
+        envlist->el_count++;
+    }
+
+    if ((entry = malloc(sizeof(*entry))) == NULL) {
+        return errno;
+    }
+    if ((entry->ev_var = strdup(env)) == NULL) {
+        free(entry);
+        return errno;
+    }
+    QLIST_INSERT_HEAD(&envlist->el_entries, entry, ev_link);
+
+    return 0;
 }

 /*
@@ -183,34 +190,37 @@ envlist_setenv(envlist_t *envlist, const char *env)
 int
 envlist_unsetenv(envlist_t *envlist, const char *env)
 {
-	struct envlist_entry *entry;
-	size_t envname_len;
-
-	if ((envlist == NULL) || (env == NULL))
-		return (EINVAL);
-
-	/* env is not allowed to contain '=' */
-	if (strchr(env, '=') != NULL)
-		return (EINVAL);
-
-	/*
-	 * Find out the requested entry and remove
-	 * it from the list.
-	 */
-	envname_len = strlen(env);
-	for (entry = envlist->el_entries.lh_first; entry != NULL;
-	    entry = entry->ev_link.le_next) {
-		if (strncmp(entry->ev_var, env, envname_len) == 0)
-			break;
-	}
-	if (entry != NULL) {
-		QLIST_REMOVE(entry, ev_link);
-		free((char *)entry->ev_var);
-		free(entry);
-
-		envlist->el_count--;
-	}
-	return (0);
+    struct envlist_entry *entry;
+    size_t envname_len;
+
+    if ((envlist == NULL) || (env == NULL)) {
+        return EINVAL;
+    }
+
+    /* env is not allowed to contain '=' */
+    if (strchr(env, '=') != NULL) {
+        return EINVAL;
+    }
+
+    /*
+     * Find out the requested entry and remove
+     * it from the list.
+     */
+    envname_len = strlen(env);
+    for (entry = envlist->el_entries.lh_first; entry != NULL;
+         entry = entry->ev_link.le_next) {
+        if (strncmp(entry->ev_var, env, envname_len) == 0) {
+            break;
+        }
+    }
+    if (entry != NULL) {
+        QLIST_REMOVE(entry, ev_link);
+        free((char *)entry->ev_var);
+        free(entry);
+
+        envlist->el_count--;
+    }
+    return 0;
 }

 /*
@@ -226,21 +236,23 @@ envlist_unsetenv(envlist_t *envlist, const char *env)
 char **
 envlist_to_environ(const envlist_t *envlist, size_t *count)
 {
-	struct envlist_entry *entry;
-	char **env, **penv;
+    struct envlist_entry *entry;
+    char **env, **penv;

-	penv = env = malloc((envlist->el_count + 1) * sizeof (char *));
-	if (env == NULL)
-		return (NULL);
+    penv = env = malloc((envlist->el_count + 1) * sizeof(char *));
+    if (env == NULL) {
+        return NULL;
+    }

-	for (entry = envlist->el_entries.lh_first; entry != NULL;
-	    entry = entry->ev_link.le_next) {
-		*(penv++) = strdup(entry->ev_var);
-	}
-	*penv = NULL; /* NULL terminate the list */
+    for (entry = envlist->el_entries.lh_first; entry != NULL;
+         entry = entry->ev_link.le_next) {
+        *(penv++) = strdup(entry->ev_var);
+    }
+    *penv = NULL; /* NULL terminate the list */

-	if (count != NULL)
-		*count = envlist->el_count;
+    if (count != NULL) {
+        *count = envlist->el_count;
+    }

-	return (env);
+    return env;
 }
-- 
1.7.12.rc2

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [Qemu-devel] [PATCHv4 2/2] envlist.c: handle strdup failure
  2012-08-17 18:24 [Qemu-devel] [PATCHv4 0/2] envlist.c: handle strdup failure Jim Meyering
  2012-08-17 18:24 ` [Qemu-devel] [PATCHv4 1/2] envlist.c: conform to QEMU's coding style Jim Meyering
@ 2012-08-17 18:24 ` Jim Meyering
  2012-08-19 13:21   ` [Qemu-devel] [PATCH for-1.2? v4 " Andreas Färber
  1 sibling, 1 reply; 5+ messages in thread
From: Jim Meyering @ 2012-08-17 18:24 UTC (permalink / raw)
  To: qemu-devel; +Cc: Jim Meyering

From: Jim Meyering <meyering@redhat.com>

Without this, envlist_to_environ may silently fail to copy all
strings into the destination buffer, and both callers would leak
any env strings allocated after a failing strdup, because the
freeing code stops at the first NULL pointer.

Signed-off-by: Jim Meyering <meyering@redhat.com>
---
 envlist.c | 12 ++++++++++--
 1 file changed, 10 insertions(+), 2 deletions(-)

diff --git a/envlist.c b/envlist.c
index 230596f..cf3f2d8 100644
--- a/envlist.c
+++ b/envlist.c
@@ -245,8 +245,16 @@ envlist_to_environ(const envlist_t *envlist, size_t *count)
     }

     for (entry = envlist->el_entries.lh_first; entry != NULL;
-         entry = entry->ev_link.le_next) {
-        *(penv++) = strdup(entry->ev_var);
+         entry = entry->ev_link.le_next, penv++) {
+        *penv = strdup(entry->ev_var);
+        if (*penv == NULL) {
+            char **e = env;
+            while (e <= penv) {
+                free(*e++);
+            }
+            free(env);
+            return NULL;
+        }
     }
     *penv = NULL; /* NULL terminate the list */

-- 
1.7.12.rc2

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [Qemu-devel] [PATCH for-1.2? v4 1/2] envlist.c: conform to QEMU's coding style
  2012-08-17 18:24 ` [Qemu-devel] [PATCHv4 1/2] envlist.c: conform to QEMU's coding style Jim Meyering
@ 2012-08-19 13:17   ` Andreas Färber
  0 siblings, 0 replies; 5+ messages in thread
From: Andreas Färber @ 2012-08-19 13:17 UTC (permalink / raw)
  To: Jim Meyering; +Cc: Jim Meyering, Peter Maydell, Riku Voipio, qemu-devel

Am 17.08.2012 20:24, schrieb Jim Meyering:
> From: Jim Meyering <meyering@redhat.com>
> 
> Convert each TAB(width-4) to equivalent spaces.
> Put braces around each one-line if-body.
> 
> Signed-off-by: Jim Meyering <meyering@redhat.com>

Reviewed-by: Andreas Färber <afaerber@suse.de>

Thanks,
Andreas

P.S. CC'ing linux-user folks.

-- 
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg, Germany
GF: Jeff Hawn, Jennifer Guild, Felix Imendörffer; HRB 16746 AG Nürnberg

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [Qemu-devel] [PATCH for-1.2? v4 2/2] envlist.c: handle strdup failure
  2012-08-17 18:24 ` [Qemu-devel] [PATCHv4 2/2] envlist.c: handle strdup failure Jim Meyering
@ 2012-08-19 13:21   ` Andreas Färber
  0 siblings, 0 replies; 5+ messages in thread
From: Andreas Färber @ 2012-08-19 13:21 UTC (permalink / raw)
  To: Jim Meyering; +Cc: Jim Meyering, Peter Maydell, Riku Voipio, qemu-devel

Am 17.08.2012 20:24, schrieb Jim Meyering:
> From: Jim Meyering <meyering@redhat.com>
> 
> Without this, envlist_to_environ may silently fail to copy all
> strings into the destination buffer, and both callers would leak
> any env strings allocated after a failing strdup, because the
> freeing code stops at the first NULL pointer.
> 
> Signed-off-by: Jim Meyering <meyering@redhat.com>
> ---
>  envlist.c | 12 ++++++++++--
>  1 file changed, 10 insertions(+), 2 deletions(-)
> 
> diff --git a/envlist.c b/envlist.c
> index 230596f..cf3f2d8 100644
> --- a/envlist.c
> +++ b/envlist.c
> @@ -245,8 +245,16 @@ envlist_to_environ(const envlist_t *envlist, size_t *count)
>      }
> 
>      for (entry = envlist->el_entries.lh_first; entry != NULL;
> -         entry = entry->ev_link.le_next) {
> -        *(penv++) = strdup(entry->ev_var);
> +         entry = entry->ev_link.le_next, penv++) {
> +        *penv = strdup(entry->ev_var);
> +        if (*penv == NULL) {
> +            char **e = env;
> +            while (e <= penv) {
> +                free(*e++);
> +            }
> +            free(env);
> +            return NULL;
> +        }
>      }
>      *penv = NULL; /* NULL terminate the list */
> 

Acked-by: Andreas Färber <afaerber@suse.de>

Andreas

-- 
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg, Germany
GF: Jeff Hawn, Jennifer Guild, Felix Imendörffer; HRB 16746 AG Nürnberg

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2012-08-19 13:21 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-08-17 18:24 [Qemu-devel] [PATCHv4 0/2] envlist.c: handle strdup failure Jim Meyering
2012-08-17 18:24 ` [Qemu-devel] [PATCHv4 1/2] envlist.c: conform to QEMU's coding style Jim Meyering
2012-08-19 13:17   ` [Qemu-devel] [PATCH for-1.2? v4 " Andreas Färber
2012-08-17 18:24 ` [Qemu-devel] [PATCHv4 2/2] envlist.c: handle strdup failure Jim Meyering
2012-08-19 13:21   ` [Qemu-devel] [PATCH for-1.2? v4 " Andreas Färber

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).