Jim Meyering wrote:
> Jeff Garzik wrote:
>
>> On 09/23/2010 03:19 PM, Jeff Garzik wrote:
>>> 3) I process patches similar to how Linus and others in the kernel do
>>> it: "git am /path/to/mbox_of_patches" That tends to impose some
>>> restrictions on the contents of each email.
>>
>> FWIW, 'git pull' submissions are welcome.  Standard kernel-style pull
>> submission style applies[1].
>>
>>      Jeff
>>
>> [1] public git pull URL including branch name, diffstat, shortlog or
>> full log of changeset summaries, and finally, the combined diff of all
>> changes.
>
> Here you go.
> You can pull from the "oom" branch here:
>   git://git.infradead.org/users/meyering/tabled.git
>
> I think I've addressed all of your preferences, merging
> most OOM fixes into one commit, but not the two you mentioned
> that should stay separate.  I also left the sizeof(s) one separate.
>
> However, I did leave the copyright year updates in.
> If they're a problem, let me know and I'll do another round.
> Otherwise, I can send a patch to update all of the
> remaining ones to include 2010 so this won't be an
> issue for 3 more months.
>
> $ git shortlog HEAD ^origin/master
> Jim Meyering (4):
>       server/server.c: use sizeof(s) rather than equivalent "64"
>       don't dereference NULL on OOM
>       server/status.c: don't deref NULL on failed strdup
>       server/bucket.c: don't deref NULL upon failed malloc
>
>  b/server/bucket.c  |   25 ++++++++++++++++---------
>  b/server/config.c  |    7 +++++--
>  b/server/object.c  |    7 ++++++-
>  b/server/replica.c |    7 +++++--
>  b/server/server.c  |    2 +-
>  b/server/status.c  |    8 +++++---
>  server/server.c    |   13 +++++++++----
>  7 files changed, 47 insertions(+), 22 deletions(-)

That wasn't quite right.
Here's an updated patch, including e.g., this:

diff --git a/server/config.c b/server/config.c
index a58a0e6..9539cfd 100644
--- a/server/config.c
+++ b/server/config.c
@@ -436,7 +436,8 @@ void read_config(void)

        memset(&ctx, 0, sizeof(struct config_context));

-       if (!(tabled_srv.port = strdup("8080"))) {
+       tabled_srv.port = strdup("8080");
+       if (!tabled_srv.port) {
                applog(LOG_ERR, "no core");
                exit(1);
        }

==============================================================
diff --git a/server/bucket.c b/server/bucket.c
index eb03e03..cf42d2d 100644
--- a/server/bucket.c
+++ b/server/bucket.c
@@ -1,6 +1,6 @@

 /*
- * Copyright 2008-2009 Red Hat, Inc.
+ * Copyright 2008-2010 Red Hat, Inc.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -788,29 +788,36 @@ static GList *bucket_list_pfx(GList *content, GHashTable 
*common_pfx,
        s = malloc(cpfx_len);
        p = s;

+#define append_const(buf, c) \
+  do { memcpy(buf, c, sizeof(c)-1); (buf) += sizeof(c)-1; } while (0)
+
        tmpl = pfx_list;
        while (tmpl) {
                prefix = (char *) tmpl->data;
                pfx_len = strlen(prefix);

-               memcpy(p, optag, sizeof(optag)-1);  p += sizeof(optag)-1;
-               memcpy(p, pfoptag, sizeof(pfoptag)-1);  p += sizeof(pfoptag)-1;
-               memcpy(p, prefix, pfx_len);  p += pfx_len;
-               memcpy(p, delim, delim_len);  p += delim_len;
-               memcpy(p, pfedtag, sizeof(pfedtag)-1);  p += sizeof(pfedtag)-1;
-               memcpy(p, edtag, sizeof(edtag)-1);  p += sizeof(edtag)-1;
+               if (p) {
+                       append_const(p, optag);
+                       append_const(p, pfoptag);
+                       memcpy(p, prefix, pfx_len);  p += pfx_len;
+                       memcpy(p, delim, delim_len);  p += delim_len;
+                       append_const(p, pfedtag);
+                       append_const(p, edtag);
+               }

                free(prefix);

                tmpl = tmpl->next;
        }
-       *p = 0;
+       if (p)
+               *p = 0;

        free(delim);
        g_list_free(pfx_list);

-       return g_list_append(content, s);
+       return s ? g_list_append(content, s) : content;
 }
+#undef append_const

 struct bucket_list_info {
        char *prefix;
diff --git a/server/config.c b/server/config.c
index f94886e..dad6579 100644
--- a/server/config.c
+++ b/server/config.c
@@ -1,6 +1,6 @@

 /*
- * Copyright 2009 Red Hat, Inc.
+ * Copyright 2009, 2010 Red Hat, Inc.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -437,6 +437,10 @@ void read_config(void)
        memset(&ctx, 0, sizeof(struct config_context));

        tabled_srv.port = strdup("8080");
+       if (!tabled_srv.port) {
+               applog(LOG_ERR, "no core");
+               exit(1);
+       }

        if (!g_file_get_contents(tabled_srv.config, &text, &len, NULL)) {
                applog(LOG_ERR, "failed to read config file %s",
diff --git a/server/object.c b/server/object.c
index 3801e94..1f2f68f 100644
--- a/server/object.c
+++ b/server/object.c
@@ -1,6 +1,6 @@

 /*
- * Copyright 2008-2009 Red Hat, Inc.
+ * Copyright 2008-2010 Red Hat, Inc.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -801,6 +801,11 @@ static bool object_put_body(struct client *cli, const char 
*user,
        cli->out_objid = objid;
        cli->out_user = strdup(user);

+       if (!cli->out_bucket || !cli->out_key || !cli->out_user) {
+               applog(LOG_ERR, "OOM in object_put_body");
+               return cli_err(cli, InternalError);
+       }
+
        /* handle Expect: 100-continue header, by unconditionally
         * requesting that they continue.
         */
diff --git a/server/replica.c b/server/replica.c
index 1b5e832..7c31112 100644
--- a/server/replica.c
+++ b/server/replica.c
@@ -1,6 +1,6 @@

 /*
- * Copyright 2009 Red Hat, Inc.
+ * Copyright 2009-2010 Red Hat, Inc.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -541,7 +541,10 @@ static int rep_scan_parse(struct cursor *cp, struct 
db_obj_ent *obj)
        }
        obj_koff = obj->n_str * sizeof(uint16_t);

-       okey = malloc(64 + obj_klen);
+       if (!(okey = malloc(64 + obj_klen))) {
+               applog(LOG_ERR, "rep_scan_parse: no core %d", 64+obj_klen);
+               return -1;
+       }

        memcpy(okey->bucket, obj->bucket, 64);
        memcpy(okey->key, (char *)(obj+1) + obj_koff, obj_klen);
diff --git a/server/server.c b/server/server.c
index 3398026..044ff51 100644
--- a/server/server.c
+++ b/server/server.c
@@ -306,7 +306,8 @@ static char *pathtokey(const char *path)
                return NULL;
        klen = end - path;

-       key = malloc(klen + 1);
+       if ((key = malloc(klen + 1)) == NULL)
+               return NULL;
        memcpy(key, path, klen);
        key[klen] = 0;

@@ -356,13 +357,16 @@ static int authcheck(struct http_req *req, char 
*extra_bucket,
                if (rc != DB_NOTFOUND) {
                        char s[64];

-                       snprintf(s, 64, "get user '%s'", user);
+                       snprintf(s, sizeof(s), "get user '%s'", user);
                        tdbrep.tdb.passwd->err(tdbrep.tdb.passwd, rc, s);
                }
        } else {
                pass = val.data;
        }

+       if (!pass)
+               goto err_cmp;
+
        hreq_sign(req, extra_bucket, pass, b64sig);
        free(pass);

@@ -996,7 +1000,8 @@ static bool cli_evt_http_req(struct client *cli, unsigned 
int events)
        if (debugging)
                applog(LOG_INFO,
                       "%s: method %s, path '%s', key '%s', bucket '%s'",
-                      cli->addr_host, method, path, key, bucket);
+                      cli->addr_host, method, path ? path : "<NULL>",
+                      key, bucket);

        if (auth) {
                err = authcheck(&cli->req, buck_in_path? NULL: bucket, auth,
diff --git a/server/status.c b/server/status.c
index e9fbb38..7d4cc9a 100644
--- a/server/status.c
+++ b/server/status.c
@@ -1,6 +1,6 @@

 /*
- * Copyright 2008-2009 Red Hat, Inc.
+ * Copyright 2008-2010 Red Hat, Inc.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -158,13 +158,14 @@ bool stat_evt_http_req(struct client *cli, unsigned int 
events)
        char *path = NULL;
        // int rc;
        bool rcb;
+       char *root = (char *) "/";

        /* grab useful headers */
        // content_len_str = hreq_hdr(req, "content-length");

        path = strdup(req->uri.path);
        if (!path)
-               path = strdup("/");
+               path = root;

        if (debugging)
                applog(LOG_INFO, "%s: status method %s, path '%s'",
@@ -195,6 +196,7 @@ bool stat_evt_http_req(struct client *cli, unsigned int 
events)
                rcb = stat_err(cli, InvalidArgument);
        }

-       free(path);
+       if (path != root);
+               free(path);
        return rcb;
 }
--
To unsubscribe from this list: send the line "unsubscribe hail-devel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to