blob: Avoid direct access to blob IDs.
authorAndre Noll <maan@tuebingen.mpg.de>
Wed, 5 Sep 2018 10:13:35 +0000 (12:13 +0200)
committerAndre Noll <maan@tuebingen.mpg.de>
Wed, 10 Oct 2018 20:37:53 +0000 (22:37 +0200)
Some places of blob.c use read_u32() to get the blob ID from the
osl object while others directly access the mapped memory through
a uint32_t pointer. Besides alignment issues, this causes trouble
on big endian machines. Make sure we always use the primitives from
portable_io.h.

blob.c

diff --git a/blob.c b/blob.c
index e10b522..4ecbc45 100644 (file)
--- a/blob.c
+++ b/blob.c
@@ -103,7 +103,7 @@ static int print_blob(struct osl_table *table, struct osl_row *row,
                para_printf(&aca->pbout, "cannot list %s\n", name);
                return ret;
        }
-       id = *(uint32_t *)obj.data;
+       id = read_u32(obj.data);
        para_printf(&aca->pbout, "%u\t%s\n", id, name);
        return 1;
 }
@@ -266,7 +266,8 @@ static int com_addblob_callback(__a_unused const struct lls_command * const cmd,
        struct osl_object objs[NUM_BLOB_COLUMNS];
        char *name = aca->query.data;
        size_t name_len = strlen(name) + 1;
-       uint32_t id;
+       uint32_t id = (uint32_t)-1; /* STFU, gcc */
+       char id_buf[sizeof(id)];
        unsigned num_rows;
        int ret;
 
@@ -274,10 +275,15 @@ static int com_addblob_callback(__a_unused const struct lls_command * const cmd,
        if (ret < 0)
                goto out;
        if (!num_rows) { /* this is the first entry ever added */
-               /* insert dummy row containing the id */
-               id = 2; /* this entry will be entry #1, so 2 is the next */
-               objs[BLOBCOL_ID].data = &id;
-               objs[BLOBCOL_ID].size = sizeof(id);
+               /*
+                * Insert dummy row containing the next free ID. Since we are
+                * about to insert the first blob with ID 1, the next free ID
+                * will be 2.
+                */
+               id = 2U;
+               write_u32(id_buf, id);
+               objs[BLOBCOL_ID].data = id_buf;
+               objs[BLOBCOL_ID].size = sizeof(id_buf);
                objs[BLOBCOL_NAME].data = "";
                objs[BLOBCOL_NAME].size = 1;
                objs[BLOBCOL_DEF].data = "";
@@ -296,7 +302,7 @@ static int com_addblob_callback(__a_unused const struct lls_command * const cmd,
                        ret = osl(osl_get_object(table, row, BLOBCOL_ID, &obj));
                        if (ret < 0)
                                goto out;
-                       id = *(uint32_t *)obj.data;
+                       id = read_u32(obj.data);
                        obj.data = name + name_len;
                        obj.size = aca->query.size - name_len;
                        ret = osl(osl_update_object(table, row, BLOBCOL_DEF, &obj));
@@ -311,15 +317,17 @@ static int com_addblob_callback(__a_unused const struct lls_command * const cmd,
                ret = osl(osl_get_object(table, row, BLOBCOL_ID, &obj));
                if (ret < 0)
                        goto out;
-               id = *(uint32_t *)obj.data + 1;
-               obj.data = &id;
+               id = read_u32(obj.data) + 1;
+               write_u32(id_buf, id);
+               obj.data = &id_buf;
                ret = osl(osl_update_object(table, row, BLOBCOL_ID, &obj));
                if (ret < 0)
                        goto out;
        }
        id--;
-       objs[BLOBCOL_ID].data = &id;
-       objs[BLOBCOL_ID].size = sizeof(id);
+       write_u32(id_buf, id);
+       objs[BLOBCOL_ID].data = &id_buf;
+       objs[BLOBCOL_ID].size = sizeof(id_buf);
        objs[BLOBCOL_NAME].data = name;
        objs[BLOBCOL_NAME].size = name_len;
        objs[BLOBCOL_DEF].data = name + name_len;